@webiny/api-headless-cms 5.34.3-beta.0 → 5.34.3-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/crud/contentModel/beforeCreate.d.ts +2 -3
- package/crud/contentModel/beforeCreate.js +4 -4
- package/crud/contentModel/beforeCreate.js.map +1 -1
- package/crud/contentModel/beforeUpdate.d.ts +2 -4
- package/crud/contentModel/beforeUpdate.js +2 -2
- package/crud/contentModel/beforeUpdate.js.map +1 -1
- package/crud/contentModel/validateModel.d.ts +3 -4
- package/crud/contentModel/validateModel.js +6 -3
- package/crud/contentModel/validateModel.js.map +1 -1
- package/crud/contentModel/validateModelFields.d.ts +3 -4
- package/crud/contentModel/validateModelFields.js +74 -6
- package/crud/contentModel/validateModelFields.js.map +1 -1
- package/crud/contentModel.crud.js +3 -18
- package/crud/contentModel.crud.js.map +1 -1
- package/graphql/buildSchemaPlugins.d.ts +7 -2
- package/graphql/buildSchemaPlugins.js +3 -6
- package/graphql/buildSchemaPlugins.js.map +1 -1
- package/graphql/createExecutableSchema.d.ts +7 -0
- package/graphql/createExecutableSchema.js +33 -0
- package/graphql/createExecutableSchema.js.map +1 -0
- package/graphql/generateSchema.d.ts +8 -0
- package/graphql/generateSchema.js +38 -0
- package/graphql/generateSchema.js.map +1 -0
- package/graphql/graphQLHandlerFactory.js +68 -71
- package/graphql/graphQLHandlerFactory.js.map +1 -1
- package/graphql/index.d.ts +1 -3
- package/graphql/index.js +2 -41
- package/graphql/index.js.map +1 -1
- package/graphql/schema/baseContentSchema.d.ts +5 -1
- package/graphql/schema/baseContentSchema.js +3 -1
- package/graphql/schema/baseContentSchema.js.map +1 -1
- package/graphql/schema/baseSchema.d.ts +3 -0
- package/graphql/schema/baseSchema.js +58 -0
- package/graphql/schema/baseSchema.js.map +1 -0
- package/graphql/schema/contentEntries.d.ts +5 -1
- package/graphql/schema/contentEntries.js +3 -1
- package/graphql/schema/contentEntries.js.map +1 -1
- package/graphql/schema/contentModelGroups.d.ts +5 -1
- package/graphql/schema/contentModelGroups.js +3 -1
- package/graphql/schema/contentModelGroups.js.map +1 -1
- package/graphql/schema/contentModels.d.ts +5 -1
- package/graphql/schema/contentModels.js +3 -1
- package/graphql/schema/contentModels.js.map +1 -1
- package/graphql/schema/schemaPlugins.d.ts +7 -2
- package/graphql/schema/schemaPlugins.js +45 -43
- package/graphql/schema/schemaPlugins.js.map +1 -1
- package/index.d.ts +1 -1
- package/package.json +23 -23
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ensureTypeTag","model","tags","some","tag","startsWith","push","createModelsCrud","params","getTenant","getIdentity","getLocale","storageOperations","context","loaders","listModels","DataLoader","models","list","where","tenant","id","locale","code","map","clearModelsCache","loader","Object","values","clearAll","managers","Map","updateManager","manager","contentModelManagerFactory","set","modelId","checkModelPermissions","check","checkPermissions","rwd","getModelsAsPlugins","plugins","byType","CmsModelPlugin","type","filter","plugin","modelTenant","modelLocale","contentModel","webinyVersion","WEBINY_VERSION","validateModelFields","modelsGet","pluginModel","find","get","NotFoundError","modelsList","databaseModels","load","pluginsModels","concat","permission","filterAsync","validateOwnership","validateModelAccess","getModel","checkOwnership","checkModelAccess","getModelManager","target","has","m","onModelBeforeCreate","createTopic","onModelAfterCreate","onModelCreateError","onModelBeforeCreateFrom","onModelAfterCreateFrom","onModelCreateFromError","onModelBeforeUpdate","onModelAfterUpdate","onModelUpdateError","onModelBeforeDelete","onModelAfterDelete","onModelDeleteError","onModelInitialize","assignModelBeforeCreate","assignModelAfterCreate","assignModelBeforeUpdate","assignModelAfterUpdate","assignModelAfterCreateFrom","assignModelBeforeDelete","assignModelAfterDelete","onBeforeModelCreate","onAfterModelCreate","onBeforeModelCreateFrom","onAfterModelCreateFrom","onBeforeModelUpdate","onAfterModelUpdate","onBeforeModelDelete","onAfterModelDelete","createModel","inputData","createdData","CreateContentModelModel","populate","validate","input","toJSON","security","disableAuthorization","group","cms","getGroup","enableAuthorization","fields","createFieldModels","identity","name","description","titleFieldId","createdBy","displayName","createdOn","Date","toISOString","savedOn","lockedFields","layout","publish","createdModel","create","ex","error","updateModelDirect","initialModel","original","resultModel","update","createModelFrom","data","CreateContentModelModelFrom","i18n","groups","updateModel","updatedData","UpdateContentModelModel","onlyDirty","keys","length","groupData","deleteModel","delete","WebinyError","message","initializeModel","getEntryManager","getManagers","getEntryManagers"],"sources":["contentModel.crud.ts"],"sourcesContent":["import {\n CmsContext,\n CmsModel,\n CmsModelContext,\n CmsModelManager,\n HeadlessCmsStorageOperations,\n OnModelBeforeCreateTopicParams,\n OnModelAfterCreateTopicParams,\n OnModelBeforeUpdateTopicParams,\n OnModelAfterUpdateTopicParams,\n OnModelBeforeDeleteTopicParams,\n OnModelAfterDeleteTopicParams,\n OnModelInitializeParams,\n OnModelBeforeCreateFromTopicParams,\n OnModelAfterCreateFromTopicParams,\n CmsModelCreateInput,\n CmsModelUpdateInput,\n CmsModelCreateFromInput,\n OnModelCreateErrorTopicParams,\n OnModelCreateFromErrorParams,\n OnModelUpdateErrorTopicParams,\n OnModelDeleteErrorTopicParams\n} from \"~/types\";\nimport DataLoader from \"dataloader\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { contentModelManagerFactory } from \"./contentModel/contentModelManagerFactory\";\nimport {\n CreateContentModelModel,\n CreateContentModelModelFrom,\n UpdateContentModelModel\n} from \"./contentModel/models\";\nimport { createFieldModels } from \"./contentModel/createFieldModels\";\nimport WebinyError from \"@webiny/error\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { assignModelBeforeCreate } from \"./contentModel/beforeCreate\";\nimport { assignModelBeforeUpdate } from \"./contentModel/beforeUpdate\";\nimport { assignModelBeforeDelete } from \"./contentModel/beforeDelete\";\nimport { assignModelAfterCreate } from \"./contentModel/afterCreate\";\nimport { assignModelAfterUpdate } from \"./contentModel/afterUpdate\";\nimport { assignModelAfterDelete } from \"./contentModel/afterDelete\";\nimport { assignModelAfterCreateFrom } from \"./contentModel/afterCreateFrom\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin\";\nimport { checkPermissions } from \"~/utils/permissions\";\nimport { filterAsync } from \"~/utils/filterAsync\";\nimport { checkOwnership, validateOwnership } from \"~/utils/ownership\";\nimport { checkModelAccess, validateModelAccess } from \"~/utils/access\";\nimport { validateModelFields } from \"~/crud/contentModel/validateModelFields\";\n\n/**\n * Given a model, return an array of tags ensuring the `type` tag is set.\n */\nconst ensureTypeTag = (model: Pick<CmsModel, \"tags\">) => {\n // Let's make sure we have a `type` tag assigned.\n // If `type` tag is not set, set it to a default one (`model`).\n const tags = model.tags || [];\n if (!tags.some(tag => tag.startsWith(\"type:\"))) {\n tags.push(\"type:model\");\n }\n\n return tags;\n};\n\nexport interface CreateModelsCrudParams {\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n storageOperations: HeadlessCmsStorageOperations;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n}\n\nexport const createModelsCrud = (params: CreateModelsCrudParams): CmsModelContext => {\n const { getTenant, getIdentity, getLocale, storageOperations, context } = params;\n\n const loaders = {\n listModels: new DataLoader(async () => {\n const models = await storageOperations.models.list({\n where: {\n tenant: getTenant().id,\n locale: getLocale().code\n }\n });\n return [\n models.map(model => {\n return {\n ...model,\n tags: ensureTypeTag(model),\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n })\n ];\n })\n };\n\n const clearModelsCache = (): void => {\n for (const loader of Object.values(loaders)) {\n loader.clearAll();\n }\n };\n\n const managers = new Map<string, CmsModelManager>();\n const updateManager = async (\n context: CmsContext,\n model: CmsModel\n ): Promise<CmsModelManager> => {\n const manager = await contentModelManagerFactory(context, model);\n managers.set(model.modelId, manager);\n return manager;\n };\n\n const checkModelPermissions = (check: string) => {\n return checkPermissions(context, \"cms.contentModel\", { rwd: check });\n };\n\n const getModelsAsPlugins = (): CmsModel[] => {\n const tenant = getTenant().id;\n const locale = getLocale().code;\n\n const models = context.plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n /**\n * We need to filter out models that are not for this tenant or locale.\n * If it does not have tenant or locale define, it is for every locale and tenant\n */\n .filter(plugin => {\n const { tenant: modelTenant, locale: modelLocale } = plugin.contentModel;\n if (modelTenant && modelTenant !== tenant) {\n return false;\n } else if (modelLocale && modelLocale !== locale) {\n return false;\n }\n return true;\n })\n .map<CmsModel>(plugin => {\n return {\n ...plugin.contentModel,\n tags: ensureTypeTag(plugin.contentModel),\n tenant,\n locale,\n webinyVersion: context.WEBINY_VERSION\n };\n });\n /**\n * Only point where we can truly validate the user model is in the runtime.\n */\n for (const model of models) {\n validateModelFields({\n model,\n plugins: context.plugins\n });\n }\n return models;\n };\n\n const modelsGet = async (modelId: string): Promise<CmsModel> => {\n const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);\n\n if (pluginModel) {\n return pluginModel;\n }\n\n const model = await storageOperations.models.get({\n tenant: getTenant().id,\n locale: getLocale().code,\n modelId\n });\n\n if (!model) {\n throw new NotFoundError(`Content model \"${modelId}\" was not found!`);\n }\n\n return {\n ...model,\n tags: ensureTypeTag(model),\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n };\n\n const modelsList = async (): Promise<CmsModel[]> => {\n const databaseModels: CmsModel[] = await loaders.listModels.load(\"listModels\");\n\n const pluginsModels = getModelsAsPlugins();\n\n return databaseModels.concat(pluginsModels);\n };\n\n const listModels = async () => {\n const permission = await checkModelPermissions(\"r\");\n const models = await modelsList();\n return filterAsync(models, async model => {\n if (!validateOwnership(context, permission, model)) {\n return false;\n }\n return validateModelAccess(context, model);\n });\n };\n\n const getModel = async (modelId: string): Promise<CmsModel> => {\n const permission = await checkModelPermissions(\"r\");\n\n const model = await modelsGet(modelId);\n\n checkOwnership(context, permission, model);\n await checkModelAccess(context, model);\n\n return model;\n };\n\n const getModelManager: CmsModelContext[\"getModelManager\"] = async (\n target\n ): Promise<CmsModelManager> => {\n const modelId = typeof target === \"string\" ? target : target.modelId;\n if (managers.has(modelId)) {\n return managers.get(modelId) as CmsModelManager;\n }\n const models = await modelsList();\n const model = models.find(m => m.modelId === modelId);\n if (!model) {\n throw new NotFoundError(`There is no content model \"${modelId}\".`);\n }\n return await updateManager(context, model);\n };\n\n /**\n * Create\n */\n const onModelBeforeCreate =\n createTopic<OnModelBeforeCreateTopicParams>(\"cms.onModelBeforeCreate\");\n const onModelAfterCreate = createTopic<OnModelAfterCreateTopicParams>(\"cms.onModelAfterCreate\");\n const onModelCreateError = createTopic<OnModelCreateErrorTopicParams>(\"cms.onModelCreateError\");\n /**\n * Create from / clone\n */\n const onModelBeforeCreateFrom = createTopic<OnModelBeforeCreateFromTopicParams>(\n \"cms.onModelBeforeCreateFrom\"\n );\n const onModelAfterCreateFrom = createTopic<OnModelAfterCreateFromTopicParams>(\n \"cms.onModelAfterCreateFrom\"\n );\n const onModelCreateFromError = createTopic<OnModelCreateFromErrorParams>(\n \"cms.onModelCreateFromError\"\n );\n /**\n * Update\n */\n const onModelBeforeUpdate =\n createTopic<OnModelBeforeUpdateTopicParams>(\"cms.onModelBeforeUpdate\");\n const onModelAfterUpdate = createTopic<OnModelAfterUpdateTopicParams>(\"cms.onModelAfterUpdate\");\n const onModelUpdateError = createTopic<OnModelUpdateErrorTopicParams>(\"cms.onModelUpdateError\");\n /**\n * Delete\n */\n const onModelBeforeDelete =\n createTopic<OnModelBeforeDeleteTopicParams>(\"cms.onModelBeforeDelete\");\n const onModelAfterDelete = createTopic<OnModelAfterDeleteTopicParams>(\"cms.onModelAfterDelete\");\n const onModelDeleteError = createTopic<OnModelDeleteErrorTopicParams>(\"cms.onModelDeleteError\");\n /**\n * Initialize\n */\n const onModelInitialize = createTopic<OnModelInitializeParams>(\"cms.onModelInitialize\");\n /**\n * We need to assign some default behaviors.\n */\n assignModelBeforeCreate({\n onModelBeforeCreate,\n onModelBeforeCreateFrom,\n plugins: context.plugins,\n storageOperations\n });\n assignModelAfterCreate({\n context,\n onModelAfterCreate\n });\n assignModelBeforeUpdate({\n onModelBeforeUpdate,\n plugins: context.plugins,\n storageOperations\n });\n assignModelAfterUpdate({\n context,\n onModelAfterUpdate\n });\n assignModelAfterCreateFrom({\n context,\n onModelAfterCreateFrom\n });\n assignModelBeforeDelete({\n onModelBeforeDelete,\n plugins: context.plugins,\n storageOperations\n });\n assignModelAfterDelete({\n context,\n onModelAfterDelete\n });\n\n return {\n /**\n * Deprecated - will be removed in 5.36.0\n */\n onBeforeModelCreate: onModelBeforeCreate,\n onAfterModelCreate: onModelAfterCreate,\n onBeforeModelCreateFrom: onModelBeforeCreateFrom,\n onAfterModelCreateFrom: onModelAfterCreateFrom,\n onBeforeModelUpdate: onModelBeforeUpdate,\n onAfterModelUpdate: onModelAfterUpdate,\n onBeforeModelDelete: onModelBeforeDelete,\n onAfterModelDelete: onModelAfterDelete,\n /**\n * Released in 5.34.0\n */\n onModelBeforeCreate,\n onModelAfterCreate,\n onModelCreateError,\n onModelBeforeCreateFrom,\n onModelAfterCreateFrom,\n onModelCreateFromError,\n onModelBeforeUpdate,\n onModelAfterUpdate,\n onModelUpdateError,\n onModelBeforeDelete,\n onModelAfterDelete,\n onModelDeleteError,\n onModelInitialize,\n clearModelsCache,\n getModel,\n listModels,\n async createModel(inputData) {\n await checkModelPermissions(\"w\");\n\n const createdData = new CreateContentModelModel().populate(inputData);\n await createdData.validate();\n const input: CmsModelCreateInput = await createdData.toJSON();\n\n context.security.disableAuthorization();\n const group = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const fields = await createFieldModels(input.fields);\n\n const identity = getIdentity();\n const model: CmsModel = {\n name: input.name,\n description: input.description || \"\",\n modelId: input.modelId || \"\",\n titleFieldId: \"id\",\n locale: getLocale().code,\n tenant: getTenant().id,\n group: {\n id: group.id,\n name: group.name\n },\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n fields,\n lockedFields: [],\n layout: input.layout || [],\n tags: [...(input.tags || [])],\n webinyVersion: context.WEBINY_VERSION\n };\n\n model.tags = ensureTypeTag(model);\n\n try {\n await onModelBeforeCreate.publish({\n input,\n model\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onModelAfterCreate.publish({\n input,\n model: createdModel\n });\n\n return createdModel;\n } catch (ex) {\n await onModelCreateError.publish({\n input,\n model,\n error: ex\n });\n throw ex;\n }\n },\n /**\n * Method does not check for permissions or ownership.\n * @internal\n */\n async updateModelDirect(params) {\n const { model: initialModel, original } = params;\n\n const model: CmsModel = {\n ...initialModel,\n tenant: initialModel.tenant || getTenant().id,\n locale: initialModel.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION\n };\n\n try {\n await onModelBeforeUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n loaders.listModels.clearAll();\n\n await onModelAfterUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model: resultModel\n });\n\n return resultModel;\n } catch (ex) {\n await onModelUpdateError.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model,\n error: ex\n });\n throw ex;\n }\n },\n async createModelFrom(modelId, data) {\n await checkModelPermissions(\"w\");\n /**\n * Get a model record; this will also perform ownership validation.\n */\n const original = await getModel(modelId);\n\n const createdData = new CreateContentModelModelFrom().populate({\n name: data.name,\n modelId: data.modelId,\n description: data.description || original.description,\n group: data.group,\n locale: data.locale\n });\n\n await createdData.validate();\n const input: CmsModelCreateFromInput = await createdData.toJSON();\n\n const locale = await context.i18n.getLocale(input.locale || original.locale);\n if (!locale) {\n throw new NotFoundError(`There is no locale \"${input.locale}\".`);\n }\n /**\n * Use storage operations directly because we cannot get group from different locale via context methods.\n */\n const group = await context.cms.storageOperations.groups.get({\n id: input.group,\n tenant: original.tenant,\n locale: locale.code\n });\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const identity = getIdentity();\n const model: CmsModel = {\n ...original,\n locale: locale.code,\n group: {\n id: group.id,\n name: group.name\n },\n name: input.name,\n modelId: input.modelId || \"\",\n description: input.description || \"\",\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n lockedFields: [],\n webinyVersion: context.WEBINY_VERSION\n };\n\n try {\n await onModelBeforeCreateFrom.publish({\n input,\n model,\n original\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onModelAfterCreateFrom.publish({\n input,\n original,\n model: createdModel\n });\n\n return createdModel;\n } catch (ex) {\n await onModelCreateFromError.publish({\n input,\n original,\n model,\n error: ex\n });\n throw ex;\n }\n },\n async updateModel(modelId, inputData) {\n await checkModelPermissions(\"w\");\n\n // Get a model record; this will also perform ownership validation.\n const original = await getModel(modelId);\n\n const updatedData = new UpdateContentModelModel().populate(inputData);\n await updatedData.validate();\n\n const input: CmsModelUpdateInput = await updatedData.toJSON({ onlyDirty: true });\n if (Object.keys(input).length === 0) {\n /**\n * We need to return the original if nothing is to be updated.\n */\n return original;\n }\n let group: CmsModel[\"group\"] = {\n id: original.group.id,\n name: original.group.name\n };\n if (input.group) {\n context.security.disableAuthorization();\n const groupData = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!groupData) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n group = {\n id: groupData.id,\n name: groupData.name\n };\n }\n const fields = await createFieldModels(inputData.fields);\n const model: CmsModel = {\n ...original,\n ...input,\n group,\n tenant: original.tenant || getTenant().id,\n locale: original.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION,\n fields,\n savedOn: new Date().toISOString()\n };\n\n model.tags = ensureTypeTag(model);\n\n try {\n await onModelBeforeUpdate.publish({\n input,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n await onModelAfterUpdate.publish({\n input,\n original,\n model: resultModel\n });\n\n return resultModel;\n } catch (ex) {\n await onModelUpdateError.publish({\n input,\n model,\n original,\n error: ex\n });\n\n throw ex;\n }\n },\n async deleteModel(modelId) {\n await checkModelPermissions(\"d\");\n\n const model = await getModel(modelId);\n\n try {\n await onModelBeforeDelete.publish({\n model\n });\n\n try {\n await storageOperations.models.delete({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete the content model\",\n ex.code || \"CONTENT_MODEL_DELETE_ERROR\",\n {\n error: ex,\n modelId: model.modelId\n }\n );\n }\n\n await onModelAfterDelete.publish({\n model\n });\n\n managers.delete(model.modelId);\n } catch (ex) {\n await onModelDeleteError.publish({\n model,\n error: ex\n });\n throw ex;\n }\n },\n async initializeModel(modelId, data) {\n /**\n * We require that users have write permissions to initialize models.\n * Maybe introduce another permission for it?\n */\n await checkModelPermissions(\"w\");\n\n const model = await getModel(modelId);\n\n await onModelInitialize.publish({ model, data });\n\n return true;\n },\n getModelManager,\n getEntryManager: async model => {\n return getModelManager(model);\n },\n getManagers: () => managers,\n getEntryManagers: () => managers\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["ensureTypeTag","model","tags","some","tag","startsWith","push","createModelsCrud","params","getTenant","getIdentity","getLocale","storageOperations","context","loaders","listModels","DataLoader","models","list","where","tenant","id","locale","code","map","clearModelsCache","loader","Object","values","clearAll","managers","Map","updateManager","manager","contentModelManagerFactory","set","modelId","checkModelPermissions","check","checkPermissions","rwd","getModelsAsPlugins","plugins","byType","CmsModelPlugin","type","filter","plugin","modelTenant","modelLocale","contentModel","webinyVersion","WEBINY_VERSION","modelsGet","pluginModel","find","get","NotFoundError","modelsList","databaseModels","load","pluginsModels","concat","permission","filterAsync","validateOwnership","validateModelAccess","getModel","checkOwnership","checkModelAccess","getModelManager","target","has","m","onModelBeforeCreate","createTopic","onModelAfterCreate","onModelCreateError","onModelBeforeCreateFrom","onModelAfterCreateFrom","onModelCreateFromError","onModelBeforeUpdate","onModelAfterUpdate","onModelUpdateError","onModelBeforeDelete","onModelAfterDelete","onModelDeleteError","onModelInitialize","assignModelBeforeCreate","assignModelAfterCreate","assignModelBeforeUpdate","assignModelAfterUpdate","assignModelAfterCreateFrom","assignModelBeforeDelete","assignModelAfterDelete","onBeforeModelCreate","onAfterModelCreate","onBeforeModelCreateFrom","onAfterModelCreateFrom","onBeforeModelUpdate","onAfterModelUpdate","onBeforeModelDelete","onAfterModelDelete","createModel","inputData","createdData","CreateContentModelModel","populate","validate","input","toJSON","security","disableAuthorization","group","cms","getGroup","enableAuthorization","fields","createFieldModels","identity","name","description","titleFieldId","createdBy","displayName","createdOn","Date","toISOString","savedOn","lockedFields","layout","publish","createdModel","create","ex","error","updateModelDirect","initialModel","original","resultModel","update","createModelFrom","data","CreateContentModelModelFrom","i18n","groups","updateModel","updatedData","UpdateContentModelModel","onlyDirty","keys","length","groupData","deleteModel","delete","WebinyError","message","initializeModel","getEntryManager","getManagers","getEntryManagers"],"sources":["contentModel.crud.ts"],"sourcesContent":["import {\n CmsContext,\n CmsModel,\n CmsModelContext,\n CmsModelManager,\n HeadlessCmsStorageOperations,\n OnModelBeforeCreateTopicParams,\n OnModelAfterCreateTopicParams,\n OnModelBeforeUpdateTopicParams,\n OnModelAfterUpdateTopicParams,\n OnModelBeforeDeleteTopicParams,\n OnModelAfterDeleteTopicParams,\n OnModelInitializeParams,\n OnModelBeforeCreateFromTopicParams,\n OnModelAfterCreateFromTopicParams,\n CmsModelCreateInput,\n CmsModelUpdateInput,\n CmsModelCreateFromInput,\n OnModelCreateErrorTopicParams,\n OnModelCreateFromErrorParams,\n OnModelUpdateErrorTopicParams,\n OnModelDeleteErrorTopicParams\n} from \"~/types\";\nimport DataLoader from \"dataloader\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { contentModelManagerFactory } from \"./contentModel/contentModelManagerFactory\";\nimport {\n CreateContentModelModel,\n CreateContentModelModelFrom,\n UpdateContentModelModel\n} from \"./contentModel/models\";\nimport { createFieldModels } from \"./contentModel/createFieldModels\";\nimport WebinyError from \"@webiny/error\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { assignModelBeforeCreate } from \"./contentModel/beforeCreate\";\nimport { assignModelBeforeUpdate } from \"./contentModel/beforeUpdate\";\nimport { assignModelBeforeDelete } from \"./contentModel/beforeDelete\";\nimport { assignModelAfterCreate } from \"./contentModel/afterCreate\";\nimport { assignModelAfterUpdate } from \"./contentModel/afterUpdate\";\nimport { assignModelAfterDelete } from \"./contentModel/afterDelete\";\nimport { assignModelAfterCreateFrom } from \"./contentModel/afterCreateFrom\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin\";\nimport { checkPermissions } from \"~/utils/permissions\";\nimport { filterAsync } from \"~/utils/filterAsync\";\nimport { checkOwnership, validateOwnership } from \"~/utils/ownership\";\nimport { checkModelAccess, validateModelAccess } from \"~/utils/access\";\n\n/**\n * Given a model, return an array of tags ensuring the `type` tag is set.\n */\nconst ensureTypeTag = (model: Pick<CmsModel, \"tags\">) => {\n // Let's make sure we have a `type` tag assigned.\n // If `type` tag is not set, set it to a default one (`model`).\n const tags = model.tags || [];\n if (!tags.some(tag => tag.startsWith(\"type:\"))) {\n tags.push(\"type:model\");\n }\n\n return tags;\n};\n\nexport interface CreateModelsCrudParams {\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n storageOperations: HeadlessCmsStorageOperations;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n}\n\nexport const createModelsCrud = (params: CreateModelsCrudParams): CmsModelContext => {\n const { getTenant, getIdentity, getLocale, storageOperations, context } = params;\n\n const loaders = {\n listModels: new DataLoader(async () => {\n const models = await storageOperations.models.list({\n where: {\n tenant: getTenant().id,\n locale: getLocale().code\n }\n });\n return [\n models.map(model => {\n return {\n ...model,\n tags: ensureTypeTag(model),\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n })\n ];\n })\n };\n\n const clearModelsCache = (): void => {\n for (const loader of Object.values(loaders)) {\n loader.clearAll();\n }\n };\n\n const managers = new Map<string, CmsModelManager>();\n const updateManager = async (\n context: CmsContext,\n model: CmsModel\n ): Promise<CmsModelManager> => {\n const manager = await contentModelManagerFactory(context, model);\n managers.set(model.modelId, manager);\n return manager;\n };\n\n const checkModelPermissions = (check: string) => {\n return checkPermissions(context, \"cms.contentModel\", { rwd: check });\n };\n\n const getModelsAsPlugins = (): CmsModel[] => {\n const tenant = getTenant().id;\n const locale = getLocale().code;\n\n return (\n context.plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n /**\n * We need to filter out models that are not for this tenant or locale.\n * If it does not have tenant or locale define, it is for every locale and tenant\n */\n .filter(plugin => {\n const { tenant: modelTenant, locale: modelLocale } = plugin.contentModel;\n if (modelTenant && modelTenant !== tenant) {\n return false;\n } else if (modelLocale && modelLocale !== locale) {\n return false;\n }\n return true;\n })\n .map<CmsModel>(plugin => {\n return {\n ...plugin.contentModel,\n tags: ensureTypeTag(plugin.contentModel),\n tenant,\n locale,\n webinyVersion: context.WEBINY_VERSION\n };\n })\n );\n };\n\n const modelsGet = async (modelId: string): Promise<CmsModel> => {\n const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);\n\n if (pluginModel) {\n return pluginModel;\n }\n\n const model = await storageOperations.models.get({\n tenant: getTenant().id,\n locale: getLocale().code,\n modelId\n });\n\n if (!model) {\n throw new NotFoundError(`Content model \"${modelId}\" was not found!`);\n }\n\n return {\n ...model,\n tags: ensureTypeTag(model),\n tenant: model.tenant || getTenant().id,\n locale: model.locale || getLocale().code\n };\n };\n\n const modelsList = async (): Promise<CmsModel[]> => {\n const databaseModels: CmsModel[] = await loaders.listModels.load(\"listModels\");\n\n const pluginsModels = getModelsAsPlugins();\n\n return databaseModels.concat(pluginsModels);\n };\n\n const listModels = async () => {\n const permission = await checkModelPermissions(\"r\");\n const models = await modelsList();\n return filterAsync(models, async model => {\n if (!validateOwnership(context, permission, model)) {\n return false;\n }\n return validateModelAccess(context, model);\n });\n };\n\n const getModel = async (modelId: string): Promise<CmsModel> => {\n const permission = await checkModelPermissions(\"r\");\n\n const model = await modelsGet(modelId);\n\n checkOwnership(context, permission, model);\n await checkModelAccess(context, model);\n\n return model;\n };\n\n const getModelManager: CmsModelContext[\"getModelManager\"] = async (\n target\n ): Promise<CmsModelManager> => {\n const modelId = typeof target === \"string\" ? target : target.modelId;\n if (managers.has(modelId)) {\n return managers.get(modelId) as CmsModelManager;\n }\n const models = await modelsList();\n const model = models.find(m => m.modelId === modelId);\n if (!model) {\n throw new NotFoundError(`There is no content model \"${modelId}\".`);\n }\n return await updateManager(context, model);\n };\n\n /**\n * Create\n */\n const onModelBeforeCreate =\n createTopic<OnModelBeforeCreateTopicParams>(\"cms.onModelBeforeCreate\");\n const onModelAfterCreate = createTopic<OnModelAfterCreateTopicParams>(\"cms.onModelAfterCreate\");\n const onModelCreateError = createTopic<OnModelCreateErrorTopicParams>(\"cms.onModelCreateError\");\n /**\n * Create from / clone\n */\n const onModelBeforeCreateFrom = createTopic<OnModelBeforeCreateFromTopicParams>(\n \"cms.onModelBeforeCreateFrom\"\n );\n const onModelAfterCreateFrom = createTopic<OnModelAfterCreateFromTopicParams>(\n \"cms.onModelAfterCreateFrom\"\n );\n const onModelCreateFromError = createTopic<OnModelCreateFromErrorParams>(\n \"cms.onModelCreateFromError\"\n );\n /**\n * Update\n */\n const onModelBeforeUpdate =\n createTopic<OnModelBeforeUpdateTopicParams>(\"cms.onModelBeforeUpdate\");\n const onModelAfterUpdate = createTopic<OnModelAfterUpdateTopicParams>(\"cms.onModelAfterUpdate\");\n const onModelUpdateError = createTopic<OnModelUpdateErrorTopicParams>(\"cms.onModelUpdateError\");\n /**\n * Delete\n */\n const onModelBeforeDelete =\n createTopic<OnModelBeforeDeleteTopicParams>(\"cms.onModelBeforeDelete\");\n const onModelAfterDelete = createTopic<OnModelAfterDeleteTopicParams>(\"cms.onModelAfterDelete\");\n const onModelDeleteError = createTopic<OnModelDeleteErrorTopicParams>(\"cms.onModelDeleteError\");\n /**\n * Initialize\n */\n const onModelInitialize = createTopic<OnModelInitializeParams>(\"cms.onModelInitialize\");\n /**\n * We need to assign some default behaviors.\n */\n assignModelBeforeCreate({\n onModelBeforeCreate,\n onModelBeforeCreateFrom,\n context,\n storageOperations\n });\n assignModelAfterCreate({\n context,\n onModelAfterCreate\n });\n assignModelBeforeUpdate({\n onModelBeforeUpdate,\n context\n });\n assignModelAfterUpdate({\n context,\n onModelAfterUpdate\n });\n assignModelAfterCreateFrom({\n context,\n onModelAfterCreateFrom\n });\n assignModelBeforeDelete({\n onModelBeforeDelete,\n plugins: context.plugins,\n storageOperations\n });\n assignModelAfterDelete({\n context,\n onModelAfterDelete\n });\n\n return {\n /**\n * Deprecated - will be removed in 5.36.0\n */\n onBeforeModelCreate: onModelBeforeCreate,\n onAfterModelCreate: onModelAfterCreate,\n onBeforeModelCreateFrom: onModelBeforeCreateFrom,\n onAfterModelCreateFrom: onModelAfterCreateFrom,\n onBeforeModelUpdate: onModelBeforeUpdate,\n onAfterModelUpdate: onModelAfterUpdate,\n onBeforeModelDelete: onModelBeforeDelete,\n onAfterModelDelete: onModelAfterDelete,\n /**\n * Released in 5.34.0\n */\n onModelBeforeCreate,\n onModelAfterCreate,\n onModelCreateError,\n onModelBeforeCreateFrom,\n onModelAfterCreateFrom,\n onModelCreateFromError,\n onModelBeforeUpdate,\n onModelAfterUpdate,\n onModelUpdateError,\n onModelBeforeDelete,\n onModelAfterDelete,\n onModelDeleteError,\n onModelInitialize,\n clearModelsCache,\n getModel,\n listModels,\n async createModel(inputData) {\n await checkModelPermissions(\"w\");\n\n const createdData = new CreateContentModelModel().populate(inputData);\n await createdData.validate();\n const input: CmsModelCreateInput = await createdData.toJSON();\n\n context.security.disableAuthorization();\n const group = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const fields = await createFieldModels(input.fields);\n\n const identity = getIdentity();\n const model: CmsModel = {\n name: input.name,\n description: input.description || \"\",\n modelId: input.modelId || \"\",\n titleFieldId: \"id\",\n locale: getLocale().code,\n tenant: getTenant().id,\n group: {\n id: group.id,\n name: group.name\n },\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n fields,\n lockedFields: [],\n layout: input.layout || [],\n tags: [...(input.tags || [])],\n webinyVersion: context.WEBINY_VERSION\n };\n\n model.tags = ensureTypeTag(model);\n\n try {\n await onModelBeforeCreate.publish({\n input,\n model\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onModelAfterCreate.publish({\n input,\n model: createdModel\n });\n\n return createdModel;\n } catch (ex) {\n await onModelCreateError.publish({\n input,\n model,\n error: ex\n });\n throw ex;\n }\n },\n /**\n * Method does not check for permissions or ownership.\n * @internal\n */\n async updateModelDirect(params) {\n const { model: initialModel, original } = params;\n\n const model: CmsModel = {\n ...initialModel,\n tenant: initialModel.tenant || getTenant().id,\n locale: initialModel.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION\n };\n\n try {\n await onModelBeforeUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n loaders.listModels.clearAll();\n\n await onModelAfterUpdate.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model: resultModel\n });\n\n return resultModel;\n } catch (ex) {\n await onModelUpdateError.publish({\n input: {} as CmsModelUpdateInput,\n original,\n model,\n error: ex\n });\n throw ex;\n }\n },\n async createModelFrom(modelId, data) {\n await checkModelPermissions(\"w\");\n /**\n * Get a model record; this will also perform ownership validation.\n */\n const original = await getModel(modelId);\n\n const createdData = new CreateContentModelModelFrom().populate({\n name: data.name,\n modelId: data.modelId,\n description: data.description || original.description,\n group: data.group,\n locale: data.locale\n });\n\n await createdData.validate();\n const input: CmsModelCreateFromInput = await createdData.toJSON();\n\n const locale = await context.i18n.getLocale(input.locale || original.locale);\n if (!locale) {\n throw new NotFoundError(`There is no locale \"${input.locale}\".`);\n }\n /**\n * Use storage operations directly because we cannot get group from different locale via context methods.\n */\n const group = await context.cms.storageOperations.groups.get({\n id: input.group,\n tenant: original.tenant,\n locale: locale.code\n });\n if (!group) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n\n const identity = getIdentity();\n const model: CmsModel = {\n ...original,\n locale: locale.code,\n group: {\n id: group.id,\n name: group.name\n },\n name: input.name,\n modelId: input.modelId || \"\",\n description: input.description || \"\",\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n lockedFields: [],\n webinyVersion: context.WEBINY_VERSION\n };\n\n try {\n await onModelBeforeCreateFrom.publish({\n input,\n model,\n original\n });\n\n const createdModel = await storageOperations.models.create({\n model\n });\n\n loaders.listModels.clearAll();\n\n await updateManager(context, model);\n\n await onModelAfterCreateFrom.publish({\n input,\n original,\n model: createdModel\n });\n\n return createdModel;\n } catch (ex) {\n await onModelCreateFromError.publish({\n input,\n original,\n model,\n error: ex\n });\n throw ex;\n }\n },\n async updateModel(modelId, inputData) {\n await checkModelPermissions(\"w\");\n\n // Get a model record; this will also perform ownership validation.\n const original = await getModel(modelId);\n\n const updatedData = new UpdateContentModelModel().populate(inputData);\n await updatedData.validate();\n\n const input: CmsModelUpdateInput = await updatedData.toJSON({ onlyDirty: true });\n if (Object.keys(input).length === 0) {\n /**\n * We need to return the original if nothing is to be updated.\n */\n return original;\n }\n let group: CmsModel[\"group\"] = {\n id: original.group.id,\n name: original.group.name\n };\n if (input.group) {\n context.security.disableAuthorization();\n const groupData = await context.cms.getGroup(input.group);\n context.security.enableAuthorization();\n if (!groupData) {\n throw new NotFoundError(`There is no group \"${input.group}\".`);\n }\n group = {\n id: groupData.id,\n name: groupData.name\n };\n }\n const fields = await createFieldModels(inputData.fields);\n const model: CmsModel = {\n ...original,\n ...input,\n group,\n tenant: original.tenant || getTenant().id,\n locale: original.locale || getLocale().code,\n webinyVersion: context.WEBINY_VERSION,\n fields,\n savedOn: new Date().toISOString()\n };\n\n model.tags = ensureTypeTag(model);\n\n try {\n await onModelBeforeUpdate.publish({\n input,\n original,\n model\n });\n\n const resultModel = await storageOperations.models.update({\n model\n });\n\n await updateManager(context, resultModel);\n\n await onModelAfterUpdate.publish({\n input,\n original,\n model: resultModel\n });\n\n return resultModel;\n } catch (ex) {\n await onModelUpdateError.publish({\n input,\n model,\n original,\n error: ex\n });\n\n throw ex;\n }\n },\n async deleteModel(modelId) {\n await checkModelPermissions(\"d\");\n\n const model = await getModel(modelId);\n\n try {\n await onModelBeforeDelete.publish({\n model\n });\n\n try {\n await storageOperations.models.delete({\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete the content model\",\n ex.code || \"CONTENT_MODEL_DELETE_ERROR\",\n {\n error: ex,\n modelId: model.modelId\n }\n );\n }\n\n await onModelAfterDelete.publish({\n model\n });\n\n managers.delete(model.modelId);\n } catch (ex) {\n await onModelDeleteError.publish({\n model,\n error: ex\n });\n throw ex;\n }\n },\n async initializeModel(modelId, data) {\n /**\n * We require that users have write permissions to initialize models.\n * Maybe introduce another permission for it?\n */\n await checkModelPermissions(\"w\");\n\n const model = await getModel(modelId);\n\n await onModelInitialize.publish({ model, data });\n\n return true;\n },\n getModelManager,\n getEntryManager: async model => {\n return getModelManager(model);\n },\n getManagers: () => managers,\n getEntryManagers: () => managers\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { GraphQLSchemaPlugin } from "@webiny/handler-graphql/plugins/GraphQLSchemaPlugin";
|
|
2
|
-
import { CmsContext } from "../types";
|
|
2
|
+
import { CmsContext, CmsModel } from "../types";
|
|
3
3
|
/**
|
|
4
4
|
* This factory is called whenever we need to generate graphql-schema plugins using the current context.
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
interface BuildSchemaPluginsParams {
|
|
7
|
+
context: CmsContext;
|
|
8
|
+
models: CmsModel[];
|
|
9
|
+
}
|
|
10
|
+
export declare const buildSchemaPlugins: (params: BuildSchemaPluginsParams) => Promise<GraphQLSchemaPlugin<CmsContext>[]>;
|
|
11
|
+
export {};
|
|
@@ -15,13 +15,10 @@ var _baseContentSchema = require("./schema/baseContentSchema");
|
|
|
15
15
|
|
|
16
16
|
var _schemaPlugins = require("./schema/schemaPlugins");
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
* This factory is called whenever we need to generate graphql-schema plugins using the current context.
|
|
20
|
-
*/
|
|
21
|
-
const buildSchemaPlugins = async context => {
|
|
18
|
+
const buildSchemaPlugins = async params => {
|
|
22
19
|
return [// Base GQL types and scalars
|
|
23
|
-
(0, _baseContentSchema.createBaseContentSchema)(
|
|
24
|
-
...(await (0, _schemaPlugins.generateSchemaPlugins)(
|
|
20
|
+
(0, _baseContentSchema.createBaseContentSchema)(params), (0, _contentModels.createModelsSchema)(params), (0, _contentEntries.createContentEntriesSchema)(params), (0, _contentModelGroups.createGroupsSchema)(params), // Dynamic schema
|
|
21
|
+
...(await (0, _schemaPlugins.generateSchemaPlugins)(params))].filter(Boolean);
|
|
25
22
|
};
|
|
26
23
|
|
|
27
24
|
exports.buildSchemaPlugins = buildSchemaPlugins;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["buildSchemaPlugins","
|
|
1
|
+
{"version":3,"names":["buildSchemaPlugins","params","createBaseContentSchema","createModelsSchema","createContentEntriesSchema","createGroupsSchema","generateSchemaPlugins","filter","Boolean"],"sources":["buildSchemaPlugins.ts"],"sourcesContent":["import { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/plugins/GraphQLSchemaPlugin\";\nimport { CmsContext, CmsModel } from \"~/types\";\nimport { createModelsSchema } from \"./schema/contentModels\";\nimport { createContentEntriesSchema } from \"./schema/contentEntries\";\nimport { createGroupsSchema } from \"./schema/contentModelGroups\";\nimport { createBaseContentSchema } from \"./schema/baseContentSchema\";\nimport { generateSchemaPlugins } from \"./schema/schemaPlugins\";\n\n/**\n * This factory is called whenever we need to generate graphql-schema plugins using the current context.\n */\ninterface BuildSchemaPluginsParams {\n context: CmsContext;\n models: CmsModel[];\n}\nexport const buildSchemaPlugins = async (\n params: BuildSchemaPluginsParams\n): Promise<GraphQLSchemaPlugin<CmsContext>[]> => {\n return [\n // Base GQL types and scalars\n createBaseContentSchema(params),\n createModelsSchema(params),\n createContentEntriesSchema(params),\n createGroupsSchema(params),\n // Dynamic schema\n ...(await generateSchemaPlugins(params))\n ].filter(Boolean);\n};\n"],"mappings":";;;;;;;AAEA;;AACA;;AACA;;AACA;;AACA;;AASO,MAAMA,kBAAkB,GAAG,MAC9BC,MAD8B,IAEe;EAC7C,OAAO,CACH;EACA,IAAAC,0CAAA,EAAwBD,MAAxB,CAFG,EAGH,IAAAE,iCAAA,EAAmBF,MAAnB,CAHG,EAIH,IAAAG,0CAAA,EAA2BH,MAA3B,CAJG,EAKH,IAAAI,sCAAA,EAAmBJ,MAAnB,CALG,EAMH;EACA,IAAI,MAAM,IAAAK,oCAAA,EAAsBL,MAAtB,CAAV,CAPG,EAQLM,MARK,CAQEC,OARF,CAAP;AASH,CAZM"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { GraphQLSchemaPlugin } from "@webiny/handler-graphql";
|
|
2
|
+
import { CmsContext } from "../types";
|
|
3
|
+
interface Params {
|
|
4
|
+
plugins: GraphQLSchemaPlugin<CmsContext>[];
|
|
5
|
+
}
|
|
6
|
+
export declare const createExecutableSchema: (params: Params) => import("graphql").GraphQLSchema;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createExecutableSchema = void 0;
|
|
7
|
+
|
|
8
|
+
var _schema = require("@graphql-tools/schema");
|
|
9
|
+
|
|
10
|
+
const createExecutableSchema = params => {
|
|
11
|
+
const {
|
|
12
|
+
plugins
|
|
13
|
+
} = params;
|
|
14
|
+
/**
|
|
15
|
+
* Really hard to type this to satisfy the makeExecutableSchema
|
|
16
|
+
*/
|
|
17
|
+
// TODO @ts-refactor
|
|
18
|
+
|
|
19
|
+
const typeDefs = [];
|
|
20
|
+
const resolvers = []; // Get schema definitions from plugins
|
|
21
|
+
|
|
22
|
+
for (const plugin of plugins) {
|
|
23
|
+
typeDefs.push(plugin.schema.typeDefs);
|
|
24
|
+
resolvers.push(plugin.schema.resolvers);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return (0, _schema.makeExecutableSchema)({
|
|
28
|
+
typeDefs,
|
|
29
|
+
resolvers
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
exports.createExecutableSchema = createExecutableSchema;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createExecutableSchema","params","plugins","typeDefs","resolvers","plugin","push","schema","makeExecutableSchema"],"sources":["createExecutableSchema.ts"],"sourcesContent":["import { makeExecutableSchema } from \"@graphql-tools/schema\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql\";\nimport { CmsContext } from \"~/types\";\n\ninterface Params {\n plugins: GraphQLSchemaPlugin<CmsContext>[];\n}\nexport const createExecutableSchema = (params: Params) => {\n const { plugins } = params;\n /**\n * Really hard to type this to satisfy the makeExecutableSchema\n */\n // TODO @ts-refactor\n const typeDefs: any = [];\n const resolvers: any = [];\n\n // Get schema definitions from plugins\n for (const plugin of plugins) {\n typeDefs.push(plugin.schema.typeDefs);\n resolvers.push(plugin.schema.resolvers);\n }\n\n return makeExecutableSchema({\n typeDefs,\n resolvers\n });\n};\n"],"mappings":";;;;;;;AAAA;;AAOO,MAAMA,sBAAsB,GAAIC,MAAD,IAAoB;EACtD,MAAM;IAAEC;EAAF,IAAcD,MAApB;EACA;AACJ;AACA;EACI;;EACA,MAAME,QAAa,GAAG,EAAtB;EACA,MAAMC,SAAc,GAAG,EAAvB,CAPsD,CAStD;;EACA,KAAK,MAAMC,MAAX,IAAqBH,OAArB,EAA8B;IAC1BC,QAAQ,CAACG,IAAT,CAAcD,MAAM,CAACE,MAAP,CAAcJ,QAA5B;IACAC,SAAS,CAACE,IAAV,CAAeD,MAAM,CAACE,MAAP,CAAcH,SAA7B;EACH;;EAED,OAAO,IAAAI,4BAAA,EAAqB;IACxBL,QADwB;IAExBC;EAFwB,CAArB,CAAP;AAIH,CAnBM"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CmsContext, CmsModel } from "../types";
|
|
2
|
+
import { GraphQLSchema } from "graphql/type";
|
|
3
|
+
interface GenerateSchemaParams {
|
|
4
|
+
context: CmsContext;
|
|
5
|
+
models: CmsModel[];
|
|
6
|
+
}
|
|
7
|
+
export declare const generateSchema: (params: GenerateSchemaParams) => Promise<GraphQLSchema>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.generateSchema = void 0;
|
|
7
|
+
|
|
8
|
+
var _handlerGraphql = require("@webiny/handler-graphql");
|
|
9
|
+
|
|
10
|
+
var _buildSchemaPlugins = require("./buildSchemaPlugins");
|
|
11
|
+
|
|
12
|
+
var _createExecutableSchema = require("./createExecutableSchema");
|
|
13
|
+
|
|
14
|
+
const generateSchema = async params => {
|
|
15
|
+
const {
|
|
16
|
+
context,
|
|
17
|
+
models
|
|
18
|
+
} = params;
|
|
19
|
+
let generatedSchemaPlugins = [];
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
generatedSchemaPlugins = await (0, _buildSchemaPlugins.buildSchemaPlugins)({
|
|
23
|
+
context,
|
|
24
|
+
models
|
|
25
|
+
});
|
|
26
|
+
} catch (ex) {
|
|
27
|
+
console.log(`Error while building schema plugins.`);
|
|
28
|
+
throw ex;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
context.plugins.register(generatedSchemaPlugins);
|
|
32
|
+
const schemaPlugins = context.plugins.byType(_handlerGraphql.GraphQLSchemaPlugin.type);
|
|
33
|
+
return (0, _createExecutableSchema.createExecutableSchema)({
|
|
34
|
+
plugins: schemaPlugins
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
exports.generateSchema = generateSchema;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["generateSchema","params","context","models","generatedSchemaPlugins","buildSchemaPlugins","ex","console","log","plugins","register","schemaPlugins","byType","GraphQLSchemaPlugin","type","createExecutableSchema"],"sources":["generateSchema.ts"],"sourcesContent":["import { CmsContext, CmsModel } from \"~/types\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql\";\nimport { buildSchemaPlugins } from \"~/graphql/buildSchemaPlugins\";\nimport { createExecutableSchema } from \"~/graphql/createExecutableSchema\";\nimport { GraphQLSchema } from \"graphql/type\";\n\ninterface GenerateSchemaParams {\n context: CmsContext;\n models: CmsModel[];\n}\nexport const generateSchema = async (params: GenerateSchemaParams): Promise<GraphQLSchema> => {\n const { context, models } = params;\n\n let generatedSchemaPlugins: GraphQLSchemaPlugin<CmsContext>[] = [];\n try {\n generatedSchemaPlugins = await buildSchemaPlugins({ context, models });\n } catch (ex) {\n console.log(`Error while building schema plugins.`);\n throw ex;\n }\n\n context.plugins.register(generatedSchemaPlugins);\n\n const schemaPlugins = context.plugins.byType<GraphQLSchemaPlugin>(GraphQLSchemaPlugin.type);\n return createExecutableSchema({\n plugins: schemaPlugins\n });\n};\n"],"mappings":";;;;;;;AACA;;AACA;;AACA;;AAOO,MAAMA,cAAc,GAAG,MAAOC,MAAP,IAAgE;EAC1F,MAAM;IAAEC,OAAF;IAAWC;EAAX,IAAsBF,MAA5B;EAEA,IAAIG,sBAAyD,GAAG,EAAhE;;EACA,IAAI;IACAA,sBAAsB,GAAG,MAAM,IAAAC,sCAAA,EAAmB;MAAEH,OAAF;MAAWC;IAAX,CAAnB,CAA/B;EACH,CAFD,CAEE,OAAOG,EAAP,EAAW;IACTC,OAAO,CAACC,GAAR,CAAa,sCAAb;IACA,MAAMF,EAAN;EACH;;EAEDJ,OAAO,CAACO,OAAR,CAAgBC,QAAhB,CAAyBN,sBAAzB;EAEA,MAAMO,aAAa,GAAGT,OAAO,CAACO,OAAR,CAAgBG,MAAhB,CAA4CC,mCAAA,CAAoBC,IAAhE,CAAtB;EACA,OAAO,IAAAC,8CAAA,EAAuB;IAC1BN,OAAO,EAAEE;EADiB,CAAvB,CAAP;AAGH,CAjBM"}
|
|
@@ -9,25 +9,29 @@ exports.graphQLHandlerFactory = void 0;
|
|
|
9
9
|
|
|
10
10
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
11
11
|
|
|
12
|
-
var _schema = require("@graphql-tools/schema");
|
|
13
|
-
|
|
14
12
|
var _apiSecurity = require("@webiny/api-security");
|
|
15
13
|
|
|
16
14
|
var _debugPlugins = _interopRequireDefault(require("@webiny/handler-graphql/debugPlugins"));
|
|
17
15
|
|
|
18
16
|
var _processRequestBody = _interopRequireDefault(require("@webiny/handler-graphql/processRequestBody"));
|
|
19
17
|
|
|
20
|
-
var _buildSchemaPlugins = require("./buildSchemaPlugins");
|
|
21
|
-
|
|
22
|
-
var _plugins = require("@webiny/handler-graphql/plugins");
|
|
23
|
-
|
|
24
18
|
var _handler = require("@webiny/handler");
|
|
25
19
|
|
|
26
20
|
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
27
21
|
|
|
28
22
|
var _codeFrame = _interopRequireDefault(require("code-frame"));
|
|
29
23
|
|
|
24
|
+
var _generateSchema = require("./generateSchema");
|
|
25
|
+
|
|
30
26
|
// @ts-ignore `code-frame` has no types
|
|
27
|
+
const createRequestBody = body => {
|
|
28
|
+
/**
|
|
29
|
+
* We are trusting that the body payload is correct.
|
|
30
|
+
* The `processRequestBody` will fail if it is not.
|
|
31
|
+
*/
|
|
32
|
+
return typeof body === "string" ? JSON.parse(body) : body;
|
|
33
|
+
};
|
|
34
|
+
|
|
31
35
|
const schemaList = new Map();
|
|
32
36
|
|
|
33
37
|
const generateCacheKey = async args => {
|
|
@@ -39,32 +43,6 @@ const generateCacheKey = async args => {
|
|
|
39
43
|
const lastModelChange = await context.cms.getModelLastChange();
|
|
40
44
|
return [locale.code, type, lastModelChange.toISOString()].join("#");
|
|
41
45
|
};
|
|
42
|
-
|
|
43
|
-
const generateSchema = async args => {
|
|
44
|
-
const {
|
|
45
|
-
context
|
|
46
|
-
} = args;
|
|
47
|
-
context.plugins.register(await (0, _buildSchemaPlugins.buildSchemaPlugins)(context));
|
|
48
|
-
/**
|
|
49
|
-
* Really hard to type this to satisfy the makeExecutableSchema
|
|
50
|
-
*/
|
|
51
|
-
// TODO @ts-refactor
|
|
52
|
-
|
|
53
|
-
const typeDefs = [];
|
|
54
|
-
const resolvers = []; // Get schema definitions from plugins
|
|
55
|
-
|
|
56
|
-
const schemaPlugins = context.plugins.byType(_plugins.GraphQLSchemaPlugin.type);
|
|
57
|
-
|
|
58
|
-
for (const pl of schemaPlugins) {
|
|
59
|
-
typeDefs.push(pl.schema.typeDefs);
|
|
60
|
-
resolvers.push(pl.schema.resolvers);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return (0, _schema.makeExecutableSchema)({
|
|
64
|
-
typeDefs,
|
|
65
|
-
resolvers
|
|
66
|
-
});
|
|
67
|
-
};
|
|
68
46
|
/**
|
|
69
47
|
* Gets an existing schema or rewrites existing one or creates a completely new one
|
|
70
48
|
* depending on the schemaId created from type and locale parameters
|
|
@@ -80,49 +58,48 @@ const getSchema = async params => {
|
|
|
80
58
|
const tenantId = context.tenancy.getCurrentTenant().id;
|
|
81
59
|
const id = `${tenantId}#${type}#${locale.code}`;
|
|
82
60
|
const cacheKey = await generateCacheKey(params);
|
|
61
|
+
const cachedSchema = schemaList.get(id);
|
|
62
|
+
|
|
63
|
+
if ((cachedSchema === null || cachedSchema === void 0 ? void 0 : cachedSchema.key) === cacheKey) {
|
|
64
|
+
return cachedSchema.schema;
|
|
65
|
+
} // Load model data
|
|
83
66
|
|
|
84
|
-
if (!schemaList.has(id)) {
|
|
85
|
-
try {
|
|
86
|
-
const schema = await generateSchema(params);
|
|
87
|
-
schemaList.set(id, {
|
|
88
|
-
key: cacheKey,
|
|
89
|
-
schema
|
|
90
|
-
});
|
|
91
|
-
return schema;
|
|
92
|
-
} catch (err) {
|
|
93
|
-
if (!Array.isArray(err.locations)) {
|
|
94
|
-
throw new _error.default((0, _objectSpread2.default)({}, err));
|
|
95
|
-
}
|
|
96
67
|
|
|
97
|
-
|
|
68
|
+
context.security.disableAuthorization();
|
|
69
|
+
const models = (await context.cms.listModels()).filter(model => model.isPrivate !== true);
|
|
70
|
+
context.security.enableAuthorization();
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
const schema = await (0, _generateSchema.generateSchema)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
74
|
+
models
|
|
75
|
+
}));
|
|
76
|
+
schemaList.set(id, {
|
|
77
|
+
key: cacheKey,
|
|
78
|
+
schema
|
|
79
|
+
});
|
|
80
|
+
return schema;
|
|
81
|
+
} catch (err) {
|
|
82
|
+
if (!Array.isArray(err.locations)) {
|
|
98
83
|
throw new _error.default({
|
|
99
|
-
code: "INVALID_GRAPHQL_SCHEMA",
|
|
100
84
|
message: err.message,
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
85
|
+
code: err.code || "INVALID_GRAPHQL_SCHEMA_LOCATIONS",
|
|
86
|
+
data: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, err.data || {}), {}, {
|
|
87
|
+
locations: err.locations
|
|
88
|
+
})
|
|
106
89
|
});
|
|
107
90
|
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Safe to cast because check was done few lines up.
|
|
111
|
-
*/
|
|
112
91
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
92
|
+
const [location] = err.locations;
|
|
93
|
+
throw new _error.default({
|
|
94
|
+
code: "INVALID_GRAPHQL_SCHEMA",
|
|
95
|
+
message: err.message,
|
|
96
|
+
data: {
|
|
97
|
+
invalidSegment: (0, _codeFrame.default)(err.source.body, location.line, location.column, {
|
|
98
|
+
frameSize: 15
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
});
|
|
118
102
|
}
|
|
119
|
-
|
|
120
|
-
const schema = await generateSchema(params);
|
|
121
|
-
schemaList.set(id, {
|
|
122
|
-
key: cacheKey,
|
|
123
|
-
schema
|
|
124
|
-
});
|
|
125
|
-
return schema;
|
|
126
103
|
};
|
|
127
104
|
|
|
128
105
|
const checkEndpointAccess = async context => {
|
|
@@ -140,7 +117,7 @@ const checkEndpointAccess = async context => {
|
|
|
140
117
|
const formatErrorPayload = error => {
|
|
141
118
|
if (error instanceof _error.default) {
|
|
142
119
|
return JSON.stringify({
|
|
143
|
-
type: "
|
|
120
|
+
type: "CmsGraphQLWebinyError",
|
|
144
121
|
message: error.message,
|
|
145
122
|
code: error.code,
|
|
146
123
|
data: error.data
|
|
@@ -175,17 +152,37 @@ const cmsRoutes = new _handler.RoutePlugin(({
|
|
|
175
152
|
});
|
|
176
153
|
}
|
|
177
154
|
|
|
155
|
+
let schema;
|
|
156
|
+
|
|
178
157
|
try {
|
|
179
|
-
|
|
158
|
+
schema = await getSchema({
|
|
180
159
|
context,
|
|
181
160
|
locale: context.cms.getLocale(),
|
|
182
161
|
type: context.cms.type
|
|
183
162
|
});
|
|
184
|
-
|
|
163
|
+
} catch (ex) {
|
|
164
|
+
console.log(`Error while generating the schema.`);
|
|
165
|
+
console.log(formatErrorPayload(ex));
|
|
166
|
+
throw ex;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
let body = [];
|
|
170
|
+
|
|
171
|
+
try {
|
|
172
|
+
body = createRequestBody(request.body);
|
|
173
|
+
} catch (ex) {
|
|
174
|
+
console.log(`Error while creating the body request.`);
|
|
175
|
+
console.log(formatErrorPayload(ex));
|
|
176
|
+
throw ex;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
try {
|
|
185
180
|
const result = await (0, _processRequestBody.default)(body, schema, context);
|
|
186
181
|
return reply.code(200).send(result);
|
|
187
182
|
} catch (ex) {
|
|
188
|
-
|
|
183
|
+
console.log(`Error while processing the body request.`);
|
|
184
|
+
console.log(formatErrorPayload(ex));
|
|
185
|
+
throw ex;
|
|
189
186
|
}
|
|
190
187
|
});
|
|
191
188
|
onOptions("/cms/:type(^manage|preview|read$)/:locale", async (_, reply) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["schemaList","Map","generateCacheKey","args","context","locale","type","lastModelChange","cms","getModelLastChange","code","toISOString","join","generateSchema","plugins","register","buildSchemaPlugins","typeDefs","resolvers","schemaPlugins","byType","GraphQLSchemaPlugin","pl","push","schema","makeExecutableSchema","getSchema","params","tenantId","tenancy","getCurrentTenant","id","cacheKey","has","set","key","err","Array","isArray","locations","WebinyError","location","message","data","invalidSegment","codeFrame","source","body","line","column","frameSize","cache","get","checkEndpointAccess","permission","security","getPermission","NotAuthorizedError","reason","formatErrorPayload","error","JSON","stringify","name","stack","cmsRoutes","RoutePlugin","onPost","onOptions","request","reply","ex","send","getLocale","result","processRequestBody","_","status","hijack","graphQLHandlerFactory","debug","debugPlugins"],"sources":["graphQLHandlerFactory.ts"],"sourcesContent":["import { GraphQLSchema } from \"graphql\";\nimport { makeExecutableSchema } from \"@graphql-tools/schema\";\nimport { ApiEndpoint, CmsContext } from \"~/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport { PluginCollection } from \"@webiny/plugins/types\";\nimport debugPlugins from \"@webiny/handler-graphql/debugPlugins\";\nimport processRequestBody from \"@webiny/handler-graphql/processRequestBody\";\nimport { buildSchemaPlugins } from \"./buildSchemaPlugins\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/plugins\";\nimport { GraphQLRequestBody } from \"@webiny/handler-graphql/types\";\nimport { RoutePlugin } from \"@webiny/handler\";\nimport WebinyError from \"@webiny/error\";\n// @ts-ignore `code-frame` has no types\nimport codeFrame from \"code-frame\";\n\ninterface SchemaCache {\n key: string;\n schema: GraphQLSchema;\n}\ninterface GetSchemaParams {\n context: CmsContext;\n type: ApiEndpoint;\n locale: I18NLocale;\n}\n\nconst schemaList = new Map<string, SchemaCache>();\n\nconst generateCacheKey = async (args: GetSchemaParams): Promise<string> => {\n const { context, locale, type } = args;\n const lastModelChange = await context.cms.getModelLastChange();\n return [locale.code, type, lastModelChange.toISOString()].join(\"#\");\n};\n\nconst generateSchema = async (args: GetSchemaParams): Promise<GraphQLSchema> => {\n const { context } = args;\n\n context.plugins.register(await buildSchemaPlugins(context));\n /**\n * Really hard to type this to satisfy the makeExecutableSchema\n */\n // TODO @ts-refactor\n const typeDefs: any = [];\n const resolvers: any = [];\n\n // Get schema definitions from plugins\n const schemaPlugins = context.plugins.byType<GraphQLSchemaPlugin>(GraphQLSchemaPlugin.type);\n for (const pl of schemaPlugins) {\n typeDefs.push(pl.schema.typeDefs);\n resolvers.push(pl.schema.resolvers);\n }\n\n return makeExecutableSchema({\n typeDefs,\n resolvers\n });\n};\n\n/**\n * Gets an existing schema or rewrites existing one or creates a completely new one\n * depending on the schemaId created from type and locale parameters\n */\nconst getSchema = async (params: GetSchemaParams): Promise<GraphQLSchema> => {\n const { context, type, locale } = params;\n const tenantId = context.tenancy.getCurrentTenant().id;\n const id = `${tenantId}#${type}#${locale.code}`;\n\n const cacheKey = await generateCacheKey(params);\n if (!schemaList.has(id)) {\n try {\n const schema = await generateSchema(params);\n schemaList.set(id, {\n key: cacheKey,\n schema\n });\n return schema;\n } catch (err) {\n if (!Array.isArray(err.locations)) {\n throw new WebinyError({\n ...err\n });\n }\n const [location] = err.locations;\n\n throw new WebinyError({\n code: \"INVALID_GRAPHQL_SCHEMA\",\n message: err.message,\n data: {\n invalidSegment: codeFrame(err.source.body, location.line, location.column, {\n frameSize: 15\n })\n }\n });\n }\n }\n /**\n * Safe to cast because check was done few lines up.\n */\n const cache = schemaList.get(id) as SchemaCache;\n if (cache.key === cacheKey) {\n return cache.schema;\n }\n const schema = await generateSchema(params);\n schemaList.set(id, {\n key: cacheKey,\n schema\n });\n return schema;\n};\n\nconst checkEndpointAccess = async (context: CmsContext): Promise<void> => {\n const permission = await context.security.getPermission(`cms.endpoint.${context.cms.type}`);\n if (!permission) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access \"${context.cms.type}\" endpoint.`\n }\n });\n }\n};\n\nconst formatErrorPayload = (error: Error): string => {\n if (error instanceof WebinyError) {\n return JSON.stringify({\n type: \"WebinyError\",\n message: error.message,\n code: error.code,\n data: error.data\n });\n }\n\n return JSON.stringify({\n type: \"Error\",\n name: error.name,\n message: error.message,\n stack: error.stack\n });\n};\n\nexport interface GraphQLHandlerFactoryParams {\n debug?: boolean;\n}\n\nconst cmsRoutes = new RoutePlugin<CmsContext>(({ onPost, onOptions, context }) => {\n onPost(\"/cms/:type(^manage|preview|read$)/:locale\", async (request, reply) => {\n try {\n await checkEndpointAccess(context);\n } catch (ex) {\n return reply.code(401).send({\n data: null,\n error: {\n message: ex.message || \"Not authorized!\",\n code: ex.code || \"SECURITY_NOT_AUTHORIZED\",\n data: ex.data || null,\n stack: null\n }\n });\n }\n\n try {\n const schema = await getSchema({\n context,\n locale: context.cms.getLocale(),\n type: context.cms.type as ApiEndpoint\n });\n const body: GraphQLRequestBody | GraphQLRequestBody[] = request.body as any;\n const result = await processRequestBody(body, schema, context);\n return reply.code(200).send(result);\n } catch (ex) {\n return reply.code(500).send(formatErrorPayload(ex));\n }\n });\n\n onOptions(\"/cms/:type(^manage|preview|read$)/:locale\", async (_, reply) => {\n return reply.status(204).send({}).hijack();\n });\n});\n\ncmsRoutes.name = \"headless-cms.graphql.route.default\";\n\nexport const graphQLHandlerFactory = ({ debug }: GraphQLHandlerFactoryParams): PluginCollection => {\n return [\n ...(debug ? debugPlugins() : []),\n cmsRoutes,\n {\n type: \"wcp-telemetry-tracker\"\n }\n ];\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["createRequestBody","body","JSON","parse","schemaList","Map","generateCacheKey","args","context","locale","type","lastModelChange","cms","getModelLastChange","code","toISOString","join","getSchema","params","tenantId","tenancy","getCurrentTenant","id","cacheKey","cachedSchema","get","key","schema","security","disableAuthorization","models","listModels","filter","model","isPrivate","enableAuthorization","generateSchema","set","err","Array","isArray","locations","WebinyError","message","data","location","invalidSegment","codeFrame","source","line","column","frameSize","checkEndpointAccess","permission","getPermission","NotAuthorizedError","reason","formatErrorPayload","error","stringify","name","stack","cmsRoutes","RoutePlugin","onPost","onOptions","request","reply","ex","send","getLocale","console","log","result","processRequestBody","_","status","hijack","graphQLHandlerFactory","debug","debugPlugins"],"sources":["graphQLHandlerFactory.ts"],"sourcesContent":["import { GraphQLSchema } from \"graphql\";\nimport { ApiEndpoint, CmsContext } from \"~/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport { PluginCollection } from \"@webiny/plugins/types\";\nimport debugPlugins from \"@webiny/handler-graphql/debugPlugins\";\nimport processRequestBody from \"@webiny/handler-graphql/processRequestBody\";\nimport { GraphQLRequestBody } from \"@webiny/handler-graphql/types\";\nimport { RoutePlugin } from \"@webiny/handler\";\nimport WebinyError from \"@webiny/error\";\n// @ts-ignore `code-frame` has no types\nimport codeFrame from \"code-frame\";\nimport { generateSchema } from \"~/graphql/generateSchema\";\n\ninterface SchemaCache {\n key: string;\n schema: GraphQLSchema;\n}\ninterface GetSchemaParams {\n context: CmsContext;\n type: ApiEndpoint;\n locale: I18NLocale;\n}\n\nconst createRequestBody = (body: unknown): GraphQLRequestBody | GraphQLRequestBody[] => {\n /**\n * We are trusting that the body payload is correct.\n * The `processRequestBody` will fail if it is not.\n */\n return typeof body === \"string\" ? JSON.parse(body) : body;\n};\n\nconst schemaList = new Map<string, SchemaCache>();\n\nconst generateCacheKey = async (args: GetSchemaParams): Promise<string> => {\n const { context, locale, type } = args;\n const lastModelChange = await context.cms.getModelLastChange();\n return [locale.code, type, lastModelChange.toISOString()].join(\"#\");\n};\n\n/**\n * Gets an existing schema or rewrites existing one or creates a completely new one\n * depending on the schemaId created from type and locale parameters\n */\nconst getSchema = async (params: GetSchemaParams): Promise<GraphQLSchema> => {\n const { context, type, locale } = params;\n const tenantId = context.tenancy.getCurrentTenant().id;\n const id = `${tenantId}#${type}#${locale.code}`;\n\n const cacheKey = await generateCacheKey(params);\n const cachedSchema = schemaList.get(id);\n if (cachedSchema?.key === cacheKey) {\n return cachedSchema.schema;\n }\n // Load model data\n context.security.disableAuthorization();\n const models = (await context.cms.listModels()).filter(model => model.isPrivate !== true);\n context.security.enableAuthorization();\n try {\n const schema = await generateSchema({\n ...params,\n models\n });\n schemaList.set(id, {\n key: cacheKey,\n schema\n });\n return schema;\n } catch (err) {\n if (!Array.isArray(err.locations)) {\n throw new WebinyError({\n message: err.message,\n code: err.code || \"INVALID_GRAPHQL_SCHEMA_LOCATIONS\",\n data: {\n ...(err.data || {}),\n locations: err.locations\n }\n });\n }\n const [location] = err.locations;\n\n throw new WebinyError({\n code: \"INVALID_GRAPHQL_SCHEMA\",\n message: err.message,\n data: {\n invalidSegment: codeFrame(err.source.body, location.line, location.column, {\n frameSize: 15\n })\n }\n });\n }\n};\n\nconst checkEndpointAccess = async (context: CmsContext): Promise<void> => {\n const permission = await context.security.getPermission(`cms.endpoint.${context.cms.type}`);\n if (!permission) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access \"${context.cms.type}\" endpoint.`\n }\n });\n }\n};\n\nconst formatErrorPayload = (error: Error): string => {\n if (error instanceof WebinyError) {\n return JSON.stringify({\n type: \"CmsGraphQLWebinyError\",\n message: error.message,\n code: error.code,\n data: error.data\n });\n }\n\n return JSON.stringify({\n type: \"Error\",\n name: error.name,\n message: error.message,\n stack: error.stack\n });\n};\n\nexport interface GraphQLHandlerFactoryParams {\n debug?: boolean;\n}\n\nconst cmsRoutes = new RoutePlugin<CmsContext>(({ onPost, onOptions, context }) => {\n onPost(\"/cms/:type(^manage|preview|read$)/:locale\", async (request, reply) => {\n try {\n await checkEndpointAccess(context);\n } catch (ex) {\n return reply.code(401).send({\n data: null,\n error: {\n message: ex.message || \"Not authorized!\",\n code: ex.code || \"SECURITY_NOT_AUTHORIZED\",\n data: ex.data || null,\n stack: null\n }\n });\n }\n\n let schema: GraphQLSchema;\n try {\n schema = await getSchema({\n context,\n locale: context.cms.getLocale(),\n type: context.cms.type as ApiEndpoint\n });\n } catch (ex) {\n console.log(`Error while generating the schema.`);\n console.log(formatErrorPayload(ex));\n throw ex;\n }\n\n let body: GraphQLRequestBody | GraphQLRequestBody[] = [];\n try {\n body = createRequestBody(request.body);\n } catch (ex) {\n console.log(`Error while creating the body request.`);\n console.log(formatErrorPayload(ex));\n throw ex;\n }\n\n try {\n const result = await processRequestBody(body, schema, context);\n return reply.code(200).send(result);\n } catch (ex) {\n console.log(`Error while processing the body request.`);\n console.log(formatErrorPayload(ex));\n throw ex;\n }\n });\n\n onOptions(\"/cms/:type(^manage|preview|read$)/:locale\", async (_, reply) => {\n return reply.status(204).send({}).hijack();\n });\n});\n\ncmsRoutes.name = \"headless-cms.graphql.route.default\";\n\nexport const graphQLHandlerFactory = ({ debug }: GraphQLHandlerFactoryParams): PluginCollection => {\n return [\n ...(debug ? debugPlugins() : []),\n cmsRoutes,\n {\n type: \"wcp-telemetry-tracker\"\n }\n ];\n};\n"],"mappings":"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"}
|
package/graphql/index.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { GraphQLSchemaPlugin } from "@webiny/handler-graphql/types";
|
|
2
1
|
import { GraphQLHandlerFactoryParams } from "./graphQLHandlerFactory";
|
|
3
|
-
import { CmsContext } from "../types";
|
|
4
2
|
export declare type CreateGraphQLParams = GraphQLHandlerFactoryParams;
|
|
5
|
-
export declare const createGraphQL: (params: CreateGraphQLParams) => (import("@webiny/
|
|
3
|
+
export declare const createGraphQL: (params: CreateGraphQLParams) => (import("@webiny/handler-graphql").GraphQLSchemaPlugin<import("../types").CmsContext> | import("@webiny/api").ContextPlugin<import("../types").CmsContext> | import("@webiny/plugins/types").PluginCollection)[];
|