@webiny/api-aco 5.39.1-beta.1 → 5.39.2-beta.0
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/createAcoContext.js +2 -2
- package/createAcoContext.js.map +1 -1
- package/createAcoModels.js +1 -1
- package/createAcoModels.js.map +1 -1
- package/filter/filter.model.d.ts +1 -1
- package/filter/filter.model.js +4 -4
- package/filter/filter.model.js.map +1 -1
- package/folder/folder.crud.js +26 -22
- package/folder/folder.crud.js.map +1 -1
- package/folder/folder.model.d.ts +1 -1
- package/folder/folder.model.js +12 -4
- package/folder/folder.model.js.map +1 -1
- package/package.json +25 -25
- package/record/record.model.d.ts +2 -2
- package/record/record.model.js +12 -4
- package/record/record.model.js.map +1 -1
- package/record/record.so.js +83 -98
- package/record/record.so.js.map +1 -1
- package/utils/FolderLevelPermissions.d.ts +4 -2
- package/utils/FolderLevelPermissions.js +145 -129
- package/utils/FolderLevelPermissions.js.map +1 -1
- package/utils/createOperationsWrapper.js +5 -9
- package/utils/createOperationsWrapper.js.map +1 -1
- package/utils/decorators/CmsEntriesCrudDecorators.js +62 -11
- package/utils/decorators/CmsEntriesCrudDecorators.js.map +1 -1
- package/utils/isInstallationPending.d.ts +0 -4
- package/utils/isInstallationPending.js +0 -23
- package/utils/isInstallationPending.js.map +0 -1
package/createAcoContext.js
CHANGED
|
@@ -7,9 +7,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.createAcoContext = void 0;
|
|
8
8
|
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
9
9
|
var _api = require("@webiny/api");
|
|
10
|
+
var _apiHeadlessCms = require("@webiny/api-headless-cms");
|
|
10
11
|
var _createAcoHooks = require("./createAcoHooks");
|
|
11
12
|
var _createAcoStorageOperations = require("./createAcoStorageOperations");
|
|
12
|
-
var _isInstallationPending = require("./utils/isInstallationPending");
|
|
13
13
|
var _folder = require("./folder/folder.crud");
|
|
14
14
|
var _record = require("./record/record.crud");
|
|
15
15
|
var _apps = require("./apps");
|
|
@@ -176,7 +176,7 @@ const createAcoContext = (params = {}) => {
|
|
|
176
176
|
/**
|
|
177
177
|
* We can skip the ACO initialization if the installation is pending.
|
|
178
178
|
*/
|
|
179
|
-
if ((0,
|
|
179
|
+
if (!(await (0, _apiHeadlessCms.isHeadlessCmsReady)(context))) {
|
|
180
180
|
return;
|
|
181
181
|
}
|
|
182
182
|
await context.benchmark.measure("aco.context.setup", async () => {
|
package/createAcoContext.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_error","_interopRequireDefault","require","_api","_createAcoHooks","_createAcoStorageOperations","_isInstallationPending","_folder","_record","_apps","_record2","_plugins","_FolderLevelPermissions","_CmsEntriesCrudDecorators","_folder2","_createOperationsWrapper","_pickEntryFieldValues","_filter","setupAcoContext","context","setupAcoContextParams","tenancy","security","i18n","getLocale","locale","getContentLocale","WebinyError","getTenant","getCurrentTenant","storageOperations","createAcoStorageOperations","cms","getCmsContext","folderLevelPermissions","FolderLevelPermissions","getIdentity","getIdentityTeam","withoutAuthorization","identity","adminUser","adminUsers","getUser","where","id","team","getTeam","listPermissions","listAllFolders","type","withModel","createOperationsWrapper","modelName","FOLDER_MODEL_ID","model","results","entries","list","limit","latest","sort","items","map","pickEntryFieldValues","canUseTeams","wcp","canUseFolderLevelPermissions","useFolderLevelPermissions","isAuthorizationEnabled","params","defaultRecordModel","getModel","SEARCH_RECORD_MODEL_ID","apps","AcoApps","plugins","byType","AcoAppRegisterPlugin","plugin","register","app","listAdminUsers","listUsers","listTeams","aco","folder","createFolderCrudMethods","search","createSearchRecordCrudMethods","filter","createFilterCrudMethods","getApp","name","get","listApps","registerApp","CmsEntriesCrudDecorators","decorate","createAcoContext","ContextPlugin","isInstallationPending","benchmark","measure","createAcoHooks","exports"],"sources":["createAcoContext.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { createAcoHooks } from \"~/createAcoHooks\";\nimport { createAcoStorageOperations } from \"~/createAcoStorageOperations\";\nimport { isInstallationPending } from \"~/utils/isInstallationPending\";\nimport { AcoContext, CreateAcoParams, Folder, IAcoAppRegisterParams } from \"~/types\";\nimport { createFolderCrudMethods } from \"~/folder/folder.crud\";\nimport { createSearchRecordCrudMethods } from \"~/record/record.crud\";\nimport { AcoApps } from \"./apps\";\nimport { SEARCH_RECORD_MODEL_ID } from \"~/record/record.model\";\nimport { AcoAppRegisterPlugin } from \"~/plugins\";\nimport { FolderLevelPermissions } from \"~/utils/FolderLevelPermissions\";\nimport { CmsEntriesCrudDecorators } from \"~/utils/decorators/CmsEntriesCrudDecorators\";\nimport { FOLDER_MODEL_ID } from \"~/folder/folder.model\";\nimport { createOperationsWrapper } from \"~/utils/createOperationsWrapper\";\nimport { pickEntryFieldValues } from \"~/utils/pickEntryFieldValues\";\nimport { createFilterCrudMethods } from \"~/filter/filter.crud\";\n\ninterface CreateAcoContextParams {\n useFolderLevelPermissions?: boolean;\n}\n\nconst setupAcoContext = async (\n context: AcoContext,\n setupAcoContextParams: CreateAcoContextParams\n): Promise<void> => {\n const { tenancy, security, i18n } = context;\n\n const getLocale = (): I18NLocale => {\n const locale = i18n.getContentLocale();\n if (!locale) {\n throw new WebinyError(\n \"Missing content locale in api-aco/plugins/context.ts\",\n \"LOCALE_ERROR\"\n );\n }\n\n return locale;\n };\n\n const getTenant = (): Tenant => {\n return tenancy.getCurrentTenant();\n };\n\n const storageOperations = createAcoStorageOperations({\n /**\n * TODO: We need to figure out a way to pass \"cms\" from outside (e.g. apps/api/graphql)\n */\n cms: context.cms,\n /**\n * TODO: This is required for \"entryFieldFromStorageTransform\" which access plugins from context.\n */\n getCmsContext: () => context,\n security\n });\n\n const folderLevelPermissions = new FolderLevelPermissions({\n getIdentity: () => security.getIdentity(),\n getIdentityTeam: async () => {\n return security.withoutAuthorization(async () => {\n const identity = security.getIdentity();\n if (!identity) {\n return null;\n }\n\n const adminUser = await context.adminUsers.getUser({ where: { id: identity.id } });\n if (!adminUser) {\n return null;\n }\n\n if (!adminUser.team) {\n return null;\n }\n\n return context.security.getTeam({ where: { id: adminUser.team } });\n });\n },\n listPermissions: () => security.listPermissions(),\n listAllFolders: type => {\n // When retrieving a list of all folders, we want to do it in the\n // fastest way and that is by directly using CMS's storage operations.\n const { withModel } = createOperationsWrapper({\n modelName: FOLDER_MODEL_ID,\n cms: context.cms,\n getCmsContext: () => context,\n security\n });\n\n return withModel(async model => {\n const results = await context.cms.storageOperations.entries.list(model, {\n limit: 100_000,\n where: {\n type,\n\n // Folders always work with latest entries. We never publish them.\n latest: true\n },\n sort: [\"title_ASC\"]\n });\n\n return results.items.map(pickEntryFieldValues<Folder>);\n });\n },\n canUseTeams: () => context.wcp.canUseTeams(),\n canUseFolderLevelPermissions: () => {\n if (setupAcoContextParams.useFolderLevelPermissions === false) {\n return false;\n }\n\n return context.wcp.canUseFolderLevelPermissions();\n },\n isAuthorizationEnabled: () => context.security.isAuthorizationEnabled()\n });\n\n const params: CreateAcoParams = {\n getLocale,\n getTenant,\n storageOperations,\n folderLevelPermissions\n };\n\n const defaultRecordModel = await context.security.withoutAuthorization(async () => {\n return context.cms.getModel(SEARCH_RECORD_MODEL_ID);\n });\n\n if (!defaultRecordModel) {\n throw new WebinyError(`There is no default record model in ${SEARCH_RECORD_MODEL_ID}`);\n }\n\n /**\n * First we need to create all the apps.\n */\n const apps = new AcoApps(context, params);\n const plugins = context.plugins.byType<AcoAppRegisterPlugin>(AcoAppRegisterPlugin.type);\n for (const plugin of plugins) {\n await apps.register({\n model: defaultRecordModel,\n ...plugin.app\n });\n }\n\n const listAdminUsers = () => {\n return security.withoutAuthorization(async () => {\n return context.adminUsers.listUsers();\n });\n };\n const listTeams = () => {\n return security.withoutAuthorization(async () => {\n return context.security.listTeams();\n });\n };\n\n context.aco = {\n folder: createFolderCrudMethods({\n ...params,\n listAdminUsers,\n listTeams\n }),\n search: createSearchRecordCrudMethods(params),\n folderLevelPermissions,\n filter: createFilterCrudMethods(params),\n apps,\n getApp: (name: string) => apps.get(name),\n listApps: () => apps.list(),\n registerApp: async (params: IAcoAppRegisterParams) => {\n return apps.register({\n model: defaultRecordModel,\n ...params\n });\n }\n };\n\n if (context.wcp.canUseFolderLevelPermissions()) {\n new CmsEntriesCrudDecorators({ context }).decorate();\n\n // PB decorators registered here: packages/api-page-builder-aco/src/index.ts\n // new PageBuilderCrudDecorators({ context }).decorate();\n }\n};\n\nexport const createAcoContext = (params: CreateAcoContextParams = {}) => {\n const plugin = new ContextPlugin<AcoContext>(async context => {\n /**\n * We can skip the ACO initialization if the installation is pending.\n */\n if (isInstallationPending(context)) {\n return;\n }\n await context.benchmark.measure(\"aco.context.setup\", async () => {\n await setupAcoContext(context, params);\n });\n\n await context.benchmark.measure(\"aco.context.hooks\", async () => {\n await createAcoHooks(context);\n });\n });\n\n plugin.name = \"aco.createContext\";\n\n return plugin;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_error","_interopRequireDefault","require","_api","_apiHeadlessCms","_createAcoHooks","_createAcoStorageOperations","_folder","_record","_apps","_record2","_plugins","_FolderLevelPermissions","_CmsEntriesCrudDecorators","_folder2","_createOperationsWrapper","_pickEntryFieldValues","_filter","setupAcoContext","context","setupAcoContextParams","tenancy","security","i18n","getLocale","locale","getContentLocale","WebinyError","getTenant","getCurrentTenant","storageOperations","createAcoStorageOperations","cms","getCmsContext","folderLevelPermissions","FolderLevelPermissions","getIdentity","getIdentityTeam","withoutAuthorization","identity","adminUser","adminUsers","getUser","where","id","team","getTeam","listPermissions","listAllFolders","type","withModel","createOperationsWrapper","modelName","FOLDER_MODEL_ID","model","results","entries","list","limit","latest","sort","items","map","pickEntryFieldValues","canUseTeams","wcp","canUseFolderLevelPermissions","useFolderLevelPermissions","isAuthorizationEnabled","params","defaultRecordModel","getModel","SEARCH_RECORD_MODEL_ID","apps","AcoApps","plugins","byType","AcoAppRegisterPlugin","plugin","register","app","listAdminUsers","listUsers","listTeams","aco","folder","createFolderCrudMethods","search","createSearchRecordCrudMethods","filter","createFilterCrudMethods","getApp","name","get","listApps","registerApp","CmsEntriesCrudDecorators","decorate","createAcoContext","ContextPlugin","isHeadlessCmsReady","benchmark","measure","createAcoHooks","exports"],"sources":["createAcoContext.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { isHeadlessCmsReady } from \"@webiny/api-headless-cms\";\nimport { createAcoHooks } from \"~/createAcoHooks\";\nimport { createAcoStorageOperations } from \"~/createAcoStorageOperations\";\nimport { AcoContext, CreateAcoParams, Folder, IAcoAppRegisterParams } from \"~/types\";\nimport { createFolderCrudMethods } from \"~/folder/folder.crud\";\nimport { createSearchRecordCrudMethods } from \"~/record/record.crud\";\nimport { AcoApps } from \"./apps\";\nimport { SEARCH_RECORD_MODEL_ID } from \"~/record/record.model\";\nimport { AcoAppRegisterPlugin } from \"~/plugins\";\nimport { FolderLevelPermissions } from \"~/utils/FolderLevelPermissions\";\nimport { CmsEntriesCrudDecorators } from \"~/utils/decorators/CmsEntriesCrudDecorators\";\nimport { FOLDER_MODEL_ID } from \"~/folder/folder.model\";\nimport { createOperationsWrapper } from \"~/utils/createOperationsWrapper\";\nimport { pickEntryFieldValues } from \"~/utils/pickEntryFieldValues\";\nimport { createFilterCrudMethods } from \"~/filter/filter.crud\";\n\ninterface CreateAcoContextParams {\n useFolderLevelPermissions?: boolean;\n}\n\nconst setupAcoContext = async (\n context: AcoContext,\n setupAcoContextParams: CreateAcoContextParams\n): Promise<void> => {\n const { tenancy, security, i18n } = context;\n\n const getLocale = (): I18NLocale => {\n const locale = i18n.getContentLocale();\n if (!locale) {\n throw new WebinyError(\n \"Missing content locale in api-aco/plugins/context.ts\",\n \"LOCALE_ERROR\"\n );\n }\n\n return locale;\n };\n\n const getTenant = (): Tenant => {\n return tenancy.getCurrentTenant();\n };\n\n const storageOperations = createAcoStorageOperations({\n /**\n * TODO: We need to figure out a way to pass \"cms\" from outside (e.g. apps/api/graphql)\n */\n cms: context.cms,\n /**\n * TODO: This is required for \"entryFieldFromStorageTransform\" which access plugins from context.\n */\n getCmsContext: () => context,\n security\n });\n\n const folderLevelPermissions = new FolderLevelPermissions({\n getIdentity: () => security.getIdentity(),\n getIdentityTeam: async () => {\n return security.withoutAuthorization(async () => {\n const identity = security.getIdentity();\n if (!identity) {\n return null;\n }\n\n const adminUser = await context.adminUsers.getUser({ where: { id: identity.id } });\n if (!adminUser) {\n return null;\n }\n\n if (!adminUser.team) {\n return null;\n }\n\n return context.security.getTeam({ where: { id: adminUser.team } });\n });\n },\n listPermissions: () => security.listPermissions(),\n listAllFolders: type => {\n // When retrieving a list of all folders, we want to do it in the\n // fastest way and that is by directly using CMS's storage operations.\n const { withModel } = createOperationsWrapper({\n modelName: FOLDER_MODEL_ID,\n cms: context.cms,\n getCmsContext: () => context,\n security\n });\n\n return withModel(async model => {\n const results = await context.cms.storageOperations.entries.list(model, {\n limit: 100_000,\n where: {\n type,\n\n // Folders always work with latest entries. We never publish them.\n latest: true\n },\n sort: [\"title_ASC\"]\n });\n\n return results.items.map(pickEntryFieldValues<Folder>);\n });\n },\n canUseTeams: () => context.wcp.canUseTeams(),\n canUseFolderLevelPermissions: () => {\n if (setupAcoContextParams.useFolderLevelPermissions === false) {\n return false;\n }\n\n return context.wcp.canUseFolderLevelPermissions();\n },\n isAuthorizationEnabled: () => context.security.isAuthorizationEnabled()\n });\n\n const params: CreateAcoParams = {\n getLocale,\n getTenant,\n storageOperations,\n folderLevelPermissions\n };\n\n const defaultRecordModel = await context.security.withoutAuthorization(async () => {\n return context.cms.getModel(SEARCH_RECORD_MODEL_ID);\n });\n\n if (!defaultRecordModel) {\n throw new WebinyError(`There is no default record model in ${SEARCH_RECORD_MODEL_ID}`);\n }\n\n /**\n * First we need to create all the apps.\n */\n const apps = new AcoApps(context, params);\n const plugins = context.plugins.byType<AcoAppRegisterPlugin>(AcoAppRegisterPlugin.type);\n for (const plugin of plugins) {\n await apps.register({\n model: defaultRecordModel,\n ...plugin.app\n });\n }\n\n const listAdminUsers = () => {\n return security.withoutAuthorization(async () => {\n return context.adminUsers.listUsers();\n });\n };\n const listTeams = () => {\n return security.withoutAuthorization(async () => {\n return context.security.listTeams();\n });\n };\n\n context.aco = {\n folder: createFolderCrudMethods({\n ...params,\n listAdminUsers,\n listTeams\n }),\n search: createSearchRecordCrudMethods(params),\n folderLevelPermissions,\n filter: createFilterCrudMethods(params),\n apps,\n getApp: (name: string) => apps.get(name),\n listApps: () => apps.list(),\n registerApp: async (params: IAcoAppRegisterParams) => {\n return apps.register({\n model: defaultRecordModel,\n ...params\n });\n }\n };\n\n if (context.wcp.canUseFolderLevelPermissions()) {\n new CmsEntriesCrudDecorators({ context }).decorate();\n\n // PB decorators registered here: packages/api-page-builder-aco/src/index.ts\n // new PageBuilderCrudDecorators({ context }).decorate();\n }\n};\n\nexport const createAcoContext = (params: CreateAcoContextParams = {}) => {\n const plugin = new ContextPlugin<AcoContext>(async context => {\n /**\n * We can skip the ACO initialization if the installation is pending.\n */\n if (!(await isHeadlessCmsReady(context))) {\n return;\n }\n\n await context.benchmark.measure(\"aco.context.setup\", async () => {\n await setupAcoContext(context, params);\n });\n\n await context.benchmark.measure(\"aco.context.hooks\", async () => {\n await createAcoHooks(context);\n });\n });\n\n plugin.name = \"aco.createContext\";\n\n return plugin;\n};\n"],"mappings":"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"}
|
package/createAcoModels.js
CHANGED
|
@@ -12,7 +12,7 @@ const createAcoModels = context => {
|
|
|
12
12
|
/**
|
|
13
13
|
* Create CmsModel plugins.
|
|
14
14
|
*/
|
|
15
|
-
const modelDefinitions = [(0, _folder.
|
|
15
|
+
const modelDefinitions = [(0, _folder.createFolderModel)(), (0, _record.createSearchModel)(), (0, _filter.createFilterModel)()];
|
|
16
16
|
const cmsModelPlugins = modelDefinitions.map(modelDefinition => {
|
|
17
17
|
return (0, _modelFactory.modelFactory)({
|
|
18
18
|
modelDefinition
|
package/createAcoModels.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_filter","require","_folder","_record","_modelFactory","createAcoModels","context","modelDefinitions","
|
|
1
|
+
{"version":3,"names":["_filter","require","_folder","_record","_modelFactory","createAcoModels","context","modelDefinitions","createFolderModel","createSearchModel","createFilterModel","cmsModelPlugins","map","modelDefinition","modelFactory","plugins","register","exports"],"sources":["createAcoModels.ts"],"sourcesContent":["import { CmsContext } from \"@webiny/api-headless-cms/types\";\nimport { createFilterModel } from \"~/filter/filter.model\";\nimport { createFolderModel } from \"~/folder/folder.model\";\nimport { createSearchModel } from \"~/record/record.model\";\nimport { modelFactory } from \"~/utils/modelFactory\";\n\nexport const createAcoModels = (context: CmsContext) => {\n /**\n * Create CmsModel plugins.\n */\n const modelDefinitions = [createFolderModel(), createSearchModel(), createFilterModel()];\n const cmsModelPlugins = modelDefinitions.map(modelDefinition => {\n return modelFactory({\n modelDefinition\n });\n });\n\n /**\n * Register them so that they are accessible in cms context\n */\n context.plugins.register([cmsModelPlugins]);\n};\n"],"mappings":";;;;;;AACA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,aAAA,GAAAH,OAAA;AAEO,MAAMI,eAAe,GAAIC,OAAmB,IAAK;EACpD;AACJ;AACA;EACI,MAAMC,gBAAgB,GAAG,CAAC,IAAAC,yBAAiB,EAAC,CAAC,EAAE,IAAAC,yBAAiB,EAAC,CAAC,EAAE,IAAAC,yBAAiB,EAAC,CAAC,CAAC;EACxF,MAAMC,eAAe,GAAGJ,gBAAgB,CAACK,GAAG,CAACC,eAAe,IAAI;IAC5D,OAAO,IAAAC,0BAAY,EAAC;MAChBD;IACJ,CAAC,CAAC;EACN,CAAC,CAAC;;EAEF;AACJ;AACA;EACIP,OAAO,CAACS,OAAO,CAACC,QAAQ,CAAC,CAACL,eAAe,CAAC,CAAC;AAC/C,CAAC;AAACM,OAAA,CAAAZ,eAAA,GAAAA,eAAA"}
|
package/filter/filter.model.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const FILTER_MODEL_ID = "acoFilter";
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const createFilterModel: () => import("@webiny/api-headless-cms").CmsPrivateModelFull;
|
package/filter/filter.model.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.createFilterModel = exports.FILTER_MODEL_ID = void 0;
|
|
7
7
|
var _createModelField = require("../utils/createModelField");
|
|
8
8
|
var _apiHeadlessCms = require("@webiny/api-headless-cms");
|
|
9
9
|
const name = () => (0, _createModelField.createModelField)({
|
|
@@ -112,14 +112,14 @@ const value = () => (0, _createModelField.createModelField)({
|
|
|
112
112
|
});
|
|
113
113
|
const FILTER_MODEL_ID = "acoFilter";
|
|
114
114
|
exports.FILTER_MODEL_ID = FILTER_MODEL_ID;
|
|
115
|
-
const
|
|
116
|
-
return (0, _apiHeadlessCms.
|
|
115
|
+
const createFilterModel = () => {
|
|
116
|
+
return (0, _apiHeadlessCms.createPrivateModel)({
|
|
117
117
|
name: "ACO - Filter",
|
|
118
118
|
modelId: FILTER_MODEL_ID,
|
|
119
119
|
titleFieldId: "name",
|
|
120
120
|
fields: [name(), description(), namespace(), operation(), groups([operation(), filters([field(), condition(), value()])])]
|
|
121
121
|
});
|
|
122
122
|
};
|
|
123
|
-
exports.
|
|
123
|
+
exports.createFilterModel = createFilterModel;
|
|
124
124
|
|
|
125
125
|
//# sourceMappingURL=filter.model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_createModelField","require","_apiHeadlessCms","name","createModelField","label","fieldId","type","validation","message","description","namespace","operation","predefinedValues","enabled","values","value","multipleValues","groups","fields","settings","layout","map","field","storageId","listValidation","filters","condition","FILTER_MODEL_ID","exports","
|
|
1
|
+
{"version":3,"names":["_createModelField","require","_apiHeadlessCms","name","createModelField","label","fieldId","type","validation","message","description","namespace","operation","predefinedValues","enabled","values","value","multipleValues","groups","fields","settings","layout","map","field","storageId","listValidation","filters","condition","FILTER_MODEL_ID","exports","createFilterModel","createPrivateModel","modelId","titleFieldId"],"sources":["filter.model.ts"],"sourcesContent":["import { createModelField } from \"~/utils/createModelField\";\nimport { createPrivateModel } from \"@webiny/api-headless-cms\";\nimport { CmsModelField } from \"@webiny/api-headless-cms/types\";\n\nconst name = () =>\n createModelField({\n label: \"Name\",\n fieldId: \"name\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst description = () =>\n createModelField({\n label: \"Description\",\n fieldId: \"description\",\n type: \"text\"\n });\n\nconst namespace = () =>\n createModelField({\n label: \"Model Id\",\n fieldId: \"namespace\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst operation = () =>\n createModelField({\n label: \"Operation\",\n fieldId: \"operation\",\n type: \"text\",\n predefinedValues: {\n enabled: true,\n values: [\n {\n label: \"AND\",\n value: \"AND\"\n },\n {\n label: \"OR\",\n value: \"OR\"\n }\n ]\n },\n multipleValues: false,\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst groups = (fields: CmsModelField[]) =>\n createModelField({\n label: \"Groups\",\n fieldId: \"groups\",\n type: \"object\",\n multipleValues: true,\n settings: {\n fields,\n layout: fields.map(field => [field.storageId])\n },\n listValidation: [\n {\n name: \"minLength\",\n message: \"At least one group is required.\",\n settings: {\n value: \"1\"\n }\n }\n ]\n });\n\nconst filters = (fields: CmsModelField[]) =>\n createModelField({\n label: \"Filters\",\n fieldId: \"filters\",\n type: \"object\",\n multipleValues: true,\n settings: {\n fields,\n layout: fields.map(field => [field.storageId])\n },\n listValidation: [\n {\n name: \"minLength\",\n message: \"At least one filter is required.\",\n settings: {\n value: \"1\"\n }\n }\n ]\n });\n\nconst field = () =>\n createModelField({\n label: \"Field\",\n fieldId: \"field\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst condition = () =>\n createModelField({\n label: \"Condition\",\n fieldId: \"condition\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst value = () =>\n createModelField({\n label: \"Value\",\n fieldId: \"value\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nexport const FILTER_MODEL_ID = \"acoFilter\";\n\nexport const createFilterModel = () => {\n return createPrivateModel({\n name: \"ACO - Filter\",\n modelId: FILTER_MODEL_ID,\n titleFieldId: \"name\",\n fields: [\n name(),\n description(),\n namespace(),\n operation(),\n groups([operation(), filters([field(), condition(), value()])])\n ]\n });\n};\n"],"mappings":"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"}
|
package/folder/folder.crud.js
CHANGED
|
@@ -111,10 +111,15 @@ const createFolderCrudMethods = ({
|
|
|
111
111
|
data
|
|
112
112
|
});
|
|
113
113
|
|
|
114
|
-
// We need to add the newly created folder to FLP's internal cache.
|
|
115
|
-
|
|
114
|
+
// We need to add the newly created folder to FLP's internal cache. Note that we're also
|
|
115
|
+
// invalidating the permissions list cache for the folder type. We cannot rely on the cache
|
|
116
|
+
// to check if the user has access, because the cache is no longer up to date.
|
|
117
|
+
folderLevelPermissions.invalidateFoldersPermissionsListCache(folder.type);
|
|
118
|
+
folderLevelPermissions.updateFoldersCache(folder.type, cachedFolders => {
|
|
116
119
|
return [...cachedFolders, folder];
|
|
117
120
|
});
|
|
121
|
+
|
|
122
|
+
// With caches updated and invalidated, we can now assign correct permissions to the folder.
|
|
118
123
|
await folderLevelPermissions.assignFolderPermissions(folder);
|
|
119
124
|
await onFolderAfterCreate.publish({
|
|
120
125
|
folder
|
|
@@ -161,23 +166,32 @@ const createFolderCrudMethods = ({
|
|
|
161
166
|
}
|
|
162
167
|
}
|
|
163
168
|
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
169
|
+
// Finally, we check if the user would lose access to the folder by making the update.
|
|
170
|
+
// In order to do this, we need to make a couple of steps. First, we're updating FLP's
|
|
171
|
+
// internal cache with new folder data. Then, we're invalidating the permissions list
|
|
172
|
+
// cache for the folder type. We cannot rely on the cache to check if the user still
|
|
173
|
+
// has access, because the cache might no longer be up-to-date.
|
|
174
|
+
folderLevelPermissions.updateFoldersCache(original.type, cachedFolders => {
|
|
175
|
+
return cachedFolders.map(currentFolder => {
|
|
176
|
+
if (currentFolder.id !== id) {
|
|
177
|
+
return currentFolder;
|
|
170
178
|
}
|
|
171
|
-
return
|
|
179
|
+
return {
|
|
180
|
+
...currentFolder,
|
|
181
|
+
...data
|
|
182
|
+
};
|
|
172
183
|
});
|
|
173
184
|
});
|
|
185
|
+
folderLevelPermissions.invalidateFoldersPermissionsListCache(original.type);
|
|
186
|
+
|
|
187
|
+
// With caches updated and invalidated, we can now check if the user still
|
|
188
|
+
// has access to the folder.
|
|
174
189
|
const stillHasAccess = await folderLevelPermissions.canAccessFolder({
|
|
175
190
|
folder: {
|
|
176
191
|
id,
|
|
177
192
|
type: original.type
|
|
178
193
|
},
|
|
179
|
-
rwd: "w"
|
|
180
|
-
foldersList: customFoldersList
|
|
194
|
+
rwd: "w"
|
|
181
195
|
});
|
|
182
196
|
if (!stillHasAccess) {
|
|
183
197
|
throw new _error.default(`Cannot continue because you would loose access to this folder.`, "CANNOT_LOOSE_FOLDER_ACCESS");
|
|
@@ -193,6 +207,7 @@ const createFolderCrudMethods = ({
|
|
|
193
207
|
id,
|
|
194
208
|
data
|
|
195
209
|
});
|
|
210
|
+
await folderLevelPermissions.assignFolderPermissions(folder);
|
|
196
211
|
await onFolderAfterUpdate.publish({
|
|
197
212
|
original,
|
|
198
213
|
input: {
|
|
@@ -201,17 +216,6 @@ const createFolderCrudMethods = ({
|
|
|
201
216
|
},
|
|
202
217
|
folder
|
|
203
218
|
});
|
|
204
|
-
|
|
205
|
-
// We need to update the folder in FLP's internal cache.
|
|
206
|
-
folderLevelPermissions.updateCache(folder.type, cachedFolders => {
|
|
207
|
-
return cachedFolders.map(currentFolder => {
|
|
208
|
-
if (currentFolder.id === folder.id) {
|
|
209
|
-
return folder;
|
|
210
|
-
}
|
|
211
|
-
return currentFolder;
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
await folderLevelPermissions.assignFolderPermissions(folder);
|
|
215
219
|
return folder;
|
|
216
220
|
},
|
|
217
221
|
async delete(id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_pubsub","require","_validation","_getFolderAndItsAncestors","_NotAuthorizedError","_interopRequireDefault","_error","FIXED_FOLDER_LISTING_LIMIT","createFolderCrudMethods","storageOperations","folderLevelPermissions","listAdminUsers","listTeams","onFolderBeforeCreate","createTopic","onFolderAfterCreate","onFolderBeforeUpdate","onFolderAfterUpdate","onFolderBeforeDelete","onFolderAfterDelete","get","id","folder","getFolder","ensureCanAccessFolder","rwd","assignFolderPermissions","list","params","filteredFolders","listAllFoldersWithPermissions","where","type","then","parentId","filter","totalCount","length","hasMoreItems","cursor","after","afterListItemIndex","findIndex","splice","limit","listAll","create","data","canCreateFolder","parentFolder","canAccessFolder","canCreateFolderInRoot","NotAuthorizedError","publish","input","createFolder","updateCache","cachedFolders","update","original","canUpdateFolder","Array","isArray","permissions","forEach","permission","targetIsValid","target","startsWith","Error","inheritedFrom","e","WError","customFoldersList","listAllFolders","folders","foldersClone","structuredClone","map","Object","assign","stillHasAccess","foldersList","updateFolder","currentFolder","delete","deleteFolder","getAncestors","getFolderAndItsAncestors","getFolderWithAncestors","listFolderLevelPermissionsTargets","adminUsers","teams","teamTargets","team","name","meta","adminUserTargets","user","displayName","firstName","lastName","Boolean","join","email","validation","validateSync","image","avatar","src","results","exports"],"sources":["folder.crud.ts"],"sourcesContent":["import { createTopic } from \"@webiny/pubsub\";\nimport { validation } from \"@webiny/validation\";\nimport { CreateAcoParams, Folder } from \"~/types\";\nimport {\n AcoFolderCrud,\n OnFolderAfterCreateTopicParams,\n OnFolderAfterDeleteTopicParams,\n OnFolderAfterUpdateTopicParams,\n OnFolderBeforeCreateTopicParams,\n OnFolderBeforeDeleteTopicParams,\n OnFolderBeforeUpdateTopicParams\n} from \"./folder.types\";\n\nimport { getFolderAndItsAncestors } from \"~/utils/getFolderAndItsAncestors\";\nimport NotAuthorizedError from \"@webiny/api-security/NotAuthorizedError\";\nimport { AdminUser } from \"@webiny/api-admin-users/types\";\nimport { Team } from \"@webiny/api-security/types\";\nimport WError from \"@webiny/error\";\n\nconst FIXED_FOLDER_LISTING_LIMIT = 10_000;\n\ninterface CreateFolderCrudMethodsParams extends CreateAcoParams {\n listAdminUsers: () => Promise<AdminUser[]>;\n listTeams: () => Promise<Team[]>;\n}\n\nexport const createFolderCrudMethods = ({\n storageOperations,\n folderLevelPermissions,\n listAdminUsers,\n listTeams\n}: CreateFolderCrudMethodsParams): AcoFolderCrud => {\n // create\n const onFolderBeforeCreate = createTopic<OnFolderBeforeCreateTopicParams>(\n \"aco.onFolderBeforeCreate\"\n );\n const onFolderAfterCreate =\n createTopic<OnFolderAfterCreateTopicParams>(\"aco.onFolderAfterCreate\");\n // update\n const onFolderBeforeUpdate = createTopic<OnFolderBeforeUpdateTopicParams>(\n \"aco.onFolderBeforeUpdate\"\n );\n const onFolderAfterUpdate =\n createTopic<OnFolderAfterUpdateTopicParams>(\"aco.onFolderAfterUpdate\");\n // delete\n const onFolderBeforeDelete = createTopic<OnFolderBeforeDeleteTopicParams>(\n \"aco.onFolderBeforeDelete\"\n );\n const onFolderAfterDelete =\n createTopic<OnFolderAfterDeleteTopicParams>(\"aco.onFolderAfterDelete\");\n\n return {\n /**\n * Lifecycle events\n */\n onFolderBeforeCreate,\n onFolderAfterCreate,\n onFolderBeforeUpdate,\n onFolderAfterUpdate,\n onFolderBeforeDelete,\n onFolderAfterDelete,\n\n async get(id) {\n const folder = await storageOperations.getFolder({ id });\n\n await folderLevelPermissions.ensureCanAccessFolder({\n folder,\n rwd: \"r\"\n });\n\n await folderLevelPermissions.assignFolderPermissions(folder);\n return folder;\n },\n async list(params) {\n // No matter what was the limit set in the params, initially, we always retrieve\n // all folders. The limit is then applied with the filtered folders list below.\n const filteredFolders = await folderLevelPermissions\n .listAllFoldersWithPermissions(params.where.type)\n .then(filteredFolders => {\n // If `parentId` was included in the `where` clause, we need to filter the folders.\n // TODO: we might want to incorporate this into the `listAllFoldersWithPermissions` method.\n if (params.where.parentId) {\n // Filter by parent ID.\n return filteredFolders.filter(\n folder => folder.parentId === params.where.parentId\n );\n }\n return filteredFolders;\n });\n\n const totalCount = filteredFolders.length;\n let hasMoreItems = false;\n let cursor: string | null = null;\n\n // Apply cursor/limit params.\n if (params.after) {\n const afterListItemIndex = filteredFolders.findIndex(\n folder => folder.id === params.after\n );\n if (afterListItemIndex >= 0) {\n // Remove all items below the \"after\" item.\n filteredFolders.splice(0, afterListItemIndex + 1);\n }\n }\n\n hasMoreItems = !!params.limit && filteredFolders.length > params.limit;\n\n if (hasMoreItems) {\n cursor = filteredFolders[params.limit! - 1]?.id || null;\n filteredFolders.splice(params.limit!);\n }\n\n return [filteredFolders, { totalCount, hasMoreItems, cursor }];\n },\n\n async listAll(params) {\n return this.list({ ...params, limit: FIXED_FOLDER_LISTING_LIMIT });\n },\n\n async create(data) {\n let canCreateFolder = false;\n if (data.parentId) {\n const parentFolder = await storageOperations.getFolder({ id: data.parentId });\n canCreateFolder = await folderLevelPermissions.canAccessFolder({\n folder: parentFolder,\n rwd: \"w\"\n });\n } else {\n canCreateFolder = await folderLevelPermissions.canCreateFolderInRoot();\n }\n\n if (!canCreateFolder) {\n throw new NotAuthorizedError();\n }\n\n await onFolderBeforeCreate.publish({ input: data });\n const folder = await storageOperations.createFolder({ data });\n\n // We need to add the newly created folder to FLP's internal cache.\n folderLevelPermissions.updateCache(folder.type, cachedFolders => {\n return [...cachedFolders, folder];\n });\n\n await folderLevelPermissions.assignFolderPermissions(folder);\n\n await onFolderAfterCreate.publish({ folder });\n\n return folder;\n },\n\n async update(id, data) {\n const original = await storageOperations.getFolder({ id });\n\n const canUpdateFolder = await folderLevelPermissions.canAccessFolder({\n folder: original,\n rwd: \"w\"\n });\n\n if (!canUpdateFolder) {\n throw new NotAuthorizedError();\n }\n\n // Validate data.\n if (Array.isArray(data.permissions)) {\n data.permissions.forEach(permission => {\n const targetIsValid =\n permission.target.startsWith(\"admin:\") ||\n permission.target.startsWith(\"team:\");\n if (!targetIsValid) {\n throw new Error(`Permission target \"${permission.target}\" is not valid.`);\n }\n\n if (permission.inheritedFrom) {\n throw new Error(`Permission \"inheritedFrom\" cannot be set manually.`);\n }\n });\n }\n\n // Parent change is not allowed if the user doesn't have access to the new parent.\n if (data.parentId && data.parentId !== original.parentId) {\n try {\n // Getting the parent folder will throw an error if the user doesn't have access.\n await this.get(data.parentId);\n } catch (e) {\n if (e instanceof NotAuthorizedError) {\n throw new WError(\n `Cannot move folder to a new parent because you don't have access to the new parent.`,\n \"CANNOT_MOVE_FOLDER_TO_NEW_PARENT\"\n );\n }\n\n // If we didn't receive the expected error, we still want to throw it.\n throw e;\n }\n }\n\n // Let's prepare a custom folder permissions list, where the folder contains the updated data.\n const customFoldersList = await folderLevelPermissions\n .listAllFolders(original.type)\n .then(folders => {\n const foldersClone = structuredClone<Folder[]>(folders);\n return foldersClone.map(folder => {\n if (folder.id === id) {\n Object.assign(folder, data);\n }\n return folder;\n });\n });\n\n const stillHasAccess = await folderLevelPermissions.canAccessFolder({\n folder: { id, type: original.type },\n rwd: \"w\",\n foldersList: customFoldersList\n });\n\n if (!stillHasAccess) {\n throw new WError(\n `Cannot continue because you would loose access to this folder.`,\n \"CANNOT_LOOSE_FOLDER_ACCESS\"\n );\n }\n\n await onFolderBeforeUpdate.publish({ original, input: { id, data } });\n const folder = await storageOperations.updateFolder({ id, data });\n await onFolderAfterUpdate.publish({ original, input: { id, data }, folder });\n\n // We need to update the folder in FLP's internal cache.\n folderLevelPermissions.updateCache(folder.type, cachedFolders => {\n return cachedFolders.map(currentFolder => {\n if (currentFolder.id === folder.id) {\n return folder;\n }\n return currentFolder;\n });\n });\n\n await folderLevelPermissions.assignFolderPermissions(folder);\n return folder;\n },\n\n async delete(id: string) {\n const folder = await storageOperations.getFolder({ id });\n\n await folderLevelPermissions.ensureCanAccessFolder({\n folder,\n rwd: \"d\"\n });\n\n await onFolderBeforeDelete.publish({ folder });\n await storageOperations.deleteFolder({ id });\n await onFolderAfterDelete.publish({ folder });\n return true;\n },\n\n async getAncestors(folder: Folder) {\n const [folders] = await this.listAll({ where: { type: folder.type } });\n return getFolderAndItsAncestors({ folder, folders });\n },\n\n /**\n * @deprecated use `getAncestors` instead\n */\n async getFolderWithAncestors(id: string) {\n const folder = await this.get(id);\n return this.getAncestors(folder);\n },\n\n async listFolderLevelPermissionsTargets() {\n const adminUsers = await listAdminUsers();\n const teams = await listTeams();\n\n const teamTargets = teams.map(team => ({\n id: team.id,\n type: \"team\",\n target: `team:${team.id}`,\n name: team.name || \"\",\n meta: {}\n }));\n\n const adminUserTargets = adminUsers.map(user => {\n let name = user.displayName;\n if (!name) {\n // For backwards compatibility, we also want to try concatenating first and last name.\n name = [user.firstName, user.lastName].filter(Boolean).join(\" \");\n }\n\n // We're doing the validation because, with non-Cognito IdPs (Okta, Auth0), the email\n // field might actually contain a non-email value: `id:${IdP_Identity_ID}`. In that case,\n // let's not assign anything to the `email` field.\n let email: string | null = user.email;\n try {\n validation.validateSync(email, \"email\");\n } catch {\n email = null;\n }\n\n const image = user.avatar?.src || null;\n\n return {\n id: user.id,\n type: \"admin\",\n target: `admin:${user.id}`,\n name,\n meta: {\n email,\n image\n }\n };\n });\n\n const results = [...teamTargets, ...adminUserTargets];\n const meta = { totalCount: results.length };\n\n return [results, meta];\n }\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_pubsub","require","_validation","_getFolderAndItsAncestors","_NotAuthorizedError","_interopRequireDefault","_error","FIXED_FOLDER_LISTING_LIMIT","createFolderCrudMethods","storageOperations","folderLevelPermissions","listAdminUsers","listTeams","onFolderBeforeCreate","createTopic","onFolderAfterCreate","onFolderBeforeUpdate","onFolderAfterUpdate","onFolderBeforeDelete","onFolderAfterDelete","get","id","folder","getFolder","ensureCanAccessFolder","rwd","assignFolderPermissions","list","params","filteredFolders","listAllFoldersWithPermissions","where","type","then","parentId","filter","totalCount","length","hasMoreItems","cursor","after","afterListItemIndex","findIndex","splice","limit","listAll","create","data","canCreateFolder","parentFolder","canAccessFolder","canCreateFolderInRoot","NotAuthorizedError","publish","input","createFolder","invalidateFoldersPermissionsListCache","updateFoldersCache","cachedFolders","update","original","canUpdateFolder","Array","isArray","permissions","forEach","permission","targetIsValid","target","startsWith","Error","inheritedFrom","e","WError","map","currentFolder","stillHasAccess","updateFolder","delete","deleteFolder","getAncestors","folders","getFolderAndItsAncestors","getFolderWithAncestors","listFolderLevelPermissionsTargets","adminUsers","teams","teamTargets","team","name","meta","adminUserTargets","user","displayName","firstName","lastName","Boolean","join","email","validation","validateSync","image","avatar","src","results","exports"],"sources":["folder.crud.ts"],"sourcesContent":["import { createTopic } from \"@webiny/pubsub\";\nimport { validation } from \"@webiny/validation\";\nimport { CreateAcoParams, Folder } from \"~/types\";\nimport {\n AcoFolderCrud,\n OnFolderAfterCreateTopicParams,\n OnFolderAfterDeleteTopicParams,\n OnFolderAfterUpdateTopicParams,\n OnFolderBeforeCreateTopicParams,\n OnFolderBeforeDeleteTopicParams,\n OnFolderBeforeUpdateTopicParams\n} from \"./folder.types\";\n\nimport { getFolderAndItsAncestors } from \"~/utils/getFolderAndItsAncestors\";\nimport NotAuthorizedError from \"@webiny/api-security/NotAuthorizedError\";\nimport { AdminUser } from \"@webiny/api-admin-users/types\";\nimport { Team } from \"@webiny/api-security/types\";\nimport WError from \"@webiny/error\";\n\nconst FIXED_FOLDER_LISTING_LIMIT = 10_000;\n\ninterface CreateFolderCrudMethodsParams extends CreateAcoParams {\n listAdminUsers: () => Promise<AdminUser[]>;\n listTeams: () => Promise<Team[]>;\n}\n\nexport const createFolderCrudMethods = ({\n storageOperations,\n folderLevelPermissions,\n listAdminUsers,\n listTeams\n}: CreateFolderCrudMethodsParams): AcoFolderCrud => {\n // create\n const onFolderBeforeCreate = createTopic<OnFolderBeforeCreateTopicParams>(\n \"aco.onFolderBeforeCreate\"\n );\n const onFolderAfterCreate =\n createTopic<OnFolderAfterCreateTopicParams>(\"aco.onFolderAfterCreate\");\n // update\n const onFolderBeforeUpdate = createTopic<OnFolderBeforeUpdateTopicParams>(\n \"aco.onFolderBeforeUpdate\"\n );\n const onFolderAfterUpdate =\n createTopic<OnFolderAfterUpdateTopicParams>(\"aco.onFolderAfterUpdate\");\n // delete\n const onFolderBeforeDelete = createTopic<OnFolderBeforeDeleteTopicParams>(\n \"aco.onFolderBeforeDelete\"\n );\n const onFolderAfterDelete =\n createTopic<OnFolderAfterDeleteTopicParams>(\"aco.onFolderAfterDelete\");\n\n return {\n /**\n * Lifecycle events\n */\n onFolderBeforeCreate,\n onFolderAfterCreate,\n onFolderBeforeUpdate,\n onFolderAfterUpdate,\n onFolderBeforeDelete,\n onFolderAfterDelete,\n\n async get(id) {\n const folder = await storageOperations.getFolder({ id });\n\n await folderLevelPermissions.ensureCanAccessFolder({\n folder,\n rwd: \"r\"\n });\n\n await folderLevelPermissions.assignFolderPermissions(folder);\n return folder;\n },\n async list(params) {\n // No matter what was the limit set in the params, initially, we always retrieve\n // all folders. The limit is then applied with the filtered folders list below.\n const filteredFolders = await folderLevelPermissions\n .listAllFoldersWithPermissions(params.where.type)\n .then(filteredFolders => {\n // If `parentId` was included in the `where` clause, we need to filter the folders.\n // TODO: we might want to incorporate this into the `listAllFoldersWithPermissions` method.\n if (params.where.parentId) {\n // Filter by parent ID.\n return filteredFolders.filter(\n folder => folder.parentId === params.where.parentId\n );\n }\n return filteredFolders;\n });\n\n const totalCount = filteredFolders.length;\n let hasMoreItems = false;\n let cursor: string | null = null;\n\n // Apply cursor/limit params.\n if (params.after) {\n const afterListItemIndex = filteredFolders.findIndex(\n folder => folder.id === params.after\n );\n if (afterListItemIndex >= 0) {\n // Remove all items below the \"after\" item.\n filteredFolders.splice(0, afterListItemIndex + 1);\n }\n }\n\n hasMoreItems = !!params.limit && filteredFolders.length > params.limit;\n\n if (hasMoreItems) {\n cursor = filteredFolders[params.limit! - 1]?.id || null;\n filteredFolders.splice(params.limit!);\n }\n\n return [filteredFolders, { totalCount, hasMoreItems, cursor }];\n },\n\n async listAll(params) {\n return this.list({ ...params, limit: FIXED_FOLDER_LISTING_LIMIT });\n },\n\n async create(data) {\n let canCreateFolder = false;\n if (data.parentId) {\n const parentFolder = await storageOperations.getFolder({ id: data.parentId });\n canCreateFolder = await folderLevelPermissions.canAccessFolder({\n folder: parentFolder,\n rwd: \"w\"\n });\n } else {\n canCreateFolder = await folderLevelPermissions.canCreateFolderInRoot();\n }\n\n if (!canCreateFolder) {\n throw new NotAuthorizedError();\n }\n\n await onFolderBeforeCreate.publish({ input: data });\n const folder = await storageOperations.createFolder({ data });\n\n // We need to add the newly created folder to FLP's internal cache. Note that we're also\n // invalidating the permissions list cache for the folder type. We cannot rely on the cache\n // to check if the user has access, because the cache is no longer up to date.\n folderLevelPermissions.invalidateFoldersPermissionsListCache(folder.type);\n folderLevelPermissions.updateFoldersCache(folder.type, cachedFolders => {\n return [...cachedFolders, folder];\n });\n\n // With caches updated and invalidated, we can now assign correct permissions to the folder.\n await folderLevelPermissions.assignFolderPermissions(folder);\n\n await onFolderAfterCreate.publish({ folder });\n\n return folder;\n },\n\n async update(id, data) {\n const original = await storageOperations.getFolder({ id });\n\n const canUpdateFolder = await folderLevelPermissions.canAccessFolder({\n folder: original,\n rwd: \"w\"\n });\n\n if (!canUpdateFolder) {\n throw new NotAuthorizedError();\n }\n\n // Validate data.\n if (Array.isArray(data.permissions)) {\n data.permissions.forEach(permission => {\n const targetIsValid =\n permission.target.startsWith(\"admin:\") ||\n permission.target.startsWith(\"team:\");\n if (!targetIsValid) {\n throw new Error(`Permission target \"${permission.target}\" is not valid.`);\n }\n\n if (permission.inheritedFrom) {\n throw new Error(`Permission \"inheritedFrom\" cannot be set manually.`);\n }\n });\n }\n\n // Parent change is not allowed if the user doesn't have access to the new parent.\n if (data.parentId && data.parentId !== original.parentId) {\n try {\n // Getting the parent folder will throw an error if the user doesn't have access.\n await this.get(data.parentId);\n } catch (e) {\n if (e instanceof NotAuthorizedError) {\n throw new WError(\n `Cannot move folder to a new parent because you don't have access to the new parent.`,\n \"CANNOT_MOVE_FOLDER_TO_NEW_PARENT\"\n );\n }\n\n // If we didn't receive the expected error, we still want to throw it.\n throw e;\n }\n }\n\n // Finally, we check if the user would lose access to the folder by making the update.\n // In order to do this, we need to make a couple of steps. First, we're updating FLP's\n // internal cache with new folder data. Then, we're invalidating the permissions list\n // cache for the folder type. We cannot rely on the cache to check if the user still\n // has access, because the cache might no longer be up-to-date.\n folderLevelPermissions.updateFoldersCache(original.type, cachedFolders => {\n return cachedFolders.map(currentFolder => {\n if (currentFolder.id !== id) {\n return currentFolder;\n }\n return { ...currentFolder, ...data };\n });\n });\n folderLevelPermissions.invalidateFoldersPermissionsListCache(original.type);\n\n // With caches updated and invalidated, we can now check if the user still\n // has access to the folder.\n const stillHasAccess = await folderLevelPermissions.canAccessFolder({\n folder: { id, type: original.type },\n rwd: \"w\"\n });\n\n if (!stillHasAccess) {\n throw new WError(\n `Cannot continue because you would loose access to this folder.`,\n \"CANNOT_LOOSE_FOLDER_ACCESS\"\n );\n }\n\n await onFolderBeforeUpdate.publish({ original, input: { id, data } });\n\n const folder = await storageOperations.updateFolder({ id, data });\n await folderLevelPermissions.assignFolderPermissions(folder);\n\n await onFolderAfterUpdate.publish({ original, input: { id, data }, folder });\n\n return folder;\n },\n\n async delete(id: string) {\n const folder = await storageOperations.getFolder({ id });\n\n await folderLevelPermissions.ensureCanAccessFolder({\n folder,\n rwd: \"d\"\n });\n\n await onFolderBeforeDelete.publish({ folder });\n await storageOperations.deleteFolder({ id });\n await onFolderAfterDelete.publish({ folder });\n return true;\n },\n\n async getAncestors(folder: Folder) {\n const [folders] = await this.listAll({ where: { type: folder.type } });\n return getFolderAndItsAncestors({ folder, folders });\n },\n\n /**\n * @deprecated use `getAncestors` instead\n */\n async getFolderWithAncestors(id: string) {\n const folder = await this.get(id);\n return this.getAncestors(folder);\n },\n\n async listFolderLevelPermissionsTargets() {\n const adminUsers = await listAdminUsers();\n const teams = await listTeams();\n\n const teamTargets = teams.map(team => ({\n id: team.id,\n type: \"team\",\n target: `team:${team.id}`,\n name: team.name || \"\",\n meta: {}\n }));\n\n const adminUserTargets = adminUsers.map(user => {\n let name = user.displayName;\n if (!name) {\n // For backwards compatibility, we also want to try concatenating first and last name.\n name = [user.firstName, user.lastName].filter(Boolean).join(\" \");\n }\n\n // We're doing the validation because, with non-Cognito IdPs (Okta, Auth0), the email\n // field might actually contain a non-email value: `id:${IdP_Identity_ID}`. In that case,\n // let's not assign anything to the `email` field.\n let email: string | null = user.email;\n try {\n validation.validateSync(email, \"email\");\n } catch {\n email = null;\n }\n\n const image = user.avatar?.src || null;\n\n return {\n id: user.id,\n type: \"admin\",\n target: `admin:${user.id}`,\n name,\n meta: {\n email,\n image\n }\n };\n });\n\n const results = [...teamTargets, ...adminUserTargets];\n const meta = { totalCount: results.length };\n\n return [results, meta];\n }\n };\n};\n"],"mappings":"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"}
|
package/folder/folder.model.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const FOLDER_MODEL_ID = "acoFolder";
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const createFolderModel: () => import("@webiny/api-headless-cms").CmsPrivateModelFull;
|
package/folder/folder.model.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.createFolderModel = exports.FOLDER_MODEL_ID = void 0;
|
|
7
7
|
var _createModelField = require("../utils/createModelField");
|
|
8
8
|
var _apiHeadlessCms = require("@webiny/api-headless-cms");
|
|
9
9
|
const titleField = () => (0, _createModelField.createModelField)({
|
|
@@ -91,14 +91,22 @@ const permissionsField = () => (0, _createModelField.createModelField)({
|
|
|
91
91
|
});
|
|
92
92
|
const FOLDER_MODEL_ID = "acoFolder";
|
|
93
93
|
exports.FOLDER_MODEL_ID = FOLDER_MODEL_ID;
|
|
94
|
-
const
|
|
95
|
-
return (0, _apiHeadlessCms.
|
|
94
|
+
const createFolderModel = () => {
|
|
95
|
+
return (0, _apiHeadlessCms.createPrivateModel)({
|
|
96
96
|
name: "ACO - Folder",
|
|
97
97
|
modelId: FOLDER_MODEL_ID,
|
|
98
|
+
authorization: {
|
|
99
|
+
// Disables base permission checks, but leaves FLP checks enabled.
|
|
100
|
+
permissions: false
|
|
101
|
+
|
|
102
|
+
// We're leaving FLP enabled (no need to set `flp: true`).
|
|
103
|
+
// flp: true
|
|
104
|
+
},
|
|
105
|
+
|
|
98
106
|
titleFieldId: "title",
|
|
99
107
|
fields: [titleField(), slugField(), typeField(), parentIdField(), permissionsField()]
|
|
100
108
|
});
|
|
101
109
|
};
|
|
102
|
-
exports.
|
|
110
|
+
exports.createFolderModel = createFolderModel;
|
|
103
111
|
|
|
104
112
|
//# sourceMappingURL=folder.model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_createModelField","require","_apiHeadlessCms","titleField","createModelField","label","type","validation","name","message","slugField","settings","preset","regex","flags","typeField","parentIdField","permissionsField","fieldId","multipleValues","listValidation","fields","id","storageId","predefinedValues","enabled","values","value","layout","FOLDER_MODEL_ID","exports","
|
|
1
|
+
{"version":3,"names":["_createModelField","require","_apiHeadlessCms","titleField","createModelField","label","type","validation","name","message","slugField","settings","preset","regex","flags","typeField","parentIdField","permissionsField","fieldId","multipleValues","listValidation","fields","id","storageId","predefinedValues","enabled","values","value","layout","FOLDER_MODEL_ID","exports","createFolderModel","createPrivateModel","modelId","authorization","permissions","titleFieldId"],"sources":["folder.model.ts"],"sourcesContent":["import { createModelField } from \"~/utils/createModelField\";\nimport { createPrivateModel } from \"@webiny/api-headless-cms\";\n\nconst titleField = () =>\n createModelField({\n label: \"Title\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst slugField = () =>\n createModelField({\n label: \"Slug\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n },\n {\n name: \"pattern\",\n settings: {\n preset: \"custom\",\n regex: \"^[a-z0-9]+(-[a-z0-9]+)*$\",\n flags: \"g\"\n },\n message: \"Value must consist of only 'a-z', '0-9' and '-'.\"\n }\n ]\n });\n\nconst typeField = () =>\n createModelField({\n label: \"Type\",\n type: \"text\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n });\n\nconst parentIdField = () =>\n createModelField({\n label: \"Parent Id\",\n type: \"text\"\n });\n\nconst permissionsField = () =>\n createModelField({\n label: \"Permissions\",\n fieldId: \"permissions\",\n type: \"object\",\n multipleValues: true,\n listValidation: [],\n settings: {\n fields: [\n {\n id: \"target\",\n type: \"text\",\n storageId: \"text@target\",\n fieldId: \"target\",\n label: \"Target\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ]\n },\n {\n id: \"level\",\n type: \"text\",\n storageId: \"text@level\",\n fieldId: \"level\",\n label: \"Level\",\n validation: [\n {\n name: \"required\",\n message: \"Value is required.\"\n }\n ],\n predefinedValues: {\n enabled: true,\n values: [\n {\n label: \"Viewer\",\n value: \"viewer\"\n },\n {\n label: \"Editor\",\n value: \"editor\"\n },\n {\n label: \"Owner\",\n value: \"owner\"\n },\n {\n label: \"Public\",\n value: \"public\"\n }\n ]\n }\n }\n ],\n layout: [[\"target\"], [\"level\"]]\n }\n });\n\nexport const FOLDER_MODEL_ID = \"acoFolder\";\n\nexport const createFolderModel = () => {\n return createPrivateModel({\n name: \"ACO - Folder\",\n modelId: FOLDER_MODEL_ID,\n authorization: {\n // Disables base permission checks, but leaves FLP checks enabled.\n permissions: false\n\n // We're leaving FLP enabled (no need to set `flp: true`).\n // flp: true\n },\n titleFieldId: \"title\",\n fields: [titleField(), slugField(), typeField(), parentIdField(), permissionsField()]\n });\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-aco",
|
|
3
|
-
"version": "5.39.
|
|
3
|
+
"version": "5.39.2-beta.0",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"aco:base"
|
|
@@ -22,18 +22,18 @@
|
|
|
22
22
|
"directory": "dist"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@webiny/api": "5.39.
|
|
26
|
-
"@webiny/api-authentication": "5.39.
|
|
27
|
-
"@webiny/api-headless-cms": "5.39.
|
|
28
|
-
"@webiny/api-i18n": "5.39.
|
|
29
|
-
"@webiny/api-security": "5.39.
|
|
30
|
-
"@webiny/api-tenancy": "5.39.
|
|
31
|
-
"@webiny/error": "5.39.
|
|
32
|
-
"@webiny/handler": "5.39.
|
|
33
|
-
"@webiny/handler-graphql": "5.39.
|
|
34
|
-
"@webiny/pubsub": "5.39.
|
|
35
|
-
"@webiny/utils": "5.39.
|
|
36
|
-
"@webiny/validation": "5.39.
|
|
25
|
+
"@webiny/api": "5.39.2-beta.0",
|
|
26
|
+
"@webiny/api-authentication": "5.39.2-beta.0",
|
|
27
|
+
"@webiny/api-headless-cms": "5.39.2-beta.0",
|
|
28
|
+
"@webiny/api-i18n": "5.39.2-beta.0",
|
|
29
|
+
"@webiny/api-security": "5.39.2-beta.0",
|
|
30
|
+
"@webiny/api-tenancy": "5.39.2-beta.0",
|
|
31
|
+
"@webiny/error": "5.39.2-beta.0",
|
|
32
|
+
"@webiny/handler": "5.39.2-beta.0",
|
|
33
|
+
"@webiny/handler-graphql": "5.39.2-beta.0",
|
|
34
|
+
"@webiny/pubsub": "5.39.2-beta.0",
|
|
35
|
+
"@webiny/utils": "5.39.2-beta.0",
|
|
36
|
+
"@webiny/validation": "5.39.2-beta.0",
|
|
37
37
|
"lodash": "4.17.21"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
@@ -43,22 +43,22 @@
|
|
|
43
43
|
"@babel/preset-typescript": "7.22.5",
|
|
44
44
|
"@babel/runtime": "7.22.6",
|
|
45
45
|
"@types/ungap__structured-clone": "0.3.0",
|
|
46
|
-
"@webiny/api-admin-users": "5.39.
|
|
47
|
-
"@webiny/api-file-manager": "5.39.
|
|
48
|
-
"@webiny/api-i18n-ddb": "5.39.
|
|
49
|
-
"@webiny/api-security-so-ddb": "5.39.
|
|
50
|
-
"@webiny/api-tenancy-so-ddb": "5.39.
|
|
51
|
-
"@webiny/api-wcp": "5.39.
|
|
52
|
-
"@webiny/cli": "5.39.
|
|
53
|
-
"@webiny/handler-aws": "5.39.
|
|
54
|
-
"@webiny/plugins": "5.39.
|
|
55
|
-
"@webiny/project-utils": "5.39.
|
|
56
|
-
"@webiny/wcp": "5.39.
|
|
46
|
+
"@webiny/api-admin-users": "5.39.2-beta.0",
|
|
47
|
+
"@webiny/api-file-manager": "5.39.2-beta.0",
|
|
48
|
+
"@webiny/api-i18n-ddb": "5.39.2-beta.0",
|
|
49
|
+
"@webiny/api-security-so-ddb": "5.39.2-beta.0",
|
|
50
|
+
"@webiny/api-tenancy-so-ddb": "5.39.2-beta.0",
|
|
51
|
+
"@webiny/api-wcp": "5.39.2-beta.0",
|
|
52
|
+
"@webiny/cli": "5.39.2-beta.0",
|
|
53
|
+
"@webiny/handler-aws": "5.39.2-beta.0",
|
|
54
|
+
"@webiny/plugins": "5.39.2-beta.0",
|
|
55
|
+
"@webiny/project-utils": "5.39.2-beta.0",
|
|
56
|
+
"@webiny/wcp": "5.39.2-beta.0",
|
|
57
57
|
"graphql": "15.8.0",
|
|
58
58
|
"prettier": "2.8.8",
|
|
59
59
|
"rimraf": "3.0.2",
|
|
60
60
|
"ttypescript": "1.5.15",
|
|
61
61
|
"typescript": "4.7.4"
|
|
62
62
|
},
|
|
63
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "3ceff3406ff490e6d7503b35733a09c1cee8ff12"
|
|
64
64
|
}
|
package/record/record.model.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { CmsModelField } from "@webiny/api-headless-cms/types";
|
|
2
2
|
export declare const SEARCH_RECORD_MODEL_ID = "acoSearchRecord";
|
|
3
|
-
interface
|
|
3
|
+
interface CreateSearchModelParams {
|
|
4
4
|
fields?: CmsModelField[];
|
|
5
5
|
}
|
|
6
6
|
export declare const DEFAULT_FIELDS: string[];
|
|
7
|
-
export declare const
|
|
7
|
+
export declare const createSearchModel: (params?: CreateSearchModelParams) => import("@webiny/api-headless-cms").CmsPrivateModelFull;
|
|
8
8
|
export {};
|
package/record/record.model.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.createSearchModel = exports.SEARCH_RECORD_MODEL_ID = exports.DEFAULT_FIELDS = void 0;
|
|
7
7
|
var _createModelField = require("../utils/createModelField");
|
|
8
8
|
var _apiHeadlessCms = require("@webiny/api-headless-cms");
|
|
9
9
|
const typeField = () => (0, _createModelField.createModelField)({
|
|
@@ -73,14 +73,22 @@ const SEARCH_RECORD_MODEL_ID = "acoSearchRecord";
|
|
|
73
73
|
exports.SEARCH_RECORD_MODEL_ID = SEARCH_RECORD_MODEL_ID;
|
|
74
74
|
const DEFAULT_FIELDS = ["type", "title", "content", "location", "data", "tags"];
|
|
75
75
|
exports.DEFAULT_FIELDS = DEFAULT_FIELDS;
|
|
76
|
-
const
|
|
77
|
-
return (0, _apiHeadlessCms.
|
|
76
|
+
const createSearchModel = params => {
|
|
77
|
+
return (0, _apiHeadlessCms.createPrivateModel)({
|
|
78
78
|
name: "ACO - Search Record",
|
|
79
79
|
modelId: SEARCH_RECORD_MODEL_ID,
|
|
80
80
|
titleFieldId: "title",
|
|
81
|
+
authorization: {
|
|
82
|
+
// Disables base permission checks, but leaves FLP checks enabled.
|
|
83
|
+
permissions: false
|
|
84
|
+
|
|
85
|
+
// We're leaving FLP enabled (no need to set `flp: true`).
|
|
86
|
+
// flp: true
|
|
87
|
+
},
|
|
88
|
+
|
|
81
89
|
fields: [typeField(), titleField(), contentField(), locationField([locationFolderIdField()]), dataField(params?.fields), tagsField()]
|
|
82
90
|
});
|
|
83
91
|
};
|
|
84
|
-
exports.
|
|
92
|
+
exports.createSearchModel = createSearchModel;
|
|
85
93
|
|
|
86
94
|
//# sourceMappingURL=record.model.js.map
|