@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 17.1 kB
Source Map (JSON)
{"version":3,"file":"ai-generations.mjs","names":["queryBuilder"],"sources":["../../../src/libs/repositories/ai-generations.ts"],"sourcesContent":["import { sql } from \"kysely\";\nimport z from \"zod\";\nimport type { GetUsageQueryParams } from \"../../schemas/ai.js\";\nimport type DatabaseAdapter from \"../db/adapter-base.js\";\nimport queryBuilder from \"../db/query-builder/index.js\";\nimport type { KyselyDB, LucidAiGenerations, Select } 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 interface AiUsageChartRowPropT {\n\tcreated_at: Date | string;\n\tfeature_key: string;\n\tusage: Record<string, unknown> | null;\n\tcost_currency: string | null;\n\tcost_total_minor: number | null;\n}\n\nexport default class AiGenerationsRepository extends StaticRepository<\"lucid_ai_generations\"> {\n\tconstructor(db: KyselyDB, dbAdapter: DatabaseAdapter) {\n\t\tsuper(db, dbAdapter, \"lucid_ai_generations\");\n\t}\n\ttableSchema = z.object({\n\t\tid: z.number(),\n\t\trequest_id: z.string(),\n\t\tprovider_request_id: z.string().nullable(),\n\t\tfeature_key: z.string(),\n\t\tfeature_version: z.string(),\n\t\ttenant_key: z.string().nullable(),\n\t\tuser_id: z.number().nullable(),\n\t\ttarget_type: z.string(),\n\t\ttarget: z.record(z.string(), z.unknown()),\n\t\toutput: z.unknown().nullable(),\n\t\tusage: z.record(z.string(), z.unknown()).nullable(),\n\t\tmodel: z.string().nullable(),\n\t\tcost_currency: z.string().nullable(),\n\t\tcost_total_minor: z.number().nullable(),\n\t\tduration_ms: z.number().nullable(),\n\t\tstatus: z.enum([\"failed\", \"pending\", \"success\"]),\n\t\terror_message: z.string().nullable(),\n\t\tcreated_at: z.union([z.string(), z.date()]),\n\t});\n\tcolumnFormats = {\n\t\tid: this.dbAdapter.getDataType(\"primary\"),\n\t\trequest_id: this.dbAdapter.getDataType(\"text\"),\n\t\tprovider_request_id: this.dbAdapter.getDataType(\"text\"),\n\t\tfeature_key: this.dbAdapter.getDataType(\"text\"),\n\t\tfeature_version: this.dbAdapter.getDataType(\"text\"),\n\t\ttenant_key: this.dbAdapter.getDataType(\"text\"),\n\t\tuser_id: this.dbAdapter.getDataType(\"integer\"),\n\t\ttarget_type: this.dbAdapter.getDataType(\"text\"),\n\t\ttarget: this.dbAdapter.getDataType(\"json\"),\n\t\toutput: this.dbAdapter.getDataType(\"json\"),\n\t\tusage: this.dbAdapter.getDataType(\"json\"),\n\t\tmodel: this.dbAdapter.getDataType(\"text\"),\n\t\tcost_currency: this.dbAdapter.getDataType(\"text\"),\n\t\tcost_total_minor: this.dbAdapter.getDataType(\"integer\"),\n\t\tduration_ms: this.dbAdapter.getDataType(\"integer\"),\n\t\tstatus: this.dbAdapter.getDataType(\"text\"),\n\t\terror_message: this.dbAdapter.getDataType(\"text\"),\n\t\tcreated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t};\n\tqueryConfig = {\n\t\ttableKeys: {\n\t\t\tfilters: {\n\t\t\t\trequestId: \"lucid_ai_generations.request_id\",\n\t\t\t\tproviderRequestId: \"lucid_ai_generations.provider_request_id\",\n\t\t\t\tfeatureKey: \"lucid_ai_generations.feature_key\",\n\t\t\t\tfeatureVersion: \"lucid_ai_generations.feature_version\",\n\t\t\t\tstatus: \"lucid_ai_generations.status\",\n\t\t\t\tmodel: \"lucid_ai_generations.model\",\n\t\t\t\tuserId: \"lucid_ai_generations.user_id\",\n\t\t\t\ttargetType: \"lucid_ai_generations.target_type\",\n\t\t\t\tdurationMs: \"lucid_ai_generations.duration_ms\",\n\t\t\t\tcreatedAt: \"lucid_ai_generations.created_at\",\n\t\t\t},\n\t\t\tsorts: {\n\t\t\t\tcreatedAt: \"lucid_ai_generations.created_at\",\n\t\t\t\tcost: \"lucid_ai_generations.cost_total_minor\",\n\t\t\t\tdurationMs: \"lucid_ai_generations.duration_ms\",\n\t\t\t},\n\t\t},\n\t\toperators: {\n\t\t\trequestId: \"contains\",\n\t\t\tproviderRequestId: \"contains\",\n\t\t\tmodel: \"contains\",\n\t\t\ttargetType: \"contains\",\n\t\t},\n\t} as const;\n\n\tasync selectSingleByRequestId<\n\t\tK extends keyof Select<LucidAiGenerations>,\n\t\tV extends boolean = false,\n\t>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\trequestId: string;\n\t\t\t\tselect: K[];\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_ai_generations\")\n\t\t\t.select(props.select)\n\t\t\t.where(\"request_id\", \"=\", props.requestId);\n\n\t\tquery = queryBuilder.tenantScope(query, {\n\t\t\ttenantKey: props.tenantKey,\n\t\t\tcolumn: \"lucid_ai_generations.tenant_key\",\n\t\t});\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\tPick<Select<LucidAiGenerations>, K> | undefined\n\t\t\t\t>,\n\t\t\t{\n\t\t\t\tmethod: \"selectSingleByRequestId\",\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: \"single\",\n\t\t\tselect: props.select,\n\t\t});\n\t}\n\n\tasync selectUsageChartRows<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tstartDate: string;\n\t\t\t\tendDate: string;\n\t\t\t\tfeatureKey?: string;\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\tlet query = this.db\n\t\t\t\t\t.selectFrom(\"lucid_ai_generations\")\n\t\t\t\t\t.select([\n\t\t\t\t\t\t\"created_at\",\n\t\t\t\t\t\t\"feature_key\",\n\t\t\t\t\t\t\"usage\",\n\t\t\t\t\t\t\"cost_currency\",\n\t\t\t\t\t\t\"cost_total_minor\",\n\t\t\t\t\t])\n\t\t\t\t\t.where(\"created_at\", \">=\", props.startDate)\n\t\t\t\t\t.where(\"created_at\", \"<\", props.endDate);\n\n\t\t\t\tquery = queryBuilder.tenantScope(query, {\n\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\tcolumn: \"lucid_ai_generations.tenant_key\",\n\t\t\t\t});\n\n\t\t\t\tif (props.featureKey) {\n\t\t\t\t\tquery = query.where(\"feature_key\", \"=\", props.featureKey);\n\t\t\t\t}\n\n\t\t\t\treturn await query.execute();\n\t\t\t},\n\t\t\t{\n\t\t\t\tmethod: \"selectUsageChartRows\",\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\",\n\t\t\tschema: this.tableSchema.pick({\n\t\t\t\tcreated_at: true,\n\t\t\t\tfeature_key: true,\n\t\t\t\tusage: true,\n\t\t\t\tcost_currency: true,\n\t\t\t\tcost_total_minor: true,\n\t\t\t}),\n\t\t\tselect: [\n\t\t\t\t\"created_at\",\n\t\t\t\t\"feature_key\",\n\t\t\t\t\"usage\",\n\t\t\t\t\"cost_currency\",\n\t\t\t\t\"cost_total_minor\",\n\t\t\t],\n\t\t});\n\t}\n\n\tasync selectUsageMultiple<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tqueryParams: GetUsageQueryParams;\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\tlet mainQuery = this.db\n\t\t\t\t\t.selectFrom(\"lucid_ai_generations\")\n\t\t\t\t\t.leftJoin(\n\t\t\t\t\t\t\"lucid_users\",\n\t\t\t\t\t\t\"lucid_users.id\",\n\t\t\t\t\t\t\"lucid_ai_generations.user_id\",\n\t\t\t\t\t)\n\t\t\t\t\t.select((eb) => [\n\t\t\t\t\t\t\"lucid_ai_generations.id\",\n\t\t\t\t\t\t\"lucid_ai_generations.request_id\",\n\t\t\t\t\t\t\"lucid_ai_generations.provider_request_id\",\n\t\t\t\t\t\t\"lucid_ai_generations.feature_key\",\n\t\t\t\t\t\t\"lucid_ai_generations.feature_version\",\n\t\t\t\t\t\t\"lucid_ai_generations.user_id\",\n\t\t\t\t\t\t\"lucid_ai_generations.target_type\",\n\t\t\t\t\t\t\"lucid_ai_generations.target\",\n\t\t\t\t\t\t\"lucid_ai_generations.usage\",\n\t\t\t\t\t\t\"lucid_ai_generations.model\",\n\t\t\t\t\t\t\"lucid_ai_generations.cost_currency\",\n\t\t\t\t\t\t\"lucid_ai_generations.cost_total_minor\",\n\t\t\t\t\t\t\"lucid_ai_generations.duration_ms\",\n\t\t\t\t\t\t\"lucid_ai_generations.status\",\n\t\t\t\t\t\t\"lucid_ai_generations.error_message\",\n\t\t\t\t\t\t\"lucid_ai_generations.created_at\",\n\t\t\t\t\t\t\"lucid_users.email\",\n\t\t\t\t\t\t\"lucid_users.username\",\n\t\t\t\t\t\t\"lucid_users.first_name\",\n\t\t\t\t\t\t\"lucid_users.last_name\",\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\")\n\t\t\t\t\t\t\t\t\t.select((mediaEb) => [\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.id\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.key\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.origin\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.type\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.mime_type\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.file_extension\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.file_name\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.file_size\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.width\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.height\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.focal_x\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.focal_y\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.blur_hash\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.average_color\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.base64\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.is_dark\",\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.is_light\",\n\t\t\t\t\t\t\t\t\t\tactiveMediaCropSelect(\n\t\t\t\t\t\t\t\t\t\t\tthis.db,\n\t\t\t\t\t\t\t\t\t\t\tthis.dbAdapter,\n\t\t\t\t\t\t\t\t\t\t\t\"lucid_media.id\",\n\t\t\t\t\t\t\t\t\t\t),\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\tmediaEb\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\t\"lucid_media.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])\n\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\t\"lucid_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_users.profile_picture_media_id\",\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\t\t\t\t\"lucid_media.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(\"profile_picture\"),\n\t\t\t\t\t]);\n\n\t\t\t\tlet countQuery = this.db\n\t\t\t\t\t.selectFrom(\"lucid_ai_generations\")\n\t\t\t\t\t.leftJoin(\n\t\t\t\t\t\t\"lucid_users\",\n\t\t\t\t\t\t\"lucid_users.id\",\n\t\t\t\t\t\t\"lucid_ai_generations.user_id\",\n\t\t\t\t\t)\n\t\t\t\t\t.select(sql`count(*)`.as(\"count\"));\n\t\t\t\tmainQuery = queryBuilder.tenantScope(mainQuery, {\n\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\tcolumn: \"lucid_ai_generations.tenant_key\",\n\t\t\t\t});\n\t\t\t\tcountQuery = queryBuilder.tenantScope(countQuery, {\n\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\tcolumn: \"lucid_ai_generations.tenant_key\",\n\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{\n\t\t\t\tmethod: \"selectUsageMultiple\",\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\tschema: this.tableSchema.extend({\n\t\t\t\temail: z.string().nullable(),\n\t\t\t\tusername: z.string().nullable(),\n\t\t\t\tfirst_name: z.string().nullable(),\n\t\t\t\tlast_name: z.string().nullable(),\n\t\t\t\tprofile_picture: z.array(z.unknown()).optional(),\n\t\t\t}),\n\t\t\tselect: [\n\t\t\t\t\"id\",\n\t\t\t\t\"request_id\",\n\t\t\t\t\"provider_request_id\",\n\t\t\t\t\"feature_key\",\n\t\t\t\t\"feature_version\",\n\t\t\t\t\"user_id\",\n\t\t\t\t\"target_type\",\n\t\t\t\t\"target\",\n\t\t\t\t\"usage\",\n\t\t\t\t\"model\",\n\t\t\t\t\"cost_currency\",\n\t\t\t\t\"cost_total_minor\",\n\t\t\t\t\"duration_ms\",\n\t\t\t\t\"status\",\n\t\t\t\t\"error_message\",\n\t\t\t\t\"created_at\",\n\t\t\t\t\"email\",\n\t\t\t\t\"username\",\n\t\t\t\t\"first_name\",\n\t\t\t\t\"last_name\",\n\t\t\t\t\"profile_picture\",\n\t\t\t],\n\t\t});\n\t}\n}\n"],"mappings":"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Ac,EAAK,SAE9B,KAAK,iBAAiB,EAAM,CAClC,GAAG,EAAM,WACT,KAAM,WACN,OAAQ,KAAK,YAAY,KAAK,CAC7B,WAAY,GACZ,YAAa,GACb,MAAO,GACP,cAAe,GACf,iBAAkB,EACnB,CAAC,EACD,OAAQ,CACP,aACA,cACA,QACA,gBACA,kBACD,CACD,CAAC,CACF,CAEA,MAAM,oBACL,EAOC,CACD,IAAM,EAAO,MAAM,KAAK,aACvB,SAAY,CACX,IAAI,EAAY,KAAK,GACnB,WAAW,sBAAsB,CAAC,CAClC,SACA,cACA,iBACA,8BACD,CAAC,CACA,OAAQ,GAAO,CACf,0BACA,kCACA,2CACA,mCACA,uCACA,+BACA,mCACA,8BACA,6BACA,6BACA,qCACA,wCACA,mCACA,8BACA,qCACA,kCACA,oBACA,uBACA,yBACA,wBACA,KAAK,UACH,cACA,EACE,WAAW,aAAa,CAAC,CACzB,OAAQ,GAAY,CACpB,iBACA,kBACA,qBACA,mBACA,wBACA,6BACA,wBACA,wBACA,oBACA,qBACA,sBACA,sBACA,wBACA,4BACA,qBACA,sBACA,uBACA,EACC,KAAK,GACL,KAAK,UACL,gBACD,EACA,KAAK,UACH,cACA,EACE,WAAW,0BAA0B,CAAC,CACtC,OAAO,CACP,iCACA,+BACA,uCACA,mCACA,sCACD,CAAC,CAAC,CACD,SACA,oCACA,IACA,gBACD,CACF,CAAC,CACA,GAAG,cAAc,CACpB,CAAC,CAAC,CACD,SACA,iBACA,IACA,sCACD,CAAC,CACA,MACA,yBACA,IACA,KAAK,UAAU,WAAW,UAAW,OAAO,CAC7C,CACF,CAAC,CACA,GAAG,iBAAiB,CACvB,CAAC,EAEE,EAAa,KAAK,GACpB,WAAW,sBAAsB,CAAC,CAClC,SACA,cACA,iBACA,8BACD,CAAC,CACA,OAAO,CAAG,WAAW,GAAG,OAAO,CAAC,EAClC,EAAYA,EAAa,YAAY,EAAW,CAC/C,UAAW,EAAM,UACjB,OAAQ,iCACT,CAAC,EACD,EAAaA,EAAa,YAAY,EAAY,CACjD,UAAW,EAAM,UACjB,OAAQ,iCACT,CAAC,EAED,GAAM,CAAE,OAAM,SAAUA,EAAa,KACpC,CACC,KAAM,EACN,MAAO,CACR,EACA,CACC,YAAa,EAAM,YACnB,SAAU,KAAK,UAAU,OACzB,KAAM,KAAK,WACZ,CACD,EAEM,CAAC,EAAY,GAAe,MAAM,QAAQ,IAAI,CACnD,EAAK,QAAQ,EACb,GAAO,iBAAiB,CACzB,CAAC,EAED,MAAO,CAAC,EAAY,CAAW,CAChC,EACA,CACC,OAAQ,qBACT,CACD,EAGA,OAFI,EAAK,SAAS,MAAc,EAAK,SAE9B,KAAK,iBAAiB,EAAM,CAClC,GAAG,EAAM,WACT,KAAM,iBACN,OAAQ,KAAK,YAAY,OAAO,CAC/B,MAAO,EAAE,OAAO,CAAC,CAAC,SAAS,EAC3B,SAAU,EAAE,OAAO,CAAC,CAAC,SAAS,EAC9B,WAAY,EAAE,OAAO,CAAC,CAAC,SAAS,EAChC,UAAW,EAAE,OAAO,CAAC,CAAC,SAAS,EAC/B,gBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAChD,CAAC,EACD,OAAQ,CACP,KACA,aACA,sBACA,cACA,kBACA,UACA,cACA,SACA,QACA,QACA,gBACA,mBACA,cACA,SACA,gBACA,aACA,QACA,WACA,aACA,YACA,iBACD,CACD,CAAC,CACF,CACD"}