@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 7.09 kB
Source Map (JSON)
{"version":3,"file":"create-single.mjs","names":["roleServices.validatePermissions"],"sources":["../../../src/services/roles/create-single.ts"],"sourcesContent":["import { copy } from \"../../libs/i18n/index.js\";\nimport { isCorePermission } from \"../../libs/permission/registry.js\";\nimport {\n\tRolePermissionsRepository,\n\tRolesRepository,\n\tRoleTranslationsRepository,\n} from \"../../libs/repositories/index.js\";\nimport { getTenantConfig } from \"../../utils/helpers/index.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport { roleServices } from \"../index.js\";\nimport {\n\tgetTranslationValue,\n\tprepareRoleTranslations,\n\ttype RoleTranslationInput,\n} from \"./helpers/role-translations.js\";\n\nconst createSingle: ServiceFn<\n\t[\n\t\t{\n\t\t\tname: RoleTranslationInput;\n\t\t\tdescription?: RoleTranslationInput;\n\t\t\tpermissions: string[];\n\t\t\ttenantKey?: string | null;\n\t\t\tauthSuperAdmin: boolean;\n\t\t},\n\t],\n\tnumber\n> = async (context, data) => {\n\tconst Roles = new RolesRepository(context.db.client, context.config.db);\n\tconst RoleTranslations = new RoleTranslationsRepository(\n\t\tcontext.db.client,\n\t\tcontext.config.db,\n\t);\n\tconst defaultRoleLocale = context.config.i18n.defaultLocale;\n\n\tconst defaultName = getTranslationValue(data.name, defaultRoleLocale);\n\tconst defaultDescription = getTranslationValue(\n\t\tdata.description,\n\t\tdefaultRoleLocale,\n\t);\n\tconst tenantKey =\n\t\tdata.tenantKey === undefined\n\t\t\t? (context.request.tenantKey ?? null)\n\t\t\t: data.tenantKey;\n\n\t/**\n\t * Explicit tenant assignment can move a role across tenant boundaries, so it is super-admin only.\n\t */\n\tif (data.tenantKey !== undefined && !data.authSuperAdmin) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.permissions.denied\"),\n\t\t\t\tstatus: 403,\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tif (!defaultName || defaultName.length < 2) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.errors.validation.message\"),\n\t\t\t\tstatus: 400,\n\t\t\t\terrors: {\n\t\t\t\t\tname: {\n\t\t\t\t\t\tcode: \"invalid\",\n\t\t\t\t\t\tmessage: copy(\"server:core.fields.validation.required\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tif (\n\t\ttenantKey !== null &&\n\t\tgetTenantConfig(context.config, tenantKey) === undefined\n\t) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.tenants.unknown\", {\n\t\t\t\t\tdata: { key: tenantKey },\n\t\t\t\t}),\n\t\t\t\tstatus: 400,\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst [validatePermsRes, checkNameIsUniqueRes] = await Promise.all([\n\t\troleServices.validatePermissions(context, {\n\t\t\tpermissions: data.permissions,\n\t\t}),\n\t\tRoles.selectRoleIdByTranslationName({\n\t\t\tname: defaultName,\n\t\t\tlocaleCode: defaultRoleLocale,\n\t\t\ttenantKey,\n\t\t}),\n\t]);\n\tif (validatePermsRes.error) return validatePermsRes;\n\tif (checkNameIsUniqueRes.error) return checkNameIsUniqueRes;\n\n\tif (checkNameIsUniqueRes.data !== undefined) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tmessage: copy(\"server:core.validation.unique.message\"),\n\t\t\t\tstatus: 400,\n\t\t\t\terrors: {\n\t\t\t\t\tname: {\n\t\t\t\t\t\tcode: \"invalid\",\n\t\t\t\t\t\tmessage: copy(\"server:core.validation.unique.message\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst newRolesRes = await Roles.createSingle({\n\t\tdata: {\n\t\t\ttenant_key: tenantKey,\n\t\t},\n\t\treturning: [\"id\"],\n\t\tvalidation: {\n\t\t\tenabled: true,\n\t\t},\n\t});\n\tif (newRolesRes.error) return newRolesRes;\n\n\tconst translations = prepareRoleTranslations({\n\t\tname: data.name,\n\t\tdescription: data.description,\n\t\troleId: newRolesRes.data.id,\n\t});\n\tif (\n\t\ttranslations.every(\n\t\t\t(translation) => translation.locale_code !== defaultRoleLocale,\n\t\t)\n\t) {\n\t\ttranslations.push({\n\t\t\trole_id: newRolesRes.data.id,\n\t\t\tlocale_code: defaultRoleLocale,\n\t\t\tname: defaultName,\n\t\t\tdescription: defaultDescription ?? null,\n\t\t});\n\t}\n\tif (translations.length > 0) {\n\t\tconst roleTranslationsRes = await RoleTranslations.upsertMultiple({\n\t\t\tdata: translations,\n\t\t\treturning: [\"id\"],\n\t\t\tvalidation: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t});\n\t\tif (roleTranslationsRes.error) return roleTranslationsRes;\n\t}\n\n\tif (validatePermsRes.data.length > 0) {\n\t\tconst RolePermissions = new RolePermissionsRepository(\n\t\t\tcontext.db.client,\n\t\t\tcontext.config.db,\n\t\t);\n\t\tconst rolePermsRes = await RolePermissions.createMultiple({\n\t\t\tdata: validatePermsRes.data.map((p) => ({\n\t\t\t\trole_id: newRolesRes.data.id,\n\t\t\t\tpermission: p.permission,\n\t\t\t\tcore: isCorePermission(p.permission),\n\t\t\t})),\n\t\t});\n\t\tif (rolePermsRes.error) return rolePermsRes;\n\t}\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: newRolesRes.data.id,\n\t};\n};\n\nexport default createSingle;\n"],"mappings":"+eAgBA,MAAM,EAWF,MAAO,EAAS,IAAS,CAC5B,IAAM,EAAQ,IAAI,EAAgB,EAAQ,GAAG,OAAQ,EAAQ,OAAO,EAAE,EAChE,EAAmB,IAAI,EAC5B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAChB,EACM,EAAoB,EAAQ,OAAO,KAAK,cAExC,EAAc,EAAoB,EAAK,KAAM,CAAiB,EAC9D,EAAqB,EAC1B,EAAK,YACL,CACD,EACM,EACL,EAAK,YAAc,IAAA,GACf,EAAQ,QAAQ,WAAa,KAC9B,EAAK,UAKT,GAAI,EAAK,YAAc,IAAA,IAAa,CAAC,EAAK,eACzC,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,gCAAgC,EAC9C,OAAQ,GACT,EACA,KAAM,IAAA,EACP,EAGD,GAAI,CAAC,GAAe,EAAY,OAAS,EACxC,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,uCAAuC,EACrD,OAAQ,IACR,OAAQ,CACP,KAAM,CACL,KAAM,UACN,QAAS,EAAK,wCAAwC,CACvD,CACD,CACD,EACA,KAAM,IAAA,EACP,EAGD,GACC,IAAc,MACd,EAAgB,EAAQ,OAAQ,CAAS,IAAM,IAAA,GAE/C,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,8BAA+B,CAC5C,KAAM,CAAE,IAAK,CAAU,CACxB,CAAC,EACD,OAAQ,GACT,EACA,KAAM,IAAA,EACP,EAGD,GAAM,CAAC,EAAkB,GAAwB,MAAM,QAAQ,IAAI,CAClEA,EAAiC,EAAS,CACzC,YAAa,EAAK,WACnB,CAAC,EACD,EAAM,8BAA8B,CACnC,KAAM,EACN,WAAY,EACZ,WACD,CAAC,CACF,CAAC,EACD,GAAI,EAAiB,MAAO,OAAO,EACnC,GAAI,EAAqB,MAAO,OAAO,EAEvC,GAAI,EAAqB,OAAS,IAAA,GACjC,MAAO,CACN,MAAO,CACN,KAAM,QACN,QAAS,EAAK,uCAAuC,EACrD,OAAQ,IACR,OAAQ,CACP,KAAM,CACL,KAAM,UACN,QAAS,EAAK,uCAAuC,CACtD,CACD,CACD,EACA,KAAM,IAAA,EACP,EAGD,IAAM,EAAc,MAAM,EAAM,aAAa,CAC5C,KAAM,CACL,WAAY,CACb,EACA,UAAW,CAAC,IAAI,EAChB,WAAY,CACX,QAAS,EACV,CACD,CAAC,EACD,GAAI,EAAY,MAAO,OAAO,EAE9B,IAAM,EAAe,EAAwB,CAC5C,KAAM,EAAK,KACX,YAAa,EAAK,YAClB,OAAQ,EAAY,KAAK,EAC1B,CAAC,EAaD,GAXC,EAAa,MACX,GAAgB,EAAY,cAAgB,CAC9C,GAEA,EAAa,KAAK,CACjB,QAAS,EAAY,KAAK,GAC1B,YAAa,EACb,KAAM,EACN,YAAa,GAAsB,IACpC,CAAC,EAEE,EAAa,OAAS,EAAG,CAC5B,IAAM,EAAsB,MAAM,EAAiB,eAAe,CACjE,KAAM,EACN,UAAW,CAAC,IAAI,EAChB,WAAY,CACX,QAAS,EACV,CACD,CAAC,EACD,GAAI,EAAoB,MAAO,OAAO,CACvC,CAEA,GAAI,EAAiB,KAAK,OAAS,EAAG,CAKrC,IAAM,EAAe,MAAM,IAJC,EAC3B,EAAQ,GAAG,OACX,EAAQ,OAAO,EAEyB,CAAC,CAAC,eAAe,CACzD,KAAM,EAAiB,KAAK,IAAK,IAAO,CACvC,QAAS,EAAY,KAAK,GAC1B,WAAY,EAAE,WACd,KAAM,EAAiB,EAAE,UAAU,CACpC,EAAE,CACH,CAAC,EACD,GAAI,EAAa,MAAO,OAAO,CAChC,CAEA,MAAO,CACN,MAAO,IAAA,GACP,KAAM,EAAY,KAAK,EACxB,CACD"}