{"version":3,"file":"folders.mjs","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {\n  Folder,\n  FolderNode,\n  CreateFolders,\n  GetFolder,\n  GetFolders,\n  GetFolderStructure,\n  BulkMoveFolders,\n} from '../../../../shared/contracts/folders';\n\nexport type FolderWithCounts = Omit<Folder, 'children' | 'files'> & {\n  children?: { count: number };\n  files?: { count: number };\n};\n\ninterface GetFoldersParams {\n  parentId?: number | null;\n}\n\ninterface BulkMoveParams {\n  fileIds?: number[];\n  folderIds?: number[];\n  destinationFolderId: number;\n}\n\ntype DataEnvelope<T> = {\n  data: T;\n};\n\nconst isDataEnvelope = <T>(response: T | DataEnvelope<T>): response is DataEnvelope<T> =>\n  typeof response === 'object' && response !== null && 'data' in response;\n\nconst unwrapData = <T>(response: T | DataEnvelope<T>): T =>\n  isDataEnvelope(response) ? response.data : response;\n\nconst foldersApi = uploadApi.injectEndpoints({\n  endpoints: (builder) => ({\n    getFolders: builder.query<Folder[], GetFoldersParams | void>({\n      query: (params = {}) => {\n        const { parentId } = params as GetFoldersParams;\n\n        const queryParams: Record<string, unknown> = {\n          // Match sidebar FolderTree order (server getStructure uses sortBy('name')).\n          sort: 'name:ASC',\n        };\n\n        if (parentId != null) {\n          queryParams['filters'] = {\n            $and: [{ parent: { id: parentId } }],\n          };\n        } else {\n          queryParams['filters'] = {\n            $and: [{ parent: { id: { $null: true } } }],\n          };\n        }\n\n        return {\n          url: '/upload/folders',\n          method: 'GET',\n          config: { params: queryParams },\n        };\n      },\n      transformResponse: (response: GetFolders.Response['data']) =>\n        unwrapData<GetFolders.Response['data']>(response),\n      providesTags: (results) => {\n        if (results) {\n          return [\n            ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n            { type: 'Folder', id: 'LIST' },\n          ];\n        }\n        return [{ type: 'Folder', id: 'LIST' }];\n      },\n    }),\n    createFolder: builder.mutation<CreateFolders.Response['data'], CreateFolders.Request['body']>({\n      query: (body) => ({\n        url: '/upload/folders',\n        method: 'POST',\n        data: body,\n      }),\n      transformResponse: (response: CreateFolders.Response) => response.data,\n      invalidatesTags: [\n        { type: 'Folder', id: 'LIST' },\n        { type: 'Folder', id: 'STRUCTURE' },\n      ],\n    }),\n    /**\n     * Hierarchical folder tree used by the FolderTree sidebar. Returned as a\n     * single nested array — the server walks the folders table once and\n     * assembles parent/child relationships.\n     *\n     * TODO: filter results like `admin-folder.find` for folder-scoped roles\n     * (v1 returns all folders; relies on global `plugin::upload.read`).\n     */\n    getFolderStructure: builder.query<FolderNode[], void>({\n      query: () => ({\n        url: '/upload/folder-structure',\n        method: 'GET',\n      }),\n      // TODO: align GetFolderStructure contract with the real /upload/folder-structure\n      // envelope and drop this defensive unwrap (data[] vs { data: [] }).\n      transformResponse: (response: GetFolderStructure.Response['data']) =>\n        ((response as unknown as { data: FolderNode[] })?.data ??\n          (response as unknown as FolderNode[]) ??\n          []) as FolderNode[],\n      providesTags: [{ type: 'Folder', id: 'STRUCTURE' }],\n    }),\n    /**\n     * Flat list of every folder, used to populate the \"Location\" select in the\n     * asset details drawer. No parent filter — we want the entire tree in one\n     * query so the select can render any destination folder.\n     */\n    getAllFolders: builder.query<Folder[], void>({\n      query: () => ({\n        url: '/upload/folders',\n        method: 'GET',\n      }),\n      transformResponse: (response: GetFolders.Response['data']) =>\n        unwrapData<GetFolders.Response['data']>(response ?? []),\n      providesTags: (results) => {\n        if (results) {\n          return [\n            ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n            { type: 'Folder' as const, id: 'LIST' },\n          ];\n        }\n        return [{ type: 'Folder' as const, id: 'LIST' }];\n      },\n    }),\n    getFolder: builder.query<FolderWithCounts, { id: number }>({\n      query: ({ id }) => ({\n        url: `/upload/folders/${id}`,\n        method: 'GET',\n        config: {\n          params: {\n            populate: {\n              parent: {\n                populate: {\n                  parent: '*',\n                },\n              },\n              children: { count: true },\n              files: { count: true },\n            },\n          },\n        },\n      }),\n      transformResponse: (response: GetFolder.Response) =>\n        response.data as unknown as FolderWithCounts,\n      providesTags: (_result, _error, { id }) => [{ type: 'Folder', id }],\n    }),\n    bulkMove: builder.mutation<BulkMoveFolders.Response['data'], BulkMoveParams>({\n      query: ({ fileIds = [], folderIds = [], destinationFolderId }) => ({\n        url: '/upload/actions/bulk-move',\n        method: 'POST',\n        data: { fileIds, folderIds, destinationFolderId },\n      }),\n      transformResponse: (response: BulkMoveFolders.Response) => response.data,\n      invalidatesTags: [\n        { type: 'Asset', id: 'LIST' },\n        { type: 'Folder', id: 'LIST' },\n        { type: 'Folder', id: 'STRUCTURE' },\n      ],\n    }),\n  }),\n});\n\nexport const {\n  useCreateFolderMutation,\n  useGetFoldersQuery,\n  useGetFolderQuery,\n  useGetAllFoldersQuery,\n  useGetFolderStructureQuery,\n  useBulkMoveMutation,\n} = foldersApi;\n"],"names":["isDataEnvelope","response","unwrapData","data","foldersApi","uploadApi","injectEndpoints","endpoints","builder","getFolders","query","params","parentId","queryParams","sort","$and","parent","id","$null","url","method","config","transformResponse","providesTags","results","map","type","createFolder","mutation","body","invalidatesTags","getFolderStructure","getAllFolders","getFolder","populate","children","count","files","_result","_error","bulkMove","fileIds","folderIds","destinationFolderId","useCreateFolderMutation","useGetFoldersQuery","useGetFolderQuery","useGetAllFoldersQuery","useGetFolderStructureQuery","useBulkMoveMutation"],"mappings":"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"}