1 line
9.1 KiB
XML
1 line
9.1 KiB
XML
{"version":3,"file":"collectionFetcher-Bc_5r3B7.chunk.mjs","sources":["../src/services/collectionFetcher.ts"],"sourcesContent":["/* eslint-disable @stylistic/no-tabs */\n/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { File, Folder } from '@nextcloud/files'\nimport type { FileStat, ResponseDataDetailed, StatOptions, WebDAVClient } from 'webdav'\n\nimport { resultToNode } from '@nextcloud/files/dav'\nimport { t } from '@nextcloud/l10n'\nimport moment from '@nextcloud/moment'\nimport { davClient } from './DavClient.ts'\nimport logger from './logger.js'\n\nexport type Collection = Folder & {\n\tattributes: {\n\t\tnbItems: number // The number of item in the collection.\n\t\t'last-photo': number // The file id for the cover of the collection.\n\t}\n}\n\nexport type RawCollection = FileStat & {\n\tprops: {\n\t\tcollaborators: '' | { collaborator: object[] | object } | object[]\n\t\tdateRange: string\n\t}\n}\n\n/**\n *\n * @param extraProps\n */\nfunction getCollectionDavRequest(extraProps: string[] = []): string {\n\treturn `<?xml version=\"1.0\"?>\n\t\t\t<d:propfind xmlns:d=\"DAV:\"\n\t\t\t\txmlns:oc=\"http://owncloud.org/ns\"\n\t\t\t\txmlns:nc=\"http://nextcloud.org/ns\"\n\t\t\t\txmlns:ocs=\"http://open-collaboration-services.org/ns\">\n\t\t\t\t<d:prop>\n\t\t\t\t\t<nc:last-photo />\n\t\t\t\t\t<nc:nbItems />\n\t\t\t\t\t${extraProps.join('')}\n\t\t\t\t</d:prop>\n\t\t\t</d:propfind>`\n}\n\n/**\n *\n * @param extraProps\n */\nfunction getCollectionFilesDavRequest(extraProps: string[] = []): string {\n\treturn `<?xml version=\"1.0\"?>\n\t\t\t<d:propfind xmlns:d=\"DAV:\"\n\t\t\t\txmlns:oc=\"http://owncloud.org/ns\"\n\t\t\t\txmlns:nc=\"http://nextcloud.org/ns\"\n\t\t\t\txmlns:ocs=\"http://open-collaboration-services.org/ns\">\n\t\t\t\t<d:prop>\n\t\t\t\t\t<d:getcontentlength />\n\t\t\t\t\t<d:getcontenttype />\n\t\t\t\t\t<d:getetag />\n\t\t\t\t\t<d:getlastmodified />\n\t\t\t\t\t<d:resourcetype />\n\t\t\t\t\t<nc:metadata-photos-size />\n\t\t\t\t\t<nc:metadata-photos-original_date_time />\n\t\t\t\t\t<nc:metadata-files-live-photo />\n\t\t\t\t\t<nc:has-preview />\n\t\t\t\t\t<nc:hidden />\n\t\t\t\t\t<oc:favorite />\n\t\t\t\t\t<oc:fileid />\n\t\t\t\t\t<oc:permissions />\n\t\t\t\t\t${extraProps.join('\\n\t\t\t\t\t')}\n\t\t\t\t</d:prop>\n\t\t\t</d:propfind>`\n}\n\n/**\n *\n * @param path\n * @param options\n * @param extraProps\n * @param client\n */\nexport async function fetchCollection(path: string, options: StatOptions, extraProps: string[] = [], client: WebDAVClient = davClient): Promise<Collection | null> {\n\ttry {\n\t\tconst response = await client.stat(path, {\n\t\t\tdata: getCollectionDavRequest(extraProps),\n\t\t\tdetails: true,\n\t\t\t...options,\n\t\t}) as ResponseDataDetailed<RawCollection>\n\n\t\tlogger.debug('[Collections] Fetched a collection: ', { data: response.data })\n\n\t\treturn formatCollection(response.data, path.split('/').slice(0, -1).join('/'))\n\t} catch (error) {\n\t\tif (error instanceof DOMException && error.code === error.ABORT_ERR) {\n\t\t\treturn null\n\t\t}\n\n\t\tthrow error\n\t}\n}\n\n/**\n *\n * @param path\n * @param options\n * @param extraProps\n * @param client\n */\nexport async function fetchCollections(path: string, options: StatOptions = {}, extraProps: string[] = [], client: WebDAVClient = davClient): Promise<Collection[]> {\n\ttry {\n\t\tconst response = await client.getDirectoryContents(path, {\n\t\t\tdata: getCollectionDavRequest(extraProps),\n\t\t\tdetails: true,\n\t\t\t...options,\n\t\t}) as ResponseDataDetailed<Array<RawCollection>>\n\n\t\tlogger.debug(`[Collections] Fetched ${response.data.length} collections: `, { data: response.data })\n\n\t\treturn response.data\n\t\t\t.filter((collection) => collection.filename !== path)\n\t\t\t.map((rawCollection) => formatCollection(rawCollection, path))\n\t} catch (error) {\n\t\tif (error instanceof DOMException && error.code === error.ABORT_ERR) {\n\t\t\treturn []\n\t\t}\n\n\t\tthrow error\n\t}\n}\n\n/**\n *\n * @param rawCollection\n * @param root\n */\nfunction formatCollection(rawCollection: RawCollection, root: string): Collection {\n\t// Ensure that we have a proper collaborators array.\n\tif (rawCollection.props.collaborators === undefined || rawCollection.props.collaborators === '') {\n\t\trawCollection.props.collaborators = []\n\t} else if (typeof rawCollection.props.collaborators.collaborator === 'object') {\n\t\tif (Array.isArray(rawCollection.props.collaborators.collaborator)) {\n\t\t\trawCollection.props.collaborators = rawCollection.props.collaborators.collaborator\n\t\t} else {\n\t\t\trawCollection.props.collaborators = [rawCollection.props.collaborators.collaborator]\n\t\t}\n\t}\n\n\t// Compute date range label.\n\tconst dateRange = JSON.parse(rawCollection.props.dateRange?.replace(/"/g, '\"') ?? '{}')\n\tif (dateRange.start === null) {\n\t\tdateRange.start = moment().unix()\n\t\tdateRange.end = moment().unix()\n\t}\n\tconst dateRangeFormatted = {\n\t\tstartDate: moment.unix(dateRange.start).format('MMMM YYYY'),\n\t\tendDate: moment.unix(dateRange.end).format('MMMM YYYY'),\n\t}\n\tif (dateRangeFormatted.startDate === dateRangeFormatted.endDate) {\n\t\trawCollection.props.date = dateRangeFormatted.startDate\n\t} else {\n\t\trawCollection.props.date = t('photos', '{startDate} to {endDate}', dateRangeFormatted)\n\t}\n\n\trawCollection.props.filters = JSON.parse((rawCollection.props.filters as string | null) ?? '{}')\n\n\treturn resultToNode(rawCollection, root) as Collection\n}\n\n/**\n *\n * @param path\n * @param options\n * @param extraProps\n * @param client\n */\nexport async function fetchCollectionFiles(path: string, options: StatOptions, extraProps: string[] = [], client: WebDAVClient = davClient): Promise<File[]> {\n\ttry {\n\t\tconst response = await client.getDirectoryContents(path, {\n\t\t\tdata: getCollectionFilesDavRequest(extraProps),\n\t\t\tdetails: true,\n\t\t\t...options,\n\t\t}) as ResponseDataDetailed<Array<FileStat>>\n\n\t\tconst filesRoot = path.split('/').slice(0, -1).join('/')\n\t\tconst fetchedFiles = response.data\n\t\t\t.map((file) => resultToNode(file, filesRoot) as File)\n\t\t\t.filter((file) => file.fileid !== undefined)\n\n\t\tlogger.debug(`[Collections] Fetched ${fetchedFiles.length} new files: `, { fetchedFiles })\n\n\t\treturn fetchedFiles\n\t} catch (error) {\n\t\tif (error instanceof DOMException && error.code === error.ABORT_ERR) {\n\t\t\treturn []\n\t\t}\n\n\t\tlogger.error('Error fetching collection files', { error })\n\t\tthrow error\n\t}\n}\n"],"names":["getCollectionDavRequest","extraProps","getCollectionFilesDavRequest","fetchCollection","path","options","client","davClient","response","logger","formatCollection","error","fetchCollections","collection","rawCollection","root","dateRange","moment","dateRangeFormatted","t","resultToNode","fetchCollectionFiles","filesRoot","fetchedFiles","file"],"mappings":"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"} |