UNPKG

@lucidcms/core

Version:

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

1 lines 61.2 kB
{"version":3,"file":"media.mjs","names":["queryBuilder"],"sources":["../../../src/libs/repositories/media.ts"],"sourcesContent":["import { sql } from \"kysely\";\nimport z from \"zod\";\nimport type { GetMultipleQueryParams } from \"../../schemas/media.js\";\nimport type DatabaseAdapter from \"../db/adapter-base.js\";\nimport queryBuilder from \"../db/query-builder/index.js\";\nimport type { KyselyDB } from \"../db/types.js\";\nimport { activeMediaCropSelect } from \"./helpers/media-selects.js\";\nimport StaticRepository from \"./parents/static-repository.js\";\nimport type { QueryProps } from \"./types.js\";\n\nexport default class MediaRepository extends StaticRepository<\"lucid_media\"> {\n\tconstructor(db: KyselyDB, dbAdapter: DatabaseAdapter) {\n\t\tsuper(db, dbAdapter, \"lucid_media\");\n\t}\n\ttableSchema = z.object({\n\t\tid: z.number(),\n\t\tkey: z.string(),\n\t\tfolder_id: z.number().nullable(),\n\t\tparent_media_id: z.number().nullable(),\n\t\trelation_type: z.enum([\"crop\", \"poster\"]).nullable(),\n\t\te_tag: z.string().nullable(),\n\t\torigin: z.enum([\"human\", \"ai_generated\", \"ai_modified\"]),\n\t\tai_generation_id: z.number().nullable(),\n\t\tpublic: z.union([\n\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t]),\n\t\ttype: z.string(),\n\t\tmime_type: z.string(),\n\t\tfile_extension: z.string(),\n\t\tfile_name: z.string().nullable(),\n\t\tfile_size: z.number(),\n\t\twidth: z.number().nullable(),\n\t\theight: z.number().nullable(),\n\t\tfocal_x: z.number().nullable(),\n\t\tfocal_y: z.number().nullable(),\n\t\tcrop_x: z.number().nullable(),\n\t\tcrop_y: z.number().nullable(),\n\t\tcrop_width: z.number().nullable(),\n\t\tcrop_height: z.number().nullable(),\n\t\tcrop_rotation: z.number().nullable(),\n\t\tcrop_skew_x: z.number().nullable(),\n\t\tcrop_skew_y: z.number().nullable(),\n\t\tblur_hash: z.string().nullable(),\n\t\taverage_color: z.string().nullable(),\n\t\tbase64: z.string().nullable().optional(),\n\t\tis_dark: z\n\t\t\t.union([\n\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t\t])\n\t\t\t.nullable(),\n\t\tis_light: z\n\t\t\t.union([\n\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t\t])\n\t\t\t.nullable(),\n\t\tis_hidden: z.union([\n\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t]),\n\t\ttranslations: z\n\t\t\t.array(\n\t\t\t\tz.object({\n\t\t\t\t\ttitle: z.string().nullable(),\n\t\t\t\t\talt: z.string().nullable(),\n\t\t\t\t\tdescription: z.string().nullable(),\n\t\t\t\t\tsummary: z.string().nullable(),\n\t\t\t\t\tlocale_code: z.string().nullable(),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.optional(),\n\t\tposter: z\n\t\t\t.array(\n\t\t\t\tz.object({\n\t\t\t\t\tid: z.number(),\n\t\t\t\t\tkey: z.string(),\n\t\t\t\t\torigin: z.enum([\"human\", \"ai_generated\", \"ai_modified\"]),\n\t\t\t\t\ttype: z.string(),\n\t\t\t\t\tmime_type: z.string(),\n\t\t\t\t\tfile_extension: z.string(),\n\t\t\t\t\tfile_name: z.string().nullable(),\n\t\t\t\t\tfile_size: z.number(),\n\t\t\t\t\twidth: z.number().nullable(),\n\t\t\t\t\theight: z.number().nullable(),\n\t\t\t\t\tfocal_x: z.number().nullable(),\n\t\t\t\t\tfocal_y: z.number().nullable(),\n\t\t\t\t\tcrop_x: z.number().nullable().optional(),\n\t\t\t\t\tcrop_y: z.number().nullable().optional(),\n\t\t\t\t\tcrop_width: z.number().nullable().optional(),\n\t\t\t\t\tcrop_height: z.number().nullable().optional(),\n\t\t\t\t\tcrop_rotation: z.number().nullable().optional(),\n\t\t\t\t\tcrop_skew_x: z.number().nullable().optional(),\n\t\t\t\t\tcrop_skew_y: z.number().nullable().optional(),\n\t\t\t\t\tblur_hash: z.string().nullable(),\n\t\t\t\t\taverage_color: z.string().nullable(),\n\t\t\t\t\tbase64: z.string().nullable().optional(),\n\t\t\t\t\tis_dark: z\n\t\t\t\t\t\t.union([\n\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t\t\t\t\t])\n\t\t\t\t\t\t.nullable(),\n\t\t\t\t\tis_light: z\n\t\t\t\t\t\t.union([\n\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t\t\t\t\t])\n\t\t\t\t\t\t.nullable(),\n\t\t\t\t\tcrop: z\n\t\t\t\t\t\t.array(\n\t\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\t\tid: z.number(),\n\t\t\t\t\t\t\t\tkey: z.string(),\n\t\t\t\t\t\t\t\torigin: z.enum([\"human\", \"ai_generated\", \"ai_modified\"]),\n\t\t\t\t\t\t\t\ttype: z.string(),\n\t\t\t\t\t\t\t\tmime_type: z.string(),\n\t\t\t\t\t\t\t\tfile_extension: z.string(),\n\t\t\t\t\t\t\t\tfile_name: z.string().nullable(),\n\t\t\t\t\t\t\t\tfile_size: z.number(),\n\t\t\t\t\t\t\t\twidth: z.number().nullable(),\n\t\t\t\t\t\t\t\theight: z.number().nullable(),\n\t\t\t\t\t\t\t\tfocal_x: z.number().nullable(),\n\t\t\t\t\t\t\t\tfocal_y: z.number().nullable(),\n\t\t\t\t\t\t\t\tcrop_x: z.number(),\n\t\t\t\t\t\t\t\tcrop_y: z.number(),\n\t\t\t\t\t\t\t\tcrop_width: z.number(),\n\t\t\t\t\t\t\t\tcrop_height: z.number(),\n\t\t\t\t\t\t\t\tcrop_rotation: z.number(),\n\t\t\t\t\t\t\t\tcrop_skew_x: z.number(),\n\t\t\t\t\t\t\t\tcrop_skew_y: z.number(),\n\t\t\t\t\t\t\t\tblur_hash: z.string().nullable(),\n\t\t\t\t\t\t\t\taverage_color: z.string().nullable(),\n\t\t\t\t\t\t\t\tbase64: z.string().nullable().optional(),\n\t\t\t\t\t\t\t\tis_dark: z\n\t\t\t\t\t\t\t\t\t.union([\n\t\t\t\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\t\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t\t.nullable(),\n\t\t\t\t\t\t\t\tis_light: z\n\t\t\t\t\t\t\t\t\t.union([\n\t\t\t\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\t\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t\t.nullable(),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\ttranslations: z\n\t\t\t\t\t\t.array(\n\t\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\t\ttitle: z.string().nullable().optional(),\n\t\t\t\t\t\t\t\talt: z.string().nullable(),\n\t\t\t\t\t\t\t\tdescription: z.string().nullable().optional(),\n\t\t\t\t\t\t\t\tsummary: z.string().nullable().optional(),\n\t\t\t\t\t\t\t\tlocale_code: z.string().nullable(),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.optional(),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.optional(),\n\t\tcrop: z\n\t\t\t.array(\n\t\t\t\tz.object({\n\t\t\t\t\tid: z.number(),\n\t\t\t\t\tkey: z.string(),\n\t\t\t\t\torigin: z.enum([\"human\", \"ai_generated\", \"ai_modified\"]),\n\t\t\t\t\ttype: z.string(),\n\t\t\t\t\tmime_type: z.string(),\n\t\t\t\t\tfile_extension: z.string(),\n\t\t\t\t\tfile_name: z.string().nullable(),\n\t\t\t\t\tfile_size: z.number(),\n\t\t\t\t\twidth: z.number().nullable(),\n\t\t\t\t\theight: z.number().nullable(),\n\t\t\t\t\tfocal_x: z.number().nullable(),\n\t\t\t\t\tfocal_y: z.number().nullable(),\n\t\t\t\t\tcrop_x: z.number(),\n\t\t\t\t\tcrop_y: z.number(),\n\t\t\t\t\tcrop_width: z.number(),\n\t\t\t\t\tcrop_height: z.number(),\n\t\t\t\t\tcrop_rotation: z.number(),\n\t\t\t\t\tcrop_skew_x: z.number(),\n\t\t\t\t\tcrop_skew_y: z.number(),\n\t\t\t\t\tblur_hash: z.string().nullable(),\n\t\t\t\t\taverage_color: z.string().nullable(),\n\t\t\t\t\tbase64: z.string().nullable().optional(),\n\t\t\t\t\tis_dark: z\n\t\t\t\t\t\t.union([\n\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t\t\t\t\t])\n\t\t\t\t\t\t.nullable(),\n\t\t\t\t\tis_light: z\n\t\t\t\t\t\t.union([\n\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\t\t\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t\t\t\t\t])\n\t\t\t\t\t\t.nullable(),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.optional(),\n\t\tcustom_meta: z.string().nullable(),\n\t\ttenant_key: z.string().nullable(),\n\t\tis_deleted: z.union([\n\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.true),\n\t\t\tz.literal(this.dbAdapter.config.defaults.boolean.false),\n\t\t]),\n\t\tis_deleted_at: z.union([z.string(), z.date()]).nullable(),\n\t\tdeleted_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\tupdated_by: z.number().nullable(),\n\t\tcreated_by: z.number().nullable(),\n\t});\n\tcolumnFormats = {\n\t\tid: this.dbAdapter.getDataType(\"primary\"),\n\t\tkey: this.dbAdapter.getDataType(\"text\"),\n\t\tfolder_id: this.dbAdapter.getDataType(\"integer\"),\n\t\tparent_media_id: this.dbAdapter.getDataType(\"integer\"),\n\t\trelation_type: this.dbAdapter.getDataType(\"text\"),\n\t\te_tag: this.dbAdapter.getDataType(\"text\"),\n\t\torigin: this.dbAdapter.getDataType(\"text\"),\n\t\tai_generation_id: this.dbAdapter.getDataType(\"integer\"),\n\t\tpublic: this.dbAdapter.getDataType(\"boolean\"),\n\t\ttype: this.dbAdapter.getDataType(\"text\"),\n\t\tmime_type: this.dbAdapter.getDataType(\"text\"),\n\t\tfile_extension: this.dbAdapter.getDataType(\"text\"),\n\t\tfile_name: this.dbAdapter.getDataType(\"text\"),\n\t\tfile_size: this.dbAdapter.getDataType(\"integer\"),\n\t\twidth: this.dbAdapter.getDataType(\"integer\"),\n\t\theight: this.dbAdapter.getDataType(\"integer\"),\n\t\tfocal_x: this.dbAdapter.getDataType(\"integer\"),\n\t\tfocal_y: this.dbAdapter.getDataType(\"integer\"),\n\t\tcrop_x: this.dbAdapter.getDataType(\"real\"),\n\t\tcrop_y: this.dbAdapter.getDataType(\"real\"),\n\t\tcrop_width: this.dbAdapter.getDataType(\"real\"),\n\t\tcrop_height: this.dbAdapter.getDataType(\"real\"),\n\t\tcrop_rotation: this.dbAdapter.getDataType(\"real\"),\n\t\tcrop_skew_x: this.dbAdapter.getDataType(\"real\"),\n\t\tcrop_skew_y: this.dbAdapter.getDataType(\"real\"),\n\t\tblur_hash: this.dbAdapter.getDataType(\"text\"),\n\t\taverage_color: this.dbAdapter.getDataType(\"text\"),\n\t\tbase64: this.dbAdapter.getDataType(\"text\"),\n\t\tis_dark: this.dbAdapter.getDataType(\"boolean\"),\n\t\tis_light: this.dbAdapter.getDataType(\"boolean\"),\n\t\tcustom_meta: this.dbAdapter.getDataType(\"text\"),\n\t\ttenant_key: this.dbAdapter.getDataType(\"text\"),\n\t\tis_hidden: this.dbAdapter.getDataType(\"boolean\"),\n\t\tis_deleted: this.dbAdapter.getDataType(\"boolean\"),\n\t\tis_deleted_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tdeleted_by: this.dbAdapter.getDataType(\"integer\"),\n\t\tcreated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tupdated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tupdated_by: this.dbAdapter.getDataType(\"integer\"),\n\t\tcreated_by: this.dbAdapter.getDataType(\"integer\"),\n\t};\n\tqueryConfig = {\n\t\ttableKeys: {\n\t\t\tfilters: {\n\t\t\t\tkey: \"key\",\n\t\t\t\tmimeType: \"mime_type\",\n\t\t\t\ttype: \"type\",\n\t\t\t\textension: \"file_extension\",\n\t\t\t\tfolderId: \"folder_id\",\n\t\t\t\tisDeleted: \"is_deleted\",\n\t\t\t\tdeletedBy: \"deleted_by\",\n\t\t\t\tpublic: \"public\",\n\t\t\t\tisHidden: \"is_hidden\",\n\t\t\t\torigin: \"origin\",\n\t\t\t\tfileSize: \"file_size\",\n\t\t\t\twidth: \"width\",\n\t\t\t\theight: \"height\",\n\t\t\t\tcreatedAt: \"created_at\",\n\t\t\t\tupdatedAt: \"updated_at\",\n\t\t\t},\n\t\t\tsorts: {\n\t\t\t\tcreatedAt: \"created_at\",\n\t\t\t\tupdatedAt: \"updated_at\",\n\t\t\t\tfileSize: \"file_size\",\n\t\t\t\twidth: \"width\",\n\t\t\t\theight: \"height\",\n\t\t\t\tmimeType: \"mime_type\",\n\t\t\t\textension: \"file_extension\",\n\t\t\t\tdeletedBy: \"deleted_by\",\n\t\t\t\tisDeletedAt: \"is_deleted_at\",\n\t\t\t},\n\t\t},\n\t} as const;\n\n\t// ----------------------------------------\n\t// queries\n\tasync sumFileSize() {\n\t\tconst query = this.db\n\t\t\t.selectFrom(\"lucid_media\")\n\t\t\t.select(sql<string | number>`COALESCE(SUM(file_size), 0)`.as(\"total\"));\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() =>\n\t\t\t\tquery.executeTakeFirst() as Promise<\n\t\t\t\t\t{ total: string | number | null } | undefined\n\t\t\t\t>,\n\t\t\t{\n\t\t\t\tmethod: \"sumFileSize\",\n\t\t\t},\n\t\t);\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn {\n\t\t\terror: undefined,\n\t\t\tdata: Number(exec.response.data?.total ?? 0),\n\t\t};\n\t}\n\n\tasync sumFileSizeByTenant(props: { tenantKey: string | null }) {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"lucid_media\")\n\t\t\t.select(sql<string | number>`COALESCE(SUM(file_size), 0)`.as(\"total\"));\n\n\t\tquery =\n\t\t\tprops.tenantKey === null\n\t\t\t\t? query.where(\"tenant_key\", \"is\", null)\n\t\t\t\t: query.where(\"tenant_key\", \"=\", props.tenantKey);\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() =>\n\t\t\t\tquery.executeTakeFirst() as Promise<\n\t\t\t\t\t{ total: string | number | null } | undefined\n\t\t\t\t>,\n\t\t\t{\n\t\t\t\tmethod: \"sumFileSizeByTenant\",\n\t\t\t},\n\t\t);\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn {\n\t\t\terror: undefined,\n\t\t\tdata: Number(exec.response.data?.total ?? 0),\n\t\t};\n\t}\n\n\tasync sumFileSizeGroupedByTenant() {\n\t\tconst query = this.db\n\t\t\t.selectFrom(\"lucid_media\")\n\t\t\t.select([\n\t\t\t\t\"tenant_key\",\n\t\t\t\tsql<string | number>`COALESCE(SUM(file_size), 0)`.as(\"total\"),\n\t\t\t])\n\t\t\t.groupBy(\"tenant_key\");\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() =>\n\t\t\t\tquery.execute() as Promise<\n\t\t\t\t\t{ tenant_key: string | null; total: string | number | null }[]\n\t\t\t\t>,\n\t\t\t{\n\t\t\t\tmethod: \"sumFileSizeGroupedByTenant\",\n\t\t\t},\n\t\t);\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn {\n\t\t\terror: undefined,\n\t\t\tdata: exec.response.data.map((row) => ({\n\t\t\t\ttenant_key: row.tenant_key,\n\t\t\t\ttotal: Number(row.total ?? 0),\n\t\t\t})),\n\t\t};\n\t}\n\n\t/** Resolves a requested source or crop key to its current active presentation. */\n\tasync selectSingleActivePresentationByKey(props: { key: string }) {\n\t\tconst query = this.db\n\t\t\t.selectFrom(\"lucid_media as requested\")\n\t\t\t.innerJoin(\"lucid_media as source\", (join) =>\n\t\t\t\tjoin.on((eb) =>\n\t\t\t\t\teb.or([\n\t\t\t\t\t\teb.and([\n\t\t\t\t\t\t\teb(\"requested.relation_type\", \"=\", \"crop\"),\n\t\t\t\t\t\t\teb(\"source.id\", \"=\", eb.ref(\"requested.parent_media_id\")),\n\t\t\t\t\t\t]),\n\t\t\t\t\t\teb.and([\n\t\t\t\t\t\t\teb.or([\n\t\t\t\t\t\t\t\teb(\"requested.relation_type\", \"is\", null),\n\t\t\t\t\t\t\t\teb(\"requested.relation_type\", \"=\", \"poster\"),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\teb(\"source.id\", \"=\", eb.ref(\"requested.id\")),\n\t\t\t\t\t\t]),\n\t\t\t\t\t]),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.leftJoin(\"lucid_media as active_crop\", (join) =>\n\t\t\t\tjoin\n\t\t\t\t\t.onRef(\"active_crop.parent_media_id\", \"=\", \"source.id\")\n\t\t\t\t\t.on(\"active_crop.relation_type\", \"=\", \"crop\")\n\t\t\t\t\t.on(\n\t\t\t\t\t\t\"active_crop.is_deleted\",\n\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\tthis.dbAdapter.getDefault(\"boolean\", \"false\"),\n\t\t\t\t\t),\n\t\t\t)\n\t\t\t.select([\n\t\t\t\t\"source.type as source_type\",\n\t\t\t\t\"source.key as source_key\",\n\t\t\t\t\"source.file_name as source_file_name\",\n\t\t\t\t\"source.file_extension as source_file_extension\",\n\t\t\t\t\"source.tenant_key as source_tenant_key\",\n\t\t\t\t\"active_crop.id as active_crop_id\",\n\t\t\t\t\"active_crop.type as active_crop_type\",\n\t\t\t\t\"active_crop.key as active_crop_key\",\n\t\t\t\t\"active_crop.file_name as active_crop_file_name\",\n\t\t\t\t\"active_crop.file_extension as active_crop_file_extension\",\n\t\t\t])\n\t\t\t.where(\"requested.key\", \"=\", props.key)\n\t\t\t.limit(1);\n\n\t\tconst exec = await this.executeQuery(\n\t\t\tasync () => {\n\t\t\t\tconst result = await query.executeTakeFirst();\n\t\t\t\tif (!result) return undefined;\n\n\t\t\t\treturn {\n\t\t\t\t\ttype: result.active_crop_type ?? result.source_type,\n\t\t\t\t\tkey: result.active_crop_key ?? result.source_key,\n\t\t\t\t\tfile_name:\n\t\t\t\t\t\tresult.active_crop_id !== null\n\t\t\t\t\t\t\t? result.active_crop_file_name\n\t\t\t\t\t\t\t: result.source_file_name,\n\t\t\t\t\tfile_extension:\n\t\t\t\t\t\tresult.active_crop_file_extension ?? result.source_file_extension,\n\t\t\t\t\ttenant_key: result.source_tenant_key,\n\t\t\t\t};\n\t\t\t},\n\t\t\t{\n\t\t\t\tmethod: \"selectSingleActivePresentationByKey\",\n\t\t\t},\n\t\t);\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn exec.response;\n\t}\n\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\tincludeOwned?: boolean;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst query = this.db\n\t\t\t.selectFrom(\"lucid_media\")\n\t\t\t.select((eb) => [\n\t\t\t\t\"id\",\n\t\t\t\t\"key\",\n\t\t\t\t\"folder_id\",\n\t\t\t\t\"parent_media_id\",\n\t\t\t\t\"relation_type\",\n\t\t\t\t\"e_tag\",\n\t\t\t\t\"origin\",\n\t\t\t\t\"type\",\n\t\t\t\t\"mime_type\",\n\t\t\t\t\"file_extension\",\n\t\t\t\t\"file_name\",\n\t\t\t\t\"file_size\",\n\t\t\t\t\"width\",\n\t\t\t\t\"height\",\n\t\t\t\t\"focal_x\",\n\t\t\t\t\"focal_y\",\n\t\t\t\t\"crop_x\",\n\t\t\t\t\"crop_y\",\n\t\t\t\t\"crop_width\",\n\t\t\t\t\"crop_height\",\n\t\t\t\t\"crop_rotation\",\n\t\t\t\t\"crop_skew_x\",\n\t\t\t\t\"crop_skew_y\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"updated_at\",\n\t\t\t\t\"blur_hash\",\n\t\t\t\t\"average_color\",\n\t\t\t\t\"base64\",\n\t\t\t\t\"is_dark\",\n\t\t\t\t\"is_light\",\n\t\t\t\t\"is_deleted\",\n\t\t\t\t\"is_deleted_at\",\n\t\t\t\t\"deleted_by\",\n\t\t\t\t\"public\",\n\t\t\t\t\"tenant_key\",\n\t\t\t\tthis.dbAdapter\n\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media as poster\")\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"poster.id\",\n\t\t\t\t\t\t\t\t\"poster.key\",\n\t\t\t\t\t\t\t\t\"poster.origin\",\n\t\t\t\t\t\t\t\t\"poster.type\",\n\t\t\t\t\t\t\t\t\"poster.mime_type\",\n\t\t\t\t\t\t\t\t\"poster.file_extension\",\n\t\t\t\t\t\t\t\t\"poster.file_name\",\n\t\t\t\t\t\t\t\t\"poster.file_size\",\n\t\t\t\t\t\t\t\t\"poster.width\",\n\t\t\t\t\t\t\t\t\"poster.height\",\n\t\t\t\t\t\t\t\t\"poster.focal_x\",\n\t\t\t\t\t\t\t\t\"poster.focal_y\",\n\t\t\t\t\t\t\t\t\"poster.crop_x\",\n\t\t\t\t\t\t\t\t\"poster.crop_y\",\n\t\t\t\t\t\t\t\t\"poster.crop_width\",\n\t\t\t\t\t\t\t\t\"poster.crop_height\",\n\t\t\t\t\t\t\t\t\"poster.crop_rotation\",\n\t\t\t\t\t\t\t\t\"poster.crop_skew_x\",\n\t\t\t\t\t\t\t\t\"poster.crop_skew_y\",\n\t\t\t\t\t\t\t\t\"poster.blur_hash\",\n\t\t\t\t\t\t\t\t\"poster.average_color\",\n\t\t\t\t\t\t\t\t\"poster.base64\",\n\t\t\t\t\t\t\t\t\"poster.is_dark\",\n\t\t\t\t\t\t\t\t\"poster.is_light\",\n\t\t\t\t\t\t\t\tthis.dbAdapter\n\t\t\t\t\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\t\t\t\t\teb\n\t\t\t\t\t\t\t\t\t\t\t.selectFrom(\"lucid_media_translations\")\n\t\t\t\t\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.title\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.alt\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.description\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.summary\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.locale_code\",\n\t\t\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.media_id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t\t\tsql.ref(\"poster.id\"),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.as(\"translations\"),\n\t\t\t\t\t\t\t\tthis.dbAdapter\n\t\t\t\t\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\t\t\t\t\teb\n\t\t\t\t\t\t\t\t\t\t\t.selectFrom(\"lucid_media as poster_crop\")\n\t\t\t\t\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.key\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.origin\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.mime_type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.file_extension\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.file_name\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.file_size\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.width\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.height\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.focal_x\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.focal_y\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_x\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_y\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_width\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_height\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_rotation\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_skew_x\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_skew_y\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.blur_hash\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.average_color\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.base64\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.is_dark\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.is_light\",\n\t\t\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.parent_media_id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t\t\tsql.ref<number>(\"poster.id\"),\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t.where(\"poster_crop.relation_type\", \"=\", \"crop\")\n\t\t\t\t\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.is_deleted\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t\t\tthis.dbAdapter.getDefault(\"boolean\", \"false\"),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.as(\"crop\"),\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t.whereRef(\"poster.parent_media_id\", \"=\", \"lucid_media.id\")\n\t\t\t\t\t\t\t.where(\"poster.relation_type\", \"=\", \"poster\")\n\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\"poster.is_deleted\",\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)\n\t\t\t\t\t.as(\"poster\"),\n\t\t\t\tthis.dbAdapter\n\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media as crop\")\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"crop.id\",\n\t\t\t\t\t\t\t\t\"crop.key\",\n\t\t\t\t\t\t\t\t\"crop.origin\",\n\t\t\t\t\t\t\t\t\"crop.type\",\n\t\t\t\t\t\t\t\t\"crop.mime_type\",\n\t\t\t\t\t\t\t\t\"crop.file_extension\",\n\t\t\t\t\t\t\t\t\"crop.file_name\",\n\t\t\t\t\t\t\t\t\"crop.file_size\",\n\t\t\t\t\t\t\t\t\"crop.width\",\n\t\t\t\t\t\t\t\t\"crop.height\",\n\t\t\t\t\t\t\t\t\"crop.focal_x\",\n\t\t\t\t\t\t\t\t\"crop.focal_y\",\n\t\t\t\t\t\t\t\t\"crop.crop_x\",\n\t\t\t\t\t\t\t\t\"crop.crop_y\",\n\t\t\t\t\t\t\t\t\"crop.crop_width\",\n\t\t\t\t\t\t\t\t\"crop.crop_height\",\n\t\t\t\t\t\t\t\t\"crop.crop_rotation\",\n\t\t\t\t\t\t\t\t\"crop.crop_skew_x\",\n\t\t\t\t\t\t\t\t\"crop.crop_skew_y\",\n\t\t\t\t\t\t\t\t\"crop.blur_hash\",\n\t\t\t\t\t\t\t\t\"crop.average_color\",\n\t\t\t\t\t\t\t\t\"crop.base64\",\n\t\t\t\t\t\t\t\t\"crop.is_dark\",\n\t\t\t\t\t\t\t\t\"crop.is_light\",\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t.whereRef(\"crop.parent_media_id\", \"=\", \"lucid_media.id\")\n\t\t\t\t\t\t\t.where(\"crop.relation_type\", \"=\", \"crop\")\n\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\"crop.is_deleted\",\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)\n\t\t\t\t\t.as(\"crop\"),\n\t\t\t\tthis.dbAdapter\n\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media_translations\")\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"lucid_media_translations.title\",\n\t\t\t\t\t\t\t\t\"lucid_media_translations.alt\",\n\t\t\t\t\t\t\t\t\"lucid_media_translations.description\",\n\t\t\t\t\t\t\t\t\"lucid_media_translations.summary\",\n\t\t\t\t\t\t\t\t\"lucid_media_translations.locale_code\",\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\"lucid_media_translations.media_id\",\n\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\"lucid_media.id\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\t.as(\"translations\"),\n\t\t\t])\n\t\t\t.where(\"id\", \"=\", props.id)\n\t\t\t.$if(props.includeOwned !== true, (qb) =>\n\t\t\t\tqb.where(\"parent_media_id\", \"is\", null),\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.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: [\n\t\t\t\t\"id\",\n\t\t\t\t\"key\",\n\t\t\t\t\"folder_id\",\n\t\t\t\t\"parent_media_id\",\n\t\t\t\t\"relation_type\",\n\t\t\t\t\"e_tag\",\n\t\t\t\t\"origin\",\n\t\t\t\t\"type\",\n\t\t\t\t\"mime_type\",\n\t\t\t\t\"file_extension\",\n\t\t\t\t\"file_name\",\n\t\t\t\t\"file_size\",\n\t\t\t\t\"width\",\n\t\t\t\t\"height\",\n\t\t\t\t\"focal_x\",\n\t\t\t\t\"focal_y\",\n\t\t\t\t\"crop_x\",\n\t\t\t\t\"crop_y\",\n\t\t\t\t\"crop_width\",\n\t\t\t\t\"crop_height\",\n\t\t\t\t\"crop_rotation\",\n\t\t\t\t\"crop_skew_x\",\n\t\t\t\t\"crop_skew_y\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"updated_at\",\n\t\t\t\t\"blur_hash\",\n\t\t\t\t\"average_color\",\n\t\t\t\t\"base64\",\n\t\t\t\t\"is_dark\",\n\t\t\t\t\"is_light\",\n\t\t\t\t\"is_deleted\",\n\t\t\t\t\"is_deleted_at\",\n\t\t\t\t\"deleted_by\",\n\t\t\t\t\"translations\",\n\t\t\t\t\"public\",\n\t\t\t\t\"poster\",\n\t\t\t\t\"crop\",\n\t\t\t],\n\t\t});\n\t}\n\t/** Fetches top-level media and their active owned derivatives in one query. */\n\tasync selectMultipleByIds<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tids: number[];\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst query = this.db\n\t\t\t.selectFrom(\"lucid_media\")\n\t\t\t.select((eb) => [\n\t\t\t\t\"id\",\n\t\t\t\t\"key\",\n\t\t\t\t\"folder_id\",\n\t\t\t\t\"parent_media_id\",\n\t\t\t\t\"relation_type\",\n\t\t\t\t\"e_tag\",\n\t\t\t\t\"origin\",\n\t\t\t\t\"type\",\n\t\t\t\t\"mime_type\",\n\t\t\t\t\"file_extension\",\n\t\t\t\t\"file_name\",\n\t\t\t\t\"file_size\",\n\t\t\t\t\"width\",\n\t\t\t\t\"height\",\n\t\t\t\t\"focal_x\",\n\t\t\t\t\"focal_y\",\n\t\t\t\t\"crop_x\",\n\t\t\t\t\"crop_y\",\n\t\t\t\t\"crop_width\",\n\t\t\t\t\"crop_height\",\n\t\t\t\t\"crop_rotation\",\n\t\t\t\t\"crop_skew_x\",\n\t\t\t\t\"crop_skew_y\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"updated_at\",\n\t\t\t\t\"blur_hash\",\n\t\t\t\t\"average_color\",\n\t\t\t\t\"base64\",\n\t\t\t\t\"is_dark\",\n\t\t\t\t\"is_light\",\n\t\t\t\t\"is_deleted\",\n\t\t\t\t\"is_deleted_at\",\n\t\t\t\t\"deleted_by\",\n\t\t\t\t\"public\",\n\t\t\t\t\"tenant_key\",\n\t\t\t\tthis.dbAdapter\n\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media as poster\")\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"poster.id\",\n\t\t\t\t\t\t\t\t\"poster.key\",\n\t\t\t\t\t\t\t\t\"poster.origin\",\n\t\t\t\t\t\t\t\t\"poster.type\",\n\t\t\t\t\t\t\t\t\"poster.mime_type\",\n\t\t\t\t\t\t\t\t\"poster.file_extension\",\n\t\t\t\t\t\t\t\t\"poster.file_name\",\n\t\t\t\t\t\t\t\t\"poster.file_size\",\n\t\t\t\t\t\t\t\t\"poster.width\",\n\t\t\t\t\t\t\t\t\"poster.height\",\n\t\t\t\t\t\t\t\t\"poster.focal_x\",\n\t\t\t\t\t\t\t\t\"poster.focal_y\",\n\t\t\t\t\t\t\t\t\"poster.crop_x\",\n\t\t\t\t\t\t\t\t\"poster.crop_y\",\n\t\t\t\t\t\t\t\t\"poster.crop_width\",\n\t\t\t\t\t\t\t\t\"poster.crop_height\",\n\t\t\t\t\t\t\t\t\"poster.crop_rotation\",\n\t\t\t\t\t\t\t\t\"poster.crop_skew_x\",\n\t\t\t\t\t\t\t\t\"poster.crop_skew_y\",\n\t\t\t\t\t\t\t\t\"poster.blur_hash\",\n\t\t\t\t\t\t\t\t\"poster.average_color\",\n\t\t\t\t\t\t\t\t\"poster.base64\",\n\t\t\t\t\t\t\t\t\"poster.is_dark\",\n\t\t\t\t\t\t\t\t\"poster.is_light\",\n\t\t\t\t\t\t\t\tthis.dbAdapter\n\t\t\t\t\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\t\t\t\t\teb\n\t\t\t\t\t\t\t\t\t\t\t.selectFrom(\"lucid_media_translations\")\n\t\t\t\t\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.title\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.alt\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.description\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.summary\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.locale_code\",\n\t\t\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.media_id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t\t\tsql.ref(\"poster.id\"),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.as(\"translations\"),\n\t\t\t\t\t\t\t\tthis.dbAdapter\n\t\t\t\t\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\t\t\t\t\teb\n\t\t\t\t\t\t\t\t\t\t\t.selectFrom(\"lucid_media as poster_crop\")\n\t\t\t\t\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.key\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.origin\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.mime_type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.file_extension\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.file_name\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.file_size\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.width\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.height\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.focal_x\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.focal_y\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_x\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_y\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_width\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_height\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_rotation\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_skew_x\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.crop_skew_y\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.blur_hash\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.average_color\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.base64\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.is_dark\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.is_light\",\n\t\t\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.parent_media_id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t\t\tsql.ref<number>(\"poster.id\"),\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t.where(\"poster_crop.relation_type\", \"=\", \"crop\")\n\t\t\t\t\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\t\t\t\t\"poster_crop.is_deleted\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t\t\tthis.dbAdapter.getDefault(\"boolean\", \"false\"),\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.as(\"crop\"),\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t.whereRef(\"poster.parent_media_id\", \"=\", \"lucid_media.id\")\n\t\t\t\t\t\t\t.where(\"poster.relation_type\", \"=\", \"poster\")\n\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\"poster.is_deleted\",\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)\n\t\t\t\t\t.as(\"poster\"),\n\t\t\t\tthis.dbAdapter\n\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media as crop\")\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"crop.id\",\n\t\t\t\t\t\t\t\t\"crop.key\",\n\t\t\t\t\t\t\t\t\"crop.origin\",\n\t\t\t\t\t\t\t\t\"crop.type\",\n\t\t\t\t\t\t\t\t\"crop.mime_type\",\n\t\t\t\t\t\t\t\t\"crop.file_extension\",\n\t\t\t\t\t\t\t\t\"crop.file_name\",\n\t\t\t\t\t\t\t\t\"crop.file_size\",\n\t\t\t\t\t\t\t\t\"crop.width\",\n\t\t\t\t\t\t\t\t\"crop.height\",\n\t\t\t\t\t\t\t\t\"crop.focal_x\",\n\t\t\t\t\t\t\t\t\"crop.focal_y\",\n\t\t\t\t\t\t\t\t\"crop.crop_x\",\n\t\t\t\t\t\t\t\t\"crop.crop_y\",\n\t\t\t\t\t\t\t\t\"crop.crop_width\",\n\t\t\t\t\t\t\t\t\"crop.crop_height\",\n\t\t\t\t\t\t\t\t\"crop.crop_rotation\",\n\t\t\t\t\t\t\t\t\"crop.crop_skew_x\",\n\t\t\t\t\t\t\t\t\"crop.crop_skew_y\",\n\t\t\t\t\t\t\t\t\"crop.blur_hash\",\n\t\t\t\t\t\t\t\t\"crop.average_color\",\n\t\t\t\t\t\t\t\t\"crop.base64\",\n\t\t\t\t\t\t\t\t\"crop.is_dark\",\n\t\t\t\t\t\t\t\t\"crop.is_light\",\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t.whereRef(\"crop.parent_media_id\", \"=\", \"lucid_media.id\")\n\t\t\t\t\t\t\t.where(\"crop.relation_type\", \"=\", \"crop\")\n\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\"crop.is_deleted\",\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)\n\t\t\t\t\t.as(\"crop\"),\n\t\t\t\tthis.dbAdapter\n\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\teb\n\t\t\t\t\t\t\t.selectFrom(\"lucid_media_translations\")\n\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\"lucid_media_translations.title\",\n\t\t\t\t\t\t\t\t\"lucid_media_translations.alt\",\n\t\t\t\t\t\t\t\t\"lucid_media_translations.description\",\n\t\t\t\t\t\t\t\t\"lucid_media_translations.summary\",\n\t\t\t\t\t\t\t\t\"lucid_media_translations.locale_code\",\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\"lucid_media_translations.media_id\",\n\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\"lucid_media.id\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\t.as(\"translations\"),\n\t\t\t])\n\t\t\t.where(\"id\", \"in\", props.ids)\n\t\t\t.where(\"parent_media_id\", \"is\", null);\n\n\t\tconst exec = await this.executeQuery(() => query.execute(), {\n\t\t\tmethod: \"selectMultipleByIds\",\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\"key\",\n\t\t\t\t\"folder_id\",\n\t\t\t\t\"parent_media_id\",\n\t\t\t\t\"relation_type\",\n\t\t\t\t\"e_tag\",\n\t\t\t\t\"origin\",\n\t\t\t\t\"type\",\n\t\t\t\t\"mime_type\",\n\t\t\t\t\"file_extension\",\n\t\t\t\t\"file_name\",\n\t\t\t\t\"file_size\",\n\t\t\t\t\"width\",\n\t\t\t\t\"height\",\n\t\t\t\t\"focal_x\",\n\t\t\t\t\"focal_y\",\n\t\t\t\t\"crop_x\",\n\t\t\t\t\"crop_y\",\n\t\t\t\t\"crop_width\",\n\t\t\t\t\"crop_height\",\n\t\t\t\t\"crop_rotation\",\n\t\t\t\t\"crop_skew_x\",\n\t\t\t\t\"crop_skew_y\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"updated_at\",\n\t\t\t\t\"blur_hash\",\n\t\t\t\t\"average_color\",\n\t\t\t\t\"base64\",\n\t\t\t\t\"is_dark\",\n\t\t\t\t\"is_light\",\n\t\t\t\t\"is_deleted\",\n\t\t\t\t\"is_deleted_at\",\n\t\t\t\t\"deleted_by\",\n\t\t\t\t\"translations\",\n\t\t\t\t\"public\",\n\t\t\t\t\"poster\",\n\t\t\t\t\"crop\",\n\t\t\t],\n\t\t});\n\t}\n\t/**\n\t * Fetches media rows used by field validation, scoped to the request tenant while\n\t * keeping global media available to every tenant.\n\t */\n\tasync selectMultipleValidationData<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tids: number[];\n\t\t\t\ttenantKey?: string | null;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"lucid_media\")\n\t\t\t.select([\"id\", \"file_extension\", \"width\", \"height\", \"type\"])\n\t\t\t.where(\"id\", \"in\", props.ids)\n\t\t\t.where(\"parent_media_id\", \"is\", null);\n\n\t\tquery = queryBuilder.tenantScope(query, {\n\t\t\ttenantKey: props.tenantKey,\n\t\t\tcolumn: \"lucid_media.tenant_key\",\n\t\t});\n\n\t\tconst exec = await this.executeQuery(() => query.execute(), {\n\t\t\tmethod: \"selectMultipleValidationData\",\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: [\"id\", \"file_extension\", \"width\", \"height\", \"type\"],\n\t\t});\n\t}\n\n\t/**\n\t * Fetches media IDs inside folders using tenant visibility rules.\n\t * Delete flows use the returned IDs so updates cannot touch hidden tenant rows.\n\t */\n\tasync selectMultipleIdsByFolderIds<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tfolderIds: number[];\n\t\t\t\ttenantKey?: string | null;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tlet query = this.db\n\t\t\t.selectFrom(\"lucid_media\")\n\t\t\t.select([\"id\"])\n\t\t\t.where(\"folder_id\", \"in\", props.folderIds);\n\n\t\tquery = queryBuilder.tenantScope(query, {\n\t\t\ttenantKey: props.tenantKey,\n\t\t\tcolumn: \"lucid_media.tenant_key\",\n\t\t});\n\n\t\tconst exec = await this.executeQuery(() => query.execute(), {\n\t\t\tmethod: \"selectMultipleIdsByFolderIds\",\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\tschema: this.tableSchema.pick({\n\t\t\t\tid: true,\n\t\t\t}),\n\t\t\tselect: [\"id\"],\n\t\t});\n\t}\n\tasync selectMultipleFilteredFixed<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tqueryParams: GetMultipleQueryParams;\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\")\n\t\t\t\t\t.leftJoin(\"lucid_media_translations as translation\", (join) =>\n\t\t\t\t\t\tjoin.onRef(\"translation.media_id\", \"=\", \"lucid_media.id\"),\n\t\t\t\t\t)\n\t\t\t\t\t.select((eb) => [\n\t\t\t\t\t\t\"lucid_media.id\",\n\t\t\t\t\t\t\"lucid_media.key\",\n\t\t\t\t\t\t\"lucid_media.folder_id\",\n\t\t\t\t\t\t\"lucid_media.parent_media_id\",\n\t\t\t\t\t\t\"lucid_media.relation_type\",\n\t\t\t\t\t\t\"lucid_media.e_tag\",\n\t\t\t\t\t\t\"lucid_media.origin\",\n\t\t\t\t\t\t\"lucid_media.type\",\n\t\t\t\t\t\t\"lucid_media.mime_type\",\n\t\t\t\t\t\t\"lucid_media.file_extension\",\n\t\t\t\t\t\t\"lucid_media.file_name\",\n\t\t\t\t\t\t\"lucid_media.file_size\",\n\t\t\t\t\t\t\"lucid_media.width\",\n\t\t\t\t\t\t\"lucid_media.height\",\n\t\t\t\t\t\t\"lucid_media.focal_x\",\n\t\t\t\t\t\t\"lucid_media.focal_y\",\n\t\t\t\t\t\t\"lucid_media.crop_x\",\n\t\t\t\t\t\t\"lucid_media.crop_y\",\n\t\t\t\t\t\t\"lucid_media.crop_width\",\n\t\t\t\t\t\t\"lucid_media.crop_height\",\n\t\t\t\t\t\t\"lucid_media.crop_rotation\",\n\t\t\t\t\t\t\"lucid_media.crop_skew_x\",\n\t\t\t\t\t\t\"lucid_media.crop_skew_y\",\n\t\t\t\t\t\t\"lucid_media.blur_hash\",\n\t\t\t\t\t\t\"lucid_media.average_color\",\n\t\t\t\t\t\t\"lucid_media.base64\",\n\t\t\t\t\t\t\"lucid_media.is_dark\",\n\t\t\t\t\t\t\"lucid_media.is_light\",\n\t\t\t\t\t\t\"lucid_media.created_at\",\n\t\t\t\t\t\t\"lucid_media.updated_at\",\n\t\t\t\t\t\t\"lucid_media.is_deleted\",\n\t\t\t\t\t\t\"lucid_media.is_deleted_at\",\n\t\t\t\t\t\t\"lucid_media.deleted_by\",\n\t\t\t\t\t\t\"lucid_media.public\",\n\t\t\t\t\t\t\"lucid_media.tenant_key\",\n\t\t\t\t\t\teb.fn.min<string>(\"translation.title\").as(\"title_sort\"),\n\t\t\t\t\t\tthis.dbAdapter\n\t\t\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\t\t\teb\n\t\t\t\t\t\t\t\t\t.selectFrom(\"lucid_media_translations\")\n\t\t\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.title\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.alt\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.description\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.summary\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.locale_code\",\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.media_id\",\n\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.id\",\n\t\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(\"translations\"),\n\t\t\t\t\t\tthis.dbAdapter\n\t\t\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\t\t\teb\n\t\t\t\t\t\t\t\t\t.selectFrom(\"lucid_media as poster\")\n\t\t\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\t\t\"poster.id\",\n\t\t\t\t\t\t\t\t\t\t\"poster.key\",\n\t\t\t\t\t\t\t\t\t\t\"poster.origin\",\n\t\t\t\t\t\t\t\t\t\t\"poster.type\",\n\t\t\t\t\t\t\t\t\t\t\"poster.mime_type\",\n\t\t\t\t\t\t\t\t\t\t\"poster.file_extension\",\n\t\t\t\t\t\t\t\t\t\t\"poster.file_name\",\n\t\t\t\t\t\t\t\t\t\t\"poster.file_size\",\n\t\t\t\t\t\t\t\t\t\t\"poster.width\",\n\t\t\t\t\t\t\t\t\t\t\"poster.height\",\n\t\t\t\t\t\t\t\t\t\t\"poster.focal_x\",\n\t\t\t\t\t\t\t\t\t\t\"poster.focal_y\",\n\t\t\t\t\t\t\t\t\t\t\"poster.crop_x\",\n\t\t\t\t\t\t\t\t\t\t\"poster.crop_y\",\n\t\t\t\t\t\t\t\t\t\t\"poster.crop_width\",\n\t\t\t\t\t\t\t\t\t\t\"poster.crop_height\",\n\t\t\t\t\t\t\t\t\t\t\"poster.crop_rotation\",\n\t\t\t\t\t\t\t\t\t\t\"poster.crop_skew_x\",\n\t\t\t\t\t\t\t\t\t\t\"poster.crop_skew_y\",\n\t\t\t\t\t\t\t\t\t\t\"poster.blur_hash\",\n\t\t\t\t\t\t\t\t\t\t\"poster.average_color\",\n\t\t\t\t\t\t\t\t\t\t\"poster.base64\",\n\t\t\t\t\t\t\t\t\t\t\"poster.is_dark\",\n\t\t\t\t\t\t\t\t\t\t\"poster.is_light\",\n\t\t\t\t\t\t\t\t\t\tthis.dbAdapter\n\t\t\t\t\t\t\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\t\t\t\t\t\t\teb\n\t\t\t\t\t\t\t\t\t\t\t\t\t.selectFrom(\"lucid_media_translations\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.title\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.alt\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.description\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.summary\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.locale_code\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"lucid_media_translations.media_id\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsql.ref(\"poster.id\"),\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t.as(\"translations\"),\n\t\t\t\t\t\t\t\t\t\tactiveMediaCropSelect(this.db, this.dbAdapter, \"poster.id\"),\n\t\t\t\t\t\t\t\t\t])\n\t\t\t\t\t\t\t\t\t.whereRef(\"poster.parent_media_id\", \"=\", \"lucid_media.id\")\n\t\t\t\t\t\t\t\t\t.where(\"poster.relation_type\", \"=\", \"poster\")\n\t\t\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\t\t\"poster.is_deleted\",\n\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\tthis.dbAdapter.getDefault(\"boolean\", \"false\"),\n\t\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(\"poster\"),\n\t\t\t\t\t\tactiveMediaCropSelect(this.db, this.dbAdapter, \"lucid_media.id\"),\n\t\t\t\t\t])\n\t\t\t\t\t.where(\n\t\t\t\t\t\t\"lucid_media.is_hidden\",\n\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\tthis.dbAdapter.getDefault(\"boolean\", \"false\"),\n\t\t\t\t\t)\n\t\t\t\t\t.where(\"lucid_media.parent_media_id\", \"is\", null)\n\t\t\t\t\t.groupBy(\"lucid_media.id\")\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.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\")\n\t\t\t\t\t.select(sql`count(distinct lucid_media.id)`.as(\"count\"))\n\t\t\t\t\t.leftJoin(\"lucid_media_translations as translation\", (join) =>\n\t\t\t\t\t\tjoin.onRef(\"translation.media_id\", \"=\", \"lucid_media.id\"),\n\t\t\t\t\t)\n\t\t\t\t\t.where(\n\t\t\t\t\t\t\"lucid_media.is_hidden\",\n\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\tthis.dbAdapter.getDefault(\"boolean\", \"false\"),\n\t\t\t\t\t)\n\t\t\t\t\t.where(\"lucid_media.parent_media_id\", \"is\", null)\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.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: {\n\t\t\t\t\t\t\ttableKeys: {\n\t\t\t\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\t\t\ttitle: \"translation.title\",\n\t\t\t\t\t\t\t\t\t...this.queryConfig.tableKeys.filters,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsorts: {\n\t\t\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\t\t\ttitle: \"title_sort\",\n\t\t\t\t\t\t\t\t\t...this.queryConfig.tableKeys.sorts,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\toperators: {\n\t\t\t\t\t\t\t\ttitle: \"contains\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\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{\n\t\t\t\tmethod: \"selectMultipleFilteredFixed\",\n\t\t\t},\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-count\",\n\t\t\tselect: [\n\t\t\t\t\"id\",\n\t\t\t\t\"key\",\n\t\t\t\t\"folder_id\",\n\t\t\t\t\"parent_media_id\",\n\t\t\t\t\"relation_type\",\n\t\t\t\t\"e_tag\",\n\t\t\t\t\"origin\",\n\t\t\t\t\"type\",\n\t\t\t\t\"mime_type\",\n\t\t\t\t\"file_extension\",\n\t\t\t\t\"file_name\",\n\t\t\t\t\"file_size\",\n\t\t\t\t\"width\",\n\t\t\t\t\"height\",\n\t\t\t\t\"focal_x\",\n\t\t\t\t\"focal_y\",\n\t\t\t\t\"crop_x\",\n\t\t\t\t\"crop_y\",\n\t\t\t\t\"crop_width\",\n\t\t\t\t\"crop_height\",\n\t\t\t\t\"crop_rotation\",\n\t\t\t\t\"crop_skew_x\",\n\t\t\t\t\"crop_skew_y\",\n\t\t\t\t\"blur_hash\",\n\t\t\t\t\"average_color\",\n\t\t\t\t\"base64\",\n\t\t\t\t\"is_dark\",\n\t\t\t\t\"is_light\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"updated_at\",\n\t\t\t\t\"is_deleted\",\n\t\t\t\t\"is_deleted_at\",\n\t\t\t\t\"deleted_by\",\n\t\t\t\t\"public\",\n\t\t\t\t\"tenant_key\",\n\t\t\t\t\"translations\",\n\t\t\t\t\"poster\",\n\t\t\t\t\"crop\",\n\t\t\t],\n\t\t});\n\t}\n}\n"],"mappings":"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