From 2bc1c49206325ee235e27305d60582016edc8d93 Mon Sep 17 00:00:00 2001 From: Blackmamoth Date: Fri, 22 Aug 2025 13:13:48 +0530 Subject: [PATCH] feat(api): add is_trashed field in get files route --- api/pkg/handlers/files.go | 12 ++++++--- api/repository/synced_items.sql.go | 42 +++++++++++++++++------------- api/sqlc/queries/synced_items.sql | 2 ++ 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/api/pkg/handlers/files.go b/api/pkg/handlers/files.go index 147aaf6..ea6ccf7 100644 --- a/api/pkg/handlers/files.go +++ b/api/pkg/handlers/files.go @@ -36,6 +36,7 @@ type GetFilesValidation struct { Provider string `validate:"omitempty,oneof=google dropbox microsoft" json:"provider"` ParentFolder string `validate:"omitempty" json:"parent_folder"` Search string `validate:"omitempty" json:"search"` + IsTrashed bool `validate:"omitempty" json:"is_trashed"` SortOn string `validate:"omitempty" json:"sort_on"` SortBy string `validate:"omitempty" json:"sort_by"` Limit int32 `validate:"omitempty" json:"limit"` @@ -205,6 +206,7 @@ func (h *FilesHandler) getFiles(w http.ResponseWriter, r *http.Request) { UserID: userID, ParentFolder: db.PGTextField(payload.ParentFolder), Provider: repository.ProviderEnum(payload.Provider), + IsTrashed: db.PGBool(payload.IsTrashed), SortOn: payload.SortOn, SortBy: payload.SortBy, Search: payload.Search, @@ -226,10 +228,12 @@ func (h *FilesHandler) getFiles(w http.ResponseWriter, r *http.Request) { totalFileCount, err := queries.CountFilesWithFilters( r.Context(), repository.CountFilesWithFiltersParams{ - UserID: userID, - ParentFolder: db.PGTextField(payload.ParentFolder), - Provider: repository.ProviderEnum(payload.Provider), - Search: payload.Search, + UserID: userID, + ParentFolder: db.PGTextField(payload.ParentFolder), + Provider: repository.ProviderEnum(payload.Provider), + Search: payload.Search, + IsTrashed: db.PGBool(payload.IsTrashed), + ProviderFileIds: providerFileIDs, }, ) if err != nil { diff --git a/api/repository/synced_items.sql.go b/api/repository/synced_items.sql.go index 019f756..ee99bf0 100644 --- a/api/repository/synced_items.sql.go +++ b/api/repository/synced_items.sql.go @@ -40,20 +40,22 @@ FROM synced_items JOIN linked_account ON linked_account.id = synced_items.account_id WHERE linked_account.user_id = $1 - AND (NULLIF($2, '') IS NULL OR synced_items.parent_folder = $2) - AND (NULLIF($3, '') IS NULL OR linked_account.provider = $3::provider_enum) - AND (NULLIF($4, '') IS NULL OR synced_items.name ILIKE '%' || $4::TEXT || '%') + AND is_trashed = $2 + AND (NULLIF($3, '') IS NULL OR synced_items.parent_folder = $3) + AND (NULLIF($4, '') IS NULL OR linked_account.provider = $4::provider_enum) + AND (NULLIF($5, '') IS NULL OR synced_items.name ILIKE '%' || $5::TEXT || '%') AND ( CASE - WHEN $5::TEXT[] IS NULL OR COALESCE(array_length($5::TEXT[], 1), 0) = 0 - THEN (NULLIF($4, '') IS NULL OR synced_items.name ILIKE '%' || $4::TEXT || '%') - ELSE synced_items.provider_file_id = ANY($5::TEXT[]) + WHEN $6::TEXT[] IS NULL OR COALESCE(array_length($6::TEXT[], 1), 0) = 0 + THEN (NULLIF($5, '') IS NULL OR synced_items.name ILIKE '%' || $5::TEXT || '%') + ELSE synced_items.provider_file_id = ANY($6::TEXT[]) END ) ` type CountFilesWithFiltersParams struct { UserID string `json:"user_id"` + IsTrashed pgtype.Bool `json:"is_trashed"` ParentFolder interface{} `json:"parent_folder"` Provider interface{} `json:"provider"` Search interface{} `json:"search"` @@ -63,6 +65,7 @@ type CountFilesWithFiltersParams struct { func (q *Queries) CountFilesWithFilters(ctx context.Context, arg CountFilesWithFiltersParams) (int64, error) { row := q.db.QueryRow(ctx, countFilesWithFilters, arg.UserID, + arg.IsTrashed, arg.ParentFolder, arg.Provider, arg.Search, @@ -192,46 +195,48 @@ FROM synced_items JOIN linked_account ON linked_account.id = synced_items.account_id WHERE linked_account.user_id = $1 - AND (NULLIF($2, '') IS NULL OR synced_items.parent_folder = $2) - AND (NULLIF($3, '') IS NULL OR linked_account.provider = $3::provider_enum) + AND is_trashed = $2 + AND (NULLIF($3, '') IS NULL OR synced_items.parent_folder = $3) + AND (NULLIF($4, '') IS NULL OR linked_account.provider = $4::provider_enum) AND ( CASE - WHEN $4::TEXT[] IS NULL OR COALESCE(array_length($4::TEXT[], 1), 0) = 0 - THEN (NULLIF($5, '') IS NULL OR synced_items.name ILIKE '%' || $5::TEXT || '%') - ELSE synced_items.provider_file_id = ANY($4::TEXT[]) + WHEN $5::TEXT[] IS NULL OR COALESCE(array_length($5::TEXT[], 1), 0) = 0 + THEN (NULLIF($6, '') IS NULL OR synced_items.name ILIKE '%' || $6::TEXT || '%') + ELSE synced_items.provider_file_id = ANY($5::TEXT[]) END ) ORDER BY CASE - WHEN $6 = 'file_name' AND $7 = 'asc' THEN synced_items.name + WHEN $7 = 'file_name' AND $8 = 'asc' THEN synced_items.name ELSE NULL -- Explicitly return NULL when not sorting by this END ASC, CASE - WHEN $6 = 'file_name' AND $7 = 'desc' THEN synced_items.name + WHEN $7 = 'file_name' AND $8 = 'desc' THEN synced_items.name ELSE NULL END DESC, CASE - WHEN $6 = 'size' AND $7 = 'asc' THEN synced_items.size + WHEN $7 = 'size' AND $8 = 'asc' THEN synced_items.size ELSE NULL END ASC, CASE - WHEN $6 = 'size' AND $7 = 'desc' THEN synced_items.size + WHEN $7 = 'size' AND $8 = 'desc' THEN synced_items.size ELSE NULL END DESC, CASE - WHEN $6 = 'modified_time' AND $7 = 'asc' THEN synced_items.modified_time::TIMESTAMPTZ + WHEN $7 = 'modified_time' AND $8 = 'asc' THEN synced_items.modified_time::TIMESTAMPTZ ELSE NULL END ASC, CASE - WHEN $6 = 'modified_time' AND $7 = 'desc' THEN synced_items.modified_time::TIMESTAMPTZ + WHEN $7 = 'modified_time' AND $8 = 'desc' THEN synced_items.modified_time::TIMESTAMPTZ ELSE NULL END DESC, synced_items.modified_time DESC -LIMIT $9 OFFSET $8 +LIMIT $10 OFFSET $9 ` type GetSyncedItemsParams struct { UserID string `json:"user_id"` + IsTrashed pgtype.Bool `json:"is_trashed"` ParentFolder interface{} `json:"parent_folder"` Provider interface{} `json:"provider"` ProviderFileIds []string `json:"provider_file_ids"` @@ -260,6 +265,7 @@ type GetSyncedItemsRow struct { func (q *Queries) GetSyncedItems(ctx context.Context, arg GetSyncedItemsParams) ([]GetSyncedItemsRow, error) { rows, err := q.db.Query(ctx, getSyncedItems, arg.UserID, + arg.IsTrashed, arg.ParentFolder, arg.Provider, arg.ProviderFileIds, diff --git a/api/sqlc/queries/synced_items.sql b/api/sqlc/queries/synced_items.sql index e63d3d4..c1f1337 100644 --- a/api/sqlc/queries/synced_items.sql +++ b/api/sqlc/queries/synced_items.sql @@ -22,6 +22,7 @@ FROM synced_items JOIN linked_account ON linked_account.id = synced_items.account_id WHERE linked_account.user_id = @user_id + AND is_trashed = @is_trashed AND (NULLIF(@parent_folder, '') IS NULL OR synced_items.parent_folder = @parent_folder) AND (NULLIF(@provider, '') IS NULL OR linked_account.provider = @provider::provider_enum) AND ( @@ -65,6 +66,7 @@ FROM synced_items JOIN linked_account ON linked_account.id = synced_items.account_id WHERE linked_account.user_id = @user_id + AND is_trashed = @is_trashed AND (NULLIF(@parent_folder, '') IS NULL OR synced_items.parent_folder = @parent_folder) AND (NULLIF(@provider, '') IS NULL OR linked_account.provider = @provider::provider_enum) AND (NULLIF(@search, '') IS NULL OR synced_items.name ILIKE '%' || @search::TEXT || '%')