@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 14.8 kB
Source Map (JSON)
{"version":3,"file":"client-integrations.mjs","names":[],"sources":["../../src/schemas/client-integrations.ts"],"sourcesContent":["import z from \"zod\";\nimport { resolvedAdminCopySchema } from \"../libs/i18n/index.js\";\nimport type { ControllerSchema } from \"../types.js\";\nimport { queryFormatted, queryString } from \"./helpers/querystring.js\";\n\nconst clientScopeSchema = z.string().min(1);\n\nexport const clientIntegrationResponseSchema = z.object({\n\tid: z.number().meta({\n\t\tdescription: \"The client integration ID\",\n\t\texample: \"26\",\n\t}),\n\tkey: z.string().meta({\n\t\tdescription:\n\t\t\t\"A short unique key used to authenticate client query requests\",\n\t\texample: \"bd61bb\",\n\t}),\n\tname: z.string().min(2).meta({\n\t\tdescription: \"The name of the client\",\n\t\texample: \"Marketing Website\",\n\t}),\n\tdescription: z.string().nullable().meta({\n\t\tdescription: \"A description of the client\",\n\t\texample: \"The Astro marketing site at example.com\",\n\t}),\n\tenabled: z.boolean().meta({\n\t\tdescription:\n\t\t\t\"Whether or not the client is active. If inactive you wont be able to use it to query data\",\n\t\texample: true,\n\t}),\n\tscopes: z.array(clientScopeSchema).meta({\n\t\tdescription: \"The scopes this client integration has access to.\",\n\t\texample: [\"documents:pages:read\", \"media:read\"],\n\t}),\n\tlastUsedAt: z.string().nullable().meta({\n\t\tdescription: \"The time the client integration was last used\",\n\t\texample: \"2022-01-01T00:00:00Z\",\n\t}),\n\tlastUsedIp: z.string().nullable().meta({\n\t\tdescription: \"The last IP address that used the client integration\",\n\t\texample: \"203.0.113.42\",\n\t}),\n\tlastUsedUserAgent: z.string().nullable().meta({\n\t\tdescription: \"The last user agent that used the client integration\",\n\t\texample: \"Mozilla/5.0\",\n\t}),\n\tcreatedAt: z.string().nullable().meta({\n\t\tdescription: \"The time the client integration was created\",\n\t\texample: \"2022-01-01T00:00:00Z\",\n\t}),\n\tupdatedAt: z.string().nullable().meta({\n\t\tdescription: \"The time the client integration was last updated\",\n\t\texample: \"2022-01-01T00:00:00Z\",\n\t}),\n});\n\nconst clientIntegrationScopeGroupResponseSchema = z.object({\n\tkey: z.string().meta({\n\t\tdescription: \"The scope group key\",\n\t\texample: \"documents:pages\",\n\t}),\n\tdetails: z.object({\n\t\tname: resolvedAdminCopySchema,\n\t\tdescription: resolvedAdminCopySchema.nullable().optional(),\n\t}),\n\tscopes: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\tkey: clientScopeSchema,\n\t\t\t\tdetails: z.object({\n\t\t\t\t\tname: resolvedAdminCopySchema,\n\t\t\t\t\tdescription: resolvedAdminCopySchema.nullable().optional(),\n\t\t\t\t}),\n\t\t\t}),\n\t\t)\n\t\t.meta({\n\t\t\tdescription: \"The scopes for this scope group\",\n\t\t}),\n});\n\nexport const controllerSchemas = {\n\tcreateSingle: {\n\t\tbody: z.object({\n\t\t\tname: z.string().trim().min(2).meta({\n\t\t\t\tdescription: \"The name of the client\",\n\t\t\t\texample: \"Marketing Website\",\n\t\t\t}),\n\t\t\tdescription: z\n\t\t\t\t.string()\n\t\t\t\t.trim()\n\t\t\t\t.meta({\n\t\t\t\t\tdescription: \"A description of the client\",\n\t\t\t\t\texample: \"The Astro marketing site at example.com\",\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tenabled: z\n\t\t\t\t.boolean()\n\t\t\t\t.meta({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Whether or not the client is active. If inactive you wont be able to use it to query data\",\n\t\t\t\t\texample: true,\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tscopes: z.array(clientScopeSchema).meta({\n\t\t\t\tdescription: \"Scopes granted to this client integration.\",\n\t\t\t\texample: [\"documents:pages:read\"],\n\t\t\t}),\n\t\t}),\n\t\tquery: {\n\t\t\tstring: undefined,\n\t\t\tformatted: undefined,\n\t\t},\n\t\tparams: undefined,\n\t\tresponse: z.object({\n\t\t\tapiKey: z.string().meta({\n\t\t\t\tdescription:\n\t\t\t\t\t\"A unique token used to authenticate client endpoint requests. You'll only ever see this value once so keep it safe\",\n\t\t\t\texample:\n\t\t\t\t\t\"3084d4531c41ca6db79f422a4426361176461667280556c333ffcff530486a1e\",\n\t\t\t}),\n\t\t}),\n\t} satisfies ControllerSchema,\n\tdeleteSingle: {\n\t\tbody: undefined,\n\t\tquery: {\n\t\t\tstring: undefined,\n\t\t\tformatted: undefined,\n\t\t},\n\t\tparams: z.object({\n\t\t\tid: z.string().trim().meta({\n\t\t\t\tdescription: \"The client integration ID you want to delete\",\n\t\t\t\texample: \"1\",\n\t\t\t}),\n\t\t}),\n\t\tresponse: undefined,\n\t} satisfies ControllerSchema,\n\tgetAll: {\n\t\tbody: undefined,\n\t\tquery: {\n\t\t\tstring: z\n\t\t\t\t.object({\n\t\t\t\t\t\"filter[key]\": queryString.schema.filter(false, {\n\t\t\t\t\t\texample: \"bd61bb\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"filter[name]\": queryString.schema.filter(false, {\n\t\t\t\t\t\texample: \"Marketing Website\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"filter[enabled]\": queryString.schema.filter(false, {\n\t\t\t\t\t\texample: \"1\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"filter[description]\": queryString.schema.filter(false, {\n\t\t\t\t\t\texample: \"Marketing website\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"filter[scope]\": queryString.schema.filter(true, {\n\t\t\t\t\t\texample: \"documents:pages:read\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"filter[lastUsedAt]\": queryString.schema.filter(false, {\n\t\t\t\t\t\texample: \"2026-01-01T00:00:00Z\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"filter[lastUsedIp]\": queryString.schema.filter(false, {\n\t\t\t\t\t\texample: \"203.0.113.42\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"filter[createdAt]\": queryString.schema.filter(false, {\n\t\t\t\t\t\texample: \"2026-01-01T00:00:00Z\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"filter[updatedAt]\": queryString.schema.filter(false, {\n\t\t\t\t\t\texample: \"2026-01-01T00:00:00Z\",\n\t\t\t\t\t}),\n\t\t\t\t\tsort: queryString.schema.sort(\"name,description,enabled,createdAt\"),\n\t\t\t\t\tpage: queryString.schema.page,\n\t\t\t\t\tperPage: queryString.schema.perPage,\n\t\t\t\t})\n\t\t\t\t.meta(queryString.meta),\n\t\t\tformatted: z.object({\n\t\t\t\tfilter: z\n\t\t\t\t\t.object({\n\t\t\t\t\t\tkey: queryFormatted.schema.filters.single.optional(),\n\t\t\t\t\t\tname: queryFormatted.schema.filters.single.optional(),\n\t\t\t\t\t\tdescription: queryFormatted.schema.filters.single.optional(),\n\t\t\t\t\t\tenabled: queryFormatted.schema.filters.single.optional(),\n\t\t\t\t\t\tscope: queryFormatted.schema.filters.union.optional(),\n\t\t\t\t\t\tlastUsedAt: queryFormatted.schema.filters.single.optional(),\n\t\t\t\t\t\tlastUsedIp: queryFormatted.schema.filters.single.optional(),\n\t\t\t\t\t\tcreatedAt: queryFormatted.schema.filters.single.optional(),\n\t\t\t\t\t\tupdatedAt: queryFormatted.schema.filters.single.optional(),\n\t\t\t\t\t})\n\t\t\t\t\t.optional(),\n\t\t\t\tfilterOr: queryFormatted.schema.filterOr,\n\t\t\t\tsort: z\n\t\t\t\t\t.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\tkey: z.enum([\n\t\t\t\t\t\t\t\t\"name\",\n\t\t\t\t\t\t\t\t\"description\",\n\t\t\t\t\t\t\t\t\"enabled\",\n\t\t\t\t\t\t\t\t\"createdAt\",\n\t\t\t\t\t\t\t\t\"updatedAt\",\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\tdirection: z.enum([\"asc\", \"desc\"]),\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\t.optional(),\n\t\t\t\tpage: queryFormatted.schema.page,\n\t\t\t\tperPage: queryFormatted.schema.perPage,\n\t\t\t\tinclude: z.array(z.string()).optional(),\n\t\t\t\texclude: z.array(z.string()).optional(),\n\t\t\t}),\n\t\t},\n\t\tparams: undefined,\n\t\tresponse: z.array(clientIntegrationResponseSchema),\n\t} satisfies ControllerSchema,\n\tgetSingle: {\n\t\tbody: undefined,\n\t\tquery: {\n\t\t\tstring: undefined,\n\t\t\tformatted: undefined,\n\t\t},\n\t\tparams: z.object({\n\t\t\tid: z.string().trim().meta({\n\t\t\t\tdescription: \"The client integration ID\",\n\t\t\t\texample: \"1\",\n\t\t\t}),\n\t\t}),\n\t\tresponse: clientIntegrationResponseSchema,\n\t} satisfies ControllerSchema,\n\tgetScopes: {\n\t\tbody: undefined,\n\t\tquery: {\n\t\t\tstring: undefined,\n\t\t\tformatted: undefined,\n\t\t},\n\t\tparams: undefined,\n\t\tresponse: z.array(clientIntegrationScopeGroupResponseSchema),\n\t} satisfies ControllerSchema,\n\tregenerateKeys: {\n\t\tbody: undefined,\n\t\tquery: {\n\t\t\tstring: undefined,\n\t\t\tformatted: undefined,\n\t\t},\n\t\tparams: z.object({\n\t\t\tid: z.string().trim().meta({\n\t\t\t\tdescription: \"The client integration ID\",\n\t\t\t\texample: \"1\",\n\t\t\t}),\n\t\t}),\n\t\tresponse: z.object({\n\t\t\tapiKey: z.string().meta({\n\t\t\t\tdescription:\n\t\t\t\t\t\"A unique token used to authenticate client endpoint requests. You'll only ever see this value once so keep it safe\",\n\t\t\t\texample:\n\t\t\t\t\t\"3084d4531c41ca6db79f422a4426361176461667280556c333ffcff530486a1e\",\n\t\t\t}),\n\t\t}),\n\t} satisfies ControllerSchema,\n\tupdateSingle: {\n\t\tbody: z.object({\n\t\t\tname: z\n\t\t\t\t.string()\n\t\t\t\t.trim()\n\t\t\t\t.min(2)\n\t\t\t\t.meta({\n\t\t\t\t\tdescription: \"The name of the client\",\n\t\t\t\t\texample: \"Marketing Website\",\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tdescription: z\n\t\t\t\t.string()\n\t\t\t\t.trim()\n\t\t\t\t.meta({\n\t\t\t\t\tdescription: \"A description of the client\",\n\t\t\t\t\texample: \"The Astro marketing site at example.com\",\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tenabled: z\n\t\t\t\t.boolean()\n\t\t\t\t.meta({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Whether or not the client is active. If inactive you wont be able to use it to query data\",\n\t\t\t\t\texample: true,\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tscopes: z\n\t\t\t\t.array(clientScopeSchema)\n\t\t\t\t.meta({\n\t\t\t\t\tdescription: \"Scopes granted to this client integration.\",\n\t\t\t\t\texample: [\"media:read\", \"media:process\"],\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t}),\n\t\tquery: {\n\t\t\tstring: undefined,\n\t\t\tformatted: undefined,\n\t\t},\n\t\tparams: z.object({\n\t\t\tid: z.string().trim().meta({\n\t\t\t\tdescription: \"The client integration ID\",\n\t\t\t\texample: \"1\",\n\t\t\t}),\n\t\t}),\n\t\tresponse: undefined,\n\t} satisfies ControllerSchema,\n};\n\nexport type GetAllQueryParams = z.infer<\n\ttypeof controllerSchemas.getAll.query.formatted\n>;\n"],"mappings":"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"}