UNPKG

@lucidcms/core

Version:

The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.

1 lines 18.6 kB
{"version":3,"file":"media-folders.mjs","names":["queryBuilder"],"sources":["../../../src/libs/repositories/media-folders.ts"],"sourcesContent":["import z from \"zod\";\nimport type DatabaseAdapter from \"../db/adapter-base.js\";\nimport queryBuilder from \"../db/query-builder/index.js\";\nimport type { KyselyDB } from \"../db/types.js\";\nimport StaticRepository from \"./parents/static-repository.js\";\nimport type { QueryProps } from \"./types.js\";\n\nexport default class MediaFoldersRepository extends StaticRepository<\"lucid_media_folders\"> {\n\tconstructor(db: KyselyDB, dbAdapter: DatabaseAdapter) {\n\t\tsuper(db, dbAdapter, \"lucid_media_folders\");\n\t}\n\ttableSchema = z.object({\n\t\tid: z.number(),\n\t\ttitle: z.string(),\n\t\ttenant_key: z.string().nullable(),\n\t\tparent_folder_id: z.number().nullable(),\n\t\tfolder_count: z.number().nullable().optional(),\n\t\tmedia_count: z.number().nullable().optional(),\n\t\tcreated_by: z.number().nullable(),\n\t\tupdated_by: z.number().nullable(),\n\t\tcreated_at: z.union([z.string(), z.date()]).nullable(),\n\t\tupdated_at: z.union([z.string(), z.date()]).nullable(),\n\t});\n\tcolumnFormats = {\n\t\tid: this.dbAdapter.getDataType(\"primary\"),\n\t\ttitle: this.dbAdapter.getDataType(\"text\"),\n\t\ttenant_key: this.dbAdapter.getDataType(\"text\"),\n\t\tparent_folder_id: this.dbAdapter.getDataType(\"integer\"),\n\t\tcreated_by: this.dbAdapter.getDataType(\"integer\"),\n\t\tupdated_by: this.dbAdapter.getDataType(\"integer\"),\n\t\tcreated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tupdated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t};\n\tqueryConfig = {\n\t\ttableKeys: {\n\t\t\tfilters: {\n\t\t\t\ttitle: \"title\",\n\t\t\t\tparentFolderId: \"parent_folder_id\",\n\t\t\t\tcreatedBy: \"created_by\",\n\t\t\t},\n\t\t\tsorts: {\n\t\t\t\ttitle: \"title\",\n\t\t\t\tcreatedAt: \"created_at\",\n\t\t\t\tupdatedAt: \"updated_at\",\n\t\t\t},\n\t\t},\n\t} as const;\n\n\t// ----------------------------------------\n\t// queries\n\tasync selectSingleById<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tid: number;\n\t\t\t\ttenantKey?: string | null;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst query = this.db\n\t\t\t.selectFrom(\"lucid_media_folders\")\n\t\t\t.select([\"id\", \"tenant_key\"])\n\t\t\t.where(\"id\", \"=\", props.id)\n\t\t\t.$call((qb) =>\n\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\tcolumn: \"lucid_media_folders.tenant_key\",\n\t\t\t\t}),\n\t\t\t);\n\n\t\tconst exec = await this.executeQuery(() => query.executeTakeFirst(), {\n\t\t\tmethod: \"selectSingleById\",\n\t\t});\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\t...props.validation,\n\t\t\tmode: \"single\",\n\t\t\tselect: [\"id\", \"tenant_key\"],\n\t\t});\n\t}\n\n\tasync selectMultipleForHierarchy<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\ttenantKey?: string | null;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst query = this.db\n\t\t\t.selectFrom(\"lucid_media_folders\")\n\t\t\t.select([\n\t\t\t\t\"id\",\n\t\t\t\t\"title\",\n\t\t\t\t\"parent_folder_id\",\n\t\t\t\t\"created_by\",\n\t\t\t\t\"updated_by\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"updated_at\",\n\t\t\t])\n\t\t\t.$call((qb) =>\n\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\tcolumn: \"lucid_media_folders.tenant_key\",\n\t\t\t\t}),\n\t\t\t);\n\n\t\tconst exec = await this.executeQuery(() => query.execute(), {\n\t\t\tmethod: \"selectMultipleForHierarchy\",\n\t\t});\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\t...props.validation,\n\t\t\tmode: \"multiple\",\n\t\t\tselect: [\n\t\t\t\t\"id\",\n\t\t\t\t\"title\",\n\t\t\t\t\"parent_folder_id\",\n\t\t\t\t\"created_by\",\n\t\t\t\t\"updated_by\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"updated_at\",\n\t\t\t],\n\t\t});\n\t}\n\n\tasync selectMultipleWithCounts<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tqueryParams: Record<string, unknown>;\n\t\t\t\ttenantKey?: string | null;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst exec = await this.executeQuery(\n\t\t\tasync () => {\n\t\t\t\tconst mainQuery = this.db\n\t\t\t\t\t.selectFrom(\"lucid_media_folders\")\n\t\t\t\t\t.select((eb) => [\n\t\t\t\t\t\t\"lucid_media_folders.id\",\n\t\t\t\t\t\t\"lucid_media_folders.title\",\n\t\t\t\t\t\t\"lucid_media_folders.parent_folder_id\",\n\t\t\t\t\t\t\"lucid_media_folders.created_by\",\n\t\t\t\t\t\t\"lucid_media_folders.updated_by\",\n\t\t\t\t\t\t\"lucid_media_folders.created_at\",\n\t\t\t\t\t\t\"lucid_media_folders.updated_at\",\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media_folders as children\")\n\t\t\t\t\t\t\t.select(({ fn }) =>\n\t\t\t\t\t\t\t\tfn.count<number>(\"children.id\").as(\"folder_count\"),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\"children.parent_folder_id\",\n\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\"lucid_media_folders.id\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.$call((qb) =>\n\t\t\t\t\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\t\t\t\t\tcolumn: \"children.tenant_key\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.as(\"folder_count\"),\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media\")\n\t\t\t\t\t\t\t.select(({ fn }) =>\n\t\t\t\t\t\t\t\tfn.count<number>(\"lucid_media.id\").as(\"media_count\"),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.whereRef(\"lucid_media.folder_id\", \"=\", \"lucid_media_folders.id\")\n\t\t\t\t\t\t\t.$call((qb) =>\n\t\t\t\t\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\t\t\t\t\tcolumn: \"lucid_media.tenant_key\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\"lucid_media.is_hidden\",\n\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\tthis.dbAdapter.getDefault(\"boolean\", \"false\"),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.as(\"media_count\"),\n\t\t\t\t\t])\n\t\t\t\t\t.$call((qb) =>\n\t\t\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\t\t\tcolumn: \"lucid_media_folders.tenant_key\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\tconst countQuery = this.db\n\t\t\t\t\t.selectFrom(\"lucid_media_folders\")\n\t\t\t\t\t.select(({ fn }) =>\n\t\t\t\t\t\tfn.count<number>(\"lucid_media_folders.id\").as(\"count\"),\n\t\t\t\t\t)\n\t\t\t\t\t.$call((qb) =>\n\t\t\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\t\t\tcolumn: \"lucid_media_folders.tenant_key\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\tconst { main, count } = queryBuilder.main(\n\t\t\t\t\t{\n\t\t\t\t\t\tmain: mainQuery,\n\t\t\t\t\t\tcount: countQuery,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tqueryParams: props.queryParams,\n\t\t\t\t\t\tdatabase: this.dbAdapter.config,\n\t\t\t\t\t\tmeta: this.queryConfig,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst [mainResult, countResult] = await Promise.all([\n\t\t\t\t\tmain.execute(),\n\t\t\t\t\tcount?.executeTakeFirst() as Promise<{ count: string } | undefined>,\n\t\t\t\t]);\n\n\t\t\t\treturn [mainResult, countResult] as const;\n\t\t\t},\n\t\t\t{ method: \"selectMultipleWithCounts\" },\n\t\t);\n\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\t...props.validation,\n\t\t\tmode: \"multiple-count\",\n\t\t\tselect: [\n\t\t\t\t\"id\",\n\t\t\t\t\"title\",\n\t\t\t\t\"parent_folder_id\",\n\t\t\t\t\"created_by\",\n\t\t\t\t\"updated_by\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"updated_at\",\n\t\t\t\t\"folder_count\",\n\t\t\t\t\"media_count\",\n\t\t\t],\n\t\t});\n\t}\n\t/**\n\t * Returns descendant folder IDs in the requested tenant context.\n\t * Destructive flows use owner scope so visible global folders are not treated as tenant-owned.\n\t */\n\tasync getDescendantIds(props: {\n\t\tfolderIds: number[];\n\t\ttenantKey?: string | null;\n\t\tscope?: \"read\" | \"owner\";\n\t}) {\n\t\tconst tenantKey = props.tenantKey ?? null;\n\t\tconst scope = props.scope ?? \"read\";\n\t\tconst query = this.db\n\t\t\t.withRecursive(\"desc_folders\", (db) =>\n\t\t\t\tdb\n\t\t\t\t\t.selectFrom(\"lucid_media_folders\")\n\t\t\t\t\t.select([\"id\", \"parent_folder_id\"])\n\t\t\t\t\t.where(\"id\", \"in\", props.folderIds)\n\t\t\t\t\t.$call((qb) =>\n\t\t\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\t\t\tcolumn: \"tenant_key\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\t.$if(scope === \"owner\" && tenantKey !== null, (qb) =>\n\t\t\t\t\t\tqb.where(\"tenant_key\", \"=\", tenantKey),\n\t\t\t\t\t)\n\t\t\t\t\t.unionAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media_folders\")\n\t\t\t\t\t\t\t.innerJoin(\n\t\t\t\t\t\t\t\t\"desc_folders\",\n\t\t\t\t\t\t\t\t\"desc_folders.id\",\n\t\t\t\t\t\t\t\t\"lucid_media_folders.parent_folder_id\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"lucid_media_folders.id\",\n\t\t\t\t\t\t\t\t\"lucid_media_folders.parent_folder_id\",\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t.$call((qb) =>\n\t\t\t\t\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\t\t\t\t\tcolumn: \"lucid_media_folders.tenant_key\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.$if(scope === \"owner\" && tenantKey !== null, (qb) =>\n\t\t\t\t\t\t\t\tqb.where(\"lucid_media_folders.tenant_key\", \"=\", tenantKey),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t)\n\t\t\t.selectFrom(\"desc_folders\")\n\t\t\t.select([\"id\"])\n\t\t\t.groupBy([\"id\"]);\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.execute() as Promise<{ id: number }[]>,\n\t\t\t{ method: \"getDescendantIds\" },\n\t\t);\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\tenabled: true,\n\t\t\tmode: \"multiple\",\n\t\t\tselect: [\"id\"],\n\t\t});\n\t}\n\tasync checkCircularParents(props: {\n\t\tfolderId: number;\n\t\tparentFolderId: number;\n\t\ttenantKey?: string | null;\n\t}) {\n\t\tconst query = this.db\n\t\t\t.withRecursive(\"ancestors\", (db) =>\n\t\t\t\tdb\n\t\t\t\t\t.selectFrom(\"lucid_media_folders\")\n\t\t\t\t\t.select([\"id as current_id\", \"parent_folder_id as parent_id\"])\n\t\t\t\t\t.where(\"id\", \"=\", props.parentFolderId)\n\t\t\t\t\t.$call((qb) =>\n\t\t\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\t\t\tcolumn: \"tenant_key\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\t.unionAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media_folders\")\n\t\t\t\t\t\t\t.innerJoin(\n\t\t\t\t\t\t\t\t\"ancestors\",\n\t\t\t\t\t\t\t\t\"ancestors.parent_id\",\n\t\t\t\t\t\t\t\t\"lucid_media_folders.id\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"lucid_media_folders.id as current_id\",\n\t\t\t\t\t\t\t\t\"lucid_media_folders.parent_folder_id as parent_id\",\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t.$call((qb) =>\n\t\t\t\t\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\t\t\t\t\tcolumn: \"lucid_media_folders.tenant_key\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t)\n\t\t\t.selectFrom(\"ancestors\")\n\t\t\t.select(\"parent_id\")\n\t\t\t.where(\"parent_id\", \"=\", props.folderId);\n\n\t\tconst exec = await this.executeQuery(() => query.executeTakeFirst(), {\n\t\t\tmethod: \"checkCircularParents\",\n\t\t});\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\tenabled: false,\n\t\t\tmode: \"single\",\n\t\t\tselect: [\"parent_id\"],\n\t\t});\n\t}\n\tasync getBreadcrumb(props: { folderId: number; tenantKey?: string | null }) {\n\t\tconst query = this.db\n\t\t\t.withRecursive(\"breadcrumb\", (db) =>\n\t\t\t\tdb\n\t\t\t\t\t.selectFrom(\"lucid_media_folders\")\n\t\t\t\t\t.select([\"id\", \"title\", \"parent_folder_id\"])\n\t\t\t\t\t.where(\"id\", \"=\", props.folderId)\n\t\t\t\t\t.$call((qb) =>\n\t\t\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\t\t\tcolumn: \"tenant_key\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\t.unionAll(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media_folders\")\n\t\t\t\t\t\t\t.innerJoin(\n\t\t\t\t\t\t\t\t\"breadcrumb\",\n\t\t\t\t\t\t\t\t\"breadcrumb.parent_folder_id\",\n\t\t\t\t\t\t\t\t\"lucid_media_folders.id\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"lucid_media_folders.id\",\n\t\t\t\t\t\t\t\t\"lucid_media_folders.title\",\n\t\t\t\t\t\t\t\t\"lucid_media_folders.parent_folder_id\",\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t.$call((qb) =>\n\t\t\t\t\t\t\t\tqueryBuilder.tenantScope(qb, {\n\t\t\t\t\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\t\t\t\t\tcolumn: \"lucid_media_folders.tenant_key\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t)\n\t\t\t.selectFrom(\"breadcrumb\")\n\t\t\t.select([\"id\", \"title\", \"parent_folder_id\"])\n\t\t\t.orderBy(\"parent_folder_id\", \"asc\");\n\n\t\tconst exec = await this.executeQuery(() => query.execute(), {\n\t\t\tmethod: \"getBreadcrumb\",\n\t\t});\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\tenabled: true,\n\t\t\tmode: \"multiple\",\n\t\t\tselect: [\"id\", \"title\", \"parent_folder_id\"],\n\t\t});\n\t}\n}\n"],"mappings":"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"}