@webiny/api-aco 5.43.0-beta.1 → 5.43.0-beta.3
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/apps/AcoApp.js +4 -4
- package/apps/AcoApp.js.map +1 -1
- package/flp/FolderLevelPermissions/useCases/CanAccessFolder/CanAccessFolder.js +7 -2
- package/flp/FolderLevelPermissions/useCases/CanAccessFolder/CanAccessFolder.js.map +1 -1
- package/flp/FolderLevelPermissions/useCases/CanAccessFolderContent/CanAccessFolderContent.js +8 -3
- package/flp/FolderLevelPermissions/useCases/CanAccessFolderContent/CanAccessFolderContent.js.map +1 -1
- package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/DefaultPermissionsMerger.d.ts +6 -0
- package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/DefaultPermissionsMerger.js +77 -0
- package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/DefaultPermissionsMerger.js.map +1 -0
- package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissions.d.ts +0 -1
- package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissions.js +3 -35
- package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissions.js.map +1 -1
- package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissionsWithTeams.d.ts +1 -1
- package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissionsWithTeams.js +3 -1
- package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissionsWithTeams.js.map +1 -1
- package/flp/flp.types.d.ts +1 -1
- package/flp/flp.types.js.map +1 -1
- package/flp/useCases/Permissions.d.ts +2 -2
- package/flp/useCases/Permissions.js +31 -22
- package/flp/useCases/Permissions.js.map +1 -1
- package/folder/folder.model.js +3 -0
- package/folder/folder.model.js.map +1 -1
- package/package.json +27 -27
- package/types.d.ts +2 -2
- package/types.js.map +1 -1
package/apps/AcoApp.js
CHANGED
|
@@ -21,7 +21,7 @@ class AcoApp {
|
|
|
21
21
|
if (!this.onEntry) {
|
|
22
22
|
return result;
|
|
23
23
|
}
|
|
24
|
-
return await this.onEntry(result);
|
|
24
|
+
return await this.onEntry(result, this.context);
|
|
25
25
|
},
|
|
26
26
|
update: async (id, data) => {
|
|
27
27
|
await this.execOnAnyRequest("update");
|
|
@@ -29,7 +29,7 @@ class AcoApp {
|
|
|
29
29
|
if (!this.onEntry) {
|
|
30
30
|
return result;
|
|
31
31
|
}
|
|
32
|
-
return await this.onEntry(result);
|
|
32
|
+
return await this.onEntry(result, this.context);
|
|
33
33
|
},
|
|
34
34
|
move: async (id, folderId) => {
|
|
35
35
|
await this.execOnAnyRequest("move");
|
|
@@ -41,7 +41,7 @@ class AcoApp {
|
|
|
41
41
|
if (!result || !this.onEntry) {
|
|
42
42
|
return result;
|
|
43
43
|
}
|
|
44
|
-
return await this.onEntry(result);
|
|
44
|
+
return await this.onEntry(result, this.context);
|
|
45
45
|
},
|
|
46
46
|
list: async params => {
|
|
47
47
|
await this.execOnAnyRequest("fetch");
|
|
@@ -51,7 +51,7 @@ class AcoApp {
|
|
|
51
51
|
return result;
|
|
52
52
|
}
|
|
53
53
|
const [entries, meta] = result;
|
|
54
|
-
const items = await onEntryList(entries);
|
|
54
|
+
const items = await onEntryList(entries, this.context);
|
|
55
55
|
return [items, meta];
|
|
56
56
|
},
|
|
57
57
|
delete: async id => {
|
package/apps/AcoApp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_error","_interopRequireDefault","require","_upperFirst","_camelCase","_record","createApiName","name","lodashUpperFirst","lodashCamelCase","AcoApp","search","create","data","execOnAnyRequest","result","context","aco","getModel","onEntry","update","id","move","folderId","get","list","params","onEntryList","entries","meta","items","delete","listTags","folder","tenant","tenancy","getCurrentTenant","locale","i18n","getContentLocale","code","model","constructor","structuredClone","modelId","toLowerCase","apiName","singularApiName","pluralApiName","index","fields","findIndex","f","fieldId","WebinyError","settings","push","getFields","addField","field","removeField","DEFAULT_FIELDS","includes","splice","modifyField","cb","action","onAnyRequest","exports"],"sources":["AcoApp.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n AcoContext,\n AcoRequestAction,\n AcoSearchRecordCrudBase,\n CreateSearchRecordParams,\n GenericSearchData,\n IAcoApp,\n IAcoAppModifyFieldCallableCallback,\n IAcoAppOnAnyRequest,\n IAcoAppOnEntry,\n IAcoAppOnEntryList,\n IAcoAppParams,\n ListSearchRecordsParams,\n ListSearchRecordTagsParams,\n SearchRecord,\n UpdateSearchRecordParams\n} from \"~/types\";\nimport { CmsModel, CmsModelField } from \"@webiny/api-headless-cms/types\";\nimport lodashUpperFirst from \"lodash/upperFirst\";\nimport lodashCamelCase from \"lodash/camelCase\";\nimport { DEFAULT_FIELDS } from \"~/record/record.model\";\n\nconst createApiName = (name: string) => {\n return lodashUpperFirst(lodashCamelCase(name));\n};\n\nexport class AcoApp implements IAcoApp {\n public readonly name: string;\n public readonly context: AcoContext;\n public readonly model: CmsModel;\n private readonly fields: CmsModelField[];\n private readonly onEntry?: IAcoAppOnEntry;\n private readonly onEntryList?: IAcoAppOnEntryList;\n private readonly onAnyRequest?: IAcoAppOnAnyRequest;\n\n public get search(): AcoSearchRecordCrudBase {\n return {\n create: async <TData extends GenericSearchData = GenericSearchData>(\n data: CreateSearchRecordParams<TData>\n ) => {\n await this.execOnAnyRequest(\"create\");\n const result = await this.context.aco.search.create<TData>(this.getModel(), data);\n if (!this.onEntry) {\n return result;\n }\n return (await this.onEntry(result)) as SearchRecord<TData>;\n },\n update: async <TData extends GenericSearchData = GenericSearchData>(\n id: string,\n data: UpdateSearchRecordParams<TData>\n ) => {\n await this.execOnAnyRequest(\"update\");\n const result = await this.context.aco.search.update<TData>(\n this.getModel(),\n id,\n data\n );\n if (!this.onEntry) {\n return result;\n }\n return (await this.onEntry(result)) as SearchRecord<TData>;\n },\n move: async (id: string, folderId?: string) => {\n await this.execOnAnyRequest(\"move\");\n return this.context.aco.search.move(this.getModel(), id, folderId);\n },\n get: async <TData extends GenericSearchData = GenericSearchData>(id: string) => {\n await this.execOnAnyRequest(\"fetch\");\n const result = await this.context.aco.search.get<TData>(this.getModel(), id);\n if (!result || !this.onEntry) {\n return result;\n }\n return (await this.onEntry(result)) as SearchRecord<TData>;\n },\n list: async <TData extends GenericSearchData = GenericSearchData>(\n params: ListSearchRecordsParams\n ) => {\n await this.execOnAnyRequest(\"fetch\");\n const result = await this.context.aco.search.list<TData>(this.getModel(), params);\n const onEntryList = this.onEntryList;\n if (!onEntryList) {\n return result;\n }\n const [entries, meta] = result;\n const items = (await onEntryList(entries)) as SearchRecord<TData>[];\n return [items, meta];\n },\n delete: async (id: string): Promise<boolean> => {\n await this.execOnAnyRequest(\"delete\");\n return this.context.aco.search.delete(this.getModel(), id);\n },\n listTags: async (params: ListSearchRecordTagsParams) => {\n await this.execOnAnyRequest(\"fetch\");\n return this.context.aco.search.listTags(this.getModel(), params);\n }\n };\n }\n\n public get folder() {\n return this.context.aco.folder;\n }\n\n private getModel() {\n const tenant = this.context.tenancy.getCurrentTenant().id;\n const locale = this.context.i18n.getContentLocale()!.code;\n\n return { ...this.model, tenant, locale };\n }\n\n private constructor(context: AcoContext, params: IAcoAppParams) {\n this.context = context;\n this.name = params.name;\n this.onEntry = params.onEntry;\n this.onEntryList = params.onEntryList;\n this.model = structuredClone(params.model);\n /**\n * We can safely define the api name of the model as we control everything here.\n */\n this.model.name = `${this.model.name} ${this.name}`;\n this.model.modelId = `${this.model.modelId}-${this.name.toLowerCase()}`;\n const apiName = `AcoSearchRecord${createApiName(params.apiName)}`;\n this.model.singularApiName = apiName;\n this.model.pluralApiName = apiName;\n\n const index = this.model.fields.findIndex(f => f.fieldId === \"data\");\n if (index === -1) {\n throw new WebinyError(\n `The \"data\" field does not exist in model \"${this.model.modelId}\".`,\n \"MODEL_DATA_FIELD_ERROR\",\n {\n modelId: this.model.modelId\n }\n );\n } else if (!this.model.fields[index].settings?.fields) {\n this.model.fields[index].settings!.fields = [];\n }\n this.fields = this.model.fields[index].settings!.fields as CmsModelField[];\n this.fields.push(...params.fields);\n }\n\n public static create(context: AcoContext, params: IAcoAppParams) {\n return new AcoApp(context, params);\n }\n\n public getFields(): CmsModelField[] {\n return this.fields;\n }\n\n public addField(field: CmsModelField): void {\n this.fields.push(field);\n }\n\n public removeField(id: string): void {\n if (DEFAULT_FIELDS.includes(id)) {\n throw new WebinyError(\n `Cannot remove the default field from the ACO App.`,\n \"REMOVE_DEFAULT_FIELD_ERROR\",\n {\n fieldId: id\n }\n );\n }\n const index = this.fields.findIndex(field => field.id === id);\n if (index === -1) {\n return;\n }\n this.fields.splice(index, 1);\n }\n\n public modifyField(id: string, cb: IAcoAppModifyFieldCallableCallback): void {\n const index = this.fields.findIndex(field => field.id === id);\n if (index === -1) {\n throw new WebinyError(\n `There is no field \"${id}\" in app \"${this.name}\".`,\n \"FIELD_NOT_FOUND_ERROR\",\n {\n id\n }\n );\n }\n this.fields[index] = cb(structuredClone(this.fields[index]));\n }\n\n private async execOnAnyRequest(action: AcoRequestAction): Promise<void> {\n if (!this.onAnyRequest) {\n return;\n }\n await this.onAnyRequest(this.context, action);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_error","_interopRequireDefault","require","_upperFirst","_camelCase","_record","createApiName","name","lodashUpperFirst","lodashCamelCase","AcoApp","search","create","data","execOnAnyRequest","result","context","aco","getModel","onEntry","update","id","move","folderId","get","list","params","onEntryList","entries","meta","items","delete","listTags","folder","tenant","tenancy","getCurrentTenant","locale","i18n","getContentLocale","code","model","constructor","structuredClone","modelId","toLowerCase","apiName","singularApiName","pluralApiName","index","fields","findIndex","f","fieldId","WebinyError","settings","push","getFields","addField","field","removeField","DEFAULT_FIELDS","includes","splice","modifyField","cb","action","onAnyRequest","exports"],"sources":["AcoApp.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n AcoContext,\n AcoRequestAction,\n AcoSearchRecordCrudBase,\n CreateSearchRecordParams,\n GenericSearchData,\n IAcoApp,\n IAcoAppModifyFieldCallableCallback,\n IAcoAppOnAnyRequest,\n IAcoAppOnEntry,\n IAcoAppOnEntryList,\n IAcoAppParams,\n ListSearchRecordsParams,\n ListSearchRecordTagsParams,\n SearchRecord,\n UpdateSearchRecordParams\n} from \"~/types\";\nimport { CmsModel, CmsModelField } from \"@webiny/api-headless-cms/types\";\nimport lodashUpperFirst from \"lodash/upperFirst\";\nimport lodashCamelCase from \"lodash/camelCase\";\nimport { DEFAULT_FIELDS } from \"~/record/record.model\";\n\nconst createApiName = (name: string) => {\n return lodashUpperFirst(lodashCamelCase(name));\n};\n\nexport class AcoApp implements IAcoApp {\n public readonly name: string;\n public readonly context: AcoContext;\n public readonly model: CmsModel;\n private readonly fields: CmsModelField[];\n private readonly onEntry?: IAcoAppOnEntry;\n private readonly onEntryList?: IAcoAppOnEntryList;\n private readonly onAnyRequest?: IAcoAppOnAnyRequest;\n\n public get search(): AcoSearchRecordCrudBase {\n return {\n create: async <TData extends GenericSearchData = GenericSearchData>(\n data: CreateSearchRecordParams<TData>\n ) => {\n await this.execOnAnyRequest(\"create\");\n const result = await this.context.aco.search.create<TData>(this.getModel(), data);\n if (!this.onEntry) {\n return result;\n }\n return (await this.onEntry(result, this.context)) as SearchRecord<TData>;\n },\n update: async <TData extends GenericSearchData = GenericSearchData>(\n id: string,\n data: UpdateSearchRecordParams<TData>\n ) => {\n await this.execOnAnyRequest(\"update\");\n const result = await this.context.aco.search.update<TData>(\n this.getModel(),\n id,\n data\n );\n if (!this.onEntry) {\n return result;\n }\n return (await this.onEntry(result, this.context)) as SearchRecord<TData>;\n },\n move: async (id: string, folderId?: string) => {\n await this.execOnAnyRequest(\"move\");\n return this.context.aco.search.move(this.getModel(), id, folderId);\n },\n get: async <TData extends GenericSearchData = GenericSearchData>(id: string) => {\n await this.execOnAnyRequest(\"fetch\");\n const result = await this.context.aco.search.get<TData>(this.getModel(), id);\n if (!result || !this.onEntry) {\n return result;\n }\n return (await this.onEntry(result, this.context)) as SearchRecord<TData>;\n },\n list: async <TData extends GenericSearchData = GenericSearchData>(\n params: ListSearchRecordsParams\n ) => {\n await this.execOnAnyRequest(\"fetch\");\n const result = await this.context.aco.search.list<TData>(this.getModel(), params);\n const onEntryList = this.onEntryList;\n if (!onEntryList) {\n return result;\n }\n const [entries, meta] = result;\n const items = (await onEntryList(entries, this.context)) as SearchRecord<TData>[];\n return [items, meta];\n },\n delete: async (id: string): Promise<boolean> => {\n await this.execOnAnyRequest(\"delete\");\n return this.context.aco.search.delete(this.getModel(), id);\n },\n listTags: async (params: ListSearchRecordTagsParams) => {\n await this.execOnAnyRequest(\"fetch\");\n return this.context.aco.search.listTags(this.getModel(), params);\n }\n };\n }\n\n public get folder() {\n return this.context.aco.folder;\n }\n\n private getModel() {\n const tenant = this.context.tenancy.getCurrentTenant().id;\n const locale = this.context.i18n.getContentLocale()!.code;\n\n return { ...this.model, tenant, locale };\n }\n\n private constructor(context: AcoContext, params: IAcoAppParams) {\n this.context = context;\n this.name = params.name;\n this.onEntry = params.onEntry;\n this.onEntryList = params.onEntryList;\n this.model = structuredClone(params.model);\n /**\n * We can safely define the api name of the model as we control everything here.\n */\n this.model.name = `${this.model.name} ${this.name}`;\n this.model.modelId = `${this.model.modelId}-${this.name.toLowerCase()}`;\n const apiName = `AcoSearchRecord${createApiName(params.apiName)}`;\n this.model.singularApiName = apiName;\n this.model.pluralApiName = apiName;\n\n const index = this.model.fields.findIndex(f => f.fieldId === \"data\");\n if (index === -1) {\n throw new WebinyError(\n `The \"data\" field does not exist in model \"${this.model.modelId}\".`,\n \"MODEL_DATA_FIELD_ERROR\",\n {\n modelId: this.model.modelId\n }\n );\n } else if (!this.model.fields[index].settings?.fields) {\n this.model.fields[index].settings!.fields = [];\n }\n this.fields = this.model.fields[index].settings!.fields as CmsModelField[];\n this.fields.push(...params.fields);\n }\n\n public static create(context: AcoContext, params: IAcoAppParams) {\n return new AcoApp(context, params);\n }\n\n public getFields(): CmsModelField[] {\n return this.fields;\n }\n\n public addField(field: CmsModelField): void {\n this.fields.push(field);\n }\n\n public removeField(id: string): void {\n if (DEFAULT_FIELDS.includes(id)) {\n throw new WebinyError(\n `Cannot remove the default field from the ACO App.`,\n \"REMOVE_DEFAULT_FIELD_ERROR\",\n {\n fieldId: id\n }\n );\n }\n const index = this.fields.findIndex(field => field.id === id);\n if (index === -1) {\n return;\n }\n this.fields.splice(index, 1);\n }\n\n public modifyField(id: string, cb: IAcoAppModifyFieldCallableCallback): void {\n const index = this.fields.findIndex(field => field.id === id);\n if (index === -1) {\n throw new WebinyError(\n `There is no field \"${id}\" in app \"${this.name}\".`,\n \"FIELD_NOT_FOUND_ERROR\",\n {\n id\n }\n );\n }\n this.fields[index] = cb(structuredClone(this.fields[index]));\n }\n\n private async execOnAnyRequest(action: AcoRequestAction): Promise<void> {\n if (!this.onAnyRequest) {\n return;\n }\n await this.onAnyRequest(this.context, action);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -30,10 +30,15 @@ class CanAccessFolder {
|
|
|
30
30
|
return level === "owner";
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
// If the user has a `no-access` level, they are explicitly denied access to the current folder.
|
|
34
|
+
if (level === "no-access") {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
33
38
|
// Checking for "write" or "delete" access. Allow only if the
|
|
34
|
-
// user is
|
|
39
|
+
// user is has `owner` or `editor` level or the folder is public (no FLP assigned).
|
|
35
40
|
if (rwd !== "r") {
|
|
36
|
-
return level === "owner" || level === "public";
|
|
41
|
+
return level === "owner" || level === "editor" || level === "public";
|
|
37
42
|
}
|
|
38
43
|
return true;
|
|
39
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CanAccessFolder","constructor","getIdentityGateway","execute","permissions","rwd","managePermissions","length","identity","currentIdentityPermission","find","p","target","id","level","exports"],"sources":["CanAccessFolder.ts"],"sourcesContent":["import type { CanAccessFolderParams, ICanAccessFolder } from \"./ICanAccessFolder\";\nimport type { IGetIdentityGateway } from \"../../gateways\";\n\nexport class CanAccessFolder implements ICanAccessFolder {\n private getIdentityGateway: IGetIdentityGateway;\n\n constructor(getIdentityGateway: IGetIdentityGateway) {\n this.getIdentityGateway = getIdentityGateway;\n }\n\n async execute({ permissions = [], rwd, managePermissions }: CanAccessFolderParams) {\n if (!permissions.length) {\n return true;\n }\n\n const identity = this.getIdentityGateway.execute();\n const currentIdentityPermission = permissions.find(p => {\n return p.target === `admin:${identity.id}`;\n });\n\n if (!currentIdentityPermission) {\n return false;\n }\n\n const { level } = currentIdentityPermission;\n\n if (managePermissions) {\n return level === \"owner\";\n }\n\n // Checking for \"write\" or \"delete\" access. Allow only if the\n // user is
|
|
1
|
+
{"version":3,"names":["CanAccessFolder","constructor","getIdentityGateway","execute","permissions","rwd","managePermissions","length","identity","currentIdentityPermission","find","p","target","id","level","exports"],"sources":["CanAccessFolder.ts"],"sourcesContent":["import type { CanAccessFolderParams, ICanAccessFolder } from \"./ICanAccessFolder\";\nimport type { IGetIdentityGateway } from \"../../gateways\";\n\nexport class CanAccessFolder implements ICanAccessFolder {\n private getIdentityGateway: IGetIdentityGateway;\n\n constructor(getIdentityGateway: IGetIdentityGateway) {\n this.getIdentityGateway = getIdentityGateway;\n }\n\n async execute({ permissions = [], rwd, managePermissions }: CanAccessFolderParams) {\n if (!permissions.length) {\n return true;\n }\n\n const identity = this.getIdentityGateway.execute();\n const currentIdentityPermission = permissions.find(p => {\n return p.target === `admin:${identity.id}`;\n });\n\n if (!currentIdentityPermission) {\n return false;\n }\n\n const { level } = currentIdentityPermission;\n\n if (managePermissions) {\n return level === \"owner\";\n }\n\n // If the user has a `no-access` level, they are explicitly denied access to the current folder.\n if (level === \"no-access\") {\n return false;\n }\n\n // Checking for \"write\" or \"delete\" access. Allow only if the\n // user is has `owner` or `editor` level or the folder is public (no FLP assigned).\n if (rwd !== \"r\") {\n return level === \"owner\" || level === \"editor\" || level === \"public\";\n }\n\n return true;\n }\n}\n"],"mappings":";;;;;;AAGO,MAAMA,eAAe,CAA6B;EAGrDC,WAAWA,CAACC,kBAAuC,EAAE;IACjD,IAAI,CAACA,kBAAkB,GAAGA,kBAAkB;EAChD;EAEA,MAAMC,OAAOA,CAAC;IAAEC,WAAW,GAAG,EAAE;IAAEC,GAAG;IAAEC;EAAyC,CAAC,EAAE;IAC/E,IAAI,CAACF,WAAW,CAACG,MAAM,EAAE;MACrB,OAAO,IAAI;IACf;IAEA,MAAMC,QAAQ,GAAG,IAAI,CAACN,kBAAkB,CAACC,OAAO,CAAC,CAAC;IAClD,MAAMM,yBAAyB,GAAGL,WAAW,CAACM,IAAI,CAACC,CAAC,IAAI;MACpD,OAAOA,CAAC,CAACC,MAAM,KAAK,SAASJ,QAAQ,CAACK,EAAE,EAAE;IAC9C,CAAC,CAAC;IAEF,IAAI,CAACJ,yBAAyB,EAAE;MAC5B,OAAO,KAAK;IAChB;IAEA,MAAM;MAAEK;IAAM,CAAC,GAAGL,yBAAyB;IAE3C,IAAIH,iBAAiB,EAAE;MACnB,OAAOQ,KAAK,KAAK,OAAO;IAC5B;;IAEA;IACA,IAAIA,KAAK,KAAK,WAAW,EAAE;MACvB,OAAO,KAAK;IAChB;;IAEA;IACA;IACA,IAAIT,GAAG,KAAK,GAAG,EAAE;MACb,OAAOS,KAAK,KAAK,OAAO,IAAIA,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,QAAQ;IACxE;IAEA,OAAO,IAAI;EACf;AACJ;AAACC,OAAA,CAAAf,eAAA,GAAAA,eAAA","ignoreList":[]}
|
package/flp/FolderLevelPermissions/useCases/CanAccessFolderContent/CanAccessFolderContent.js
CHANGED
|
@@ -19,13 +19,18 @@ class CanAccessFolderContent {
|
|
|
19
19
|
if (!currentIdentityPermission) {
|
|
20
20
|
return false;
|
|
21
21
|
}
|
|
22
|
+
const {
|
|
23
|
+
level
|
|
24
|
+
} = currentIdentityPermission;
|
|
25
|
+
|
|
26
|
+
// If the user has a `no-access` level, they are explicitly denied access to the current folder.
|
|
27
|
+
if (level === "no-access") {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
22
30
|
|
|
23
31
|
// If the user is not an owner and we're checking for "write" or
|
|
24
32
|
// "delete" access, then we can immediately return false.
|
|
25
33
|
if (rwd !== "r") {
|
|
26
|
-
const {
|
|
27
|
-
level
|
|
28
|
-
} = currentIdentityPermission;
|
|
29
34
|
return level !== "viewer";
|
|
30
35
|
}
|
|
31
36
|
return true;
|
package/flp/FolderLevelPermissions/useCases/CanAccessFolderContent/CanAccessFolderContent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CanAccessFolderContent","constructor","getIdentityGateway","execute","permissions","rwd","identity","currentIdentityPermission","find","p","target","id","level","exports"],"sources":["CanAccessFolderContent.ts"],"sourcesContent":["import type {\n CanAccessFolderContentParams,\n ICanAccessFolderContent\n} from \"./ICanAccessFolderContent\";\nimport type { IGetIdentityGateway } from \"../../gateways\";\n\nexport class CanAccessFolderContent implements ICanAccessFolderContent {\n private getIdentityGateway: IGetIdentityGateway;\n\n constructor(getIdentityGateway: IGetIdentityGateway) {\n this.getIdentityGateway = getIdentityGateway;\n }\n\n async execute({ permissions = [], rwd }: CanAccessFolderContentParams) {\n const identity = this.getIdentityGateway.execute();\n\n const currentIdentityPermission = permissions.find(p => {\n return p.target === `admin:${identity.id}`;\n });\n\n if (!currentIdentityPermission) {\n return false;\n }\n\n // If the user is not an owner and we're checking for \"write\" or\n // \"delete\" access, then we can immediately return false.\n if (rwd !== \"r\") {\n
|
|
1
|
+
{"version":3,"names":["CanAccessFolderContent","constructor","getIdentityGateway","execute","permissions","rwd","identity","currentIdentityPermission","find","p","target","id","level","exports"],"sources":["CanAccessFolderContent.ts"],"sourcesContent":["import type {\n CanAccessFolderContentParams,\n ICanAccessFolderContent\n} from \"./ICanAccessFolderContent\";\nimport type { IGetIdentityGateway } from \"../../gateways\";\n\nexport class CanAccessFolderContent implements ICanAccessFolderContent {\n private getIdentityGateway: IGetIdentityGateway;\n\n constructor(getIdentityGateway: IGetIdentityGateway) {\n this.getIdentityGateway = getIdentityGateway;\n }\n\n async execute({ permissions = [], rwd }: CanAccessFolderContentParams) {\n const identity = this.getIdentityGateway.execute();\n\n const currentIdentityPermission = permissions.find(p => {\n return p.target === `admin:${identity.id}`;\n });\n\n if (!currentIdentityPermission) {\n return false;\n }\n\n const { level } = currentIdentityPermission;\n\n // If the user has a `no-access` level, they are explicitly denied access to the current folder.\n if (level === \"no-access\") {\n return false;\n }\n\n // If the user is not an owner and we're checking for \"write\" or\n // \"delete\" access, then we can immediately return false.\n if (rwd !== \"r\") {\n return level !== \"viewer\";\n }\n\n return true;\n }\n}\n"],"mappings":";;;;;;AAMO,MAAMA,sBAAsB,CAAoC;EAGnEC,WAAWA,CAACC,kBAAuC,EAAE;IACjD,IAAI,CAACA,kBAAkB,GAAGA,kBAAkB;EAChD;EAEA,MAAMC,OAAOA,CAAC;IAAEC,WAAW,GAAG,EAAE;IAAEC;EAAkC,CAAC,EAAE;IACnE,MAAMC,QAAQ,GAAG,IAAI,CAACJ,kBAAkB,CAACC,OAAO,CAAC,CAAC;IAElD,MAAMI,yBAAyB,GAAGH,WAAW,CAACI,IAAI,CAACC,CAAC,IAAI;MACpD,OAAOA,CAAC,CAACC,MAAM,KAAK,SAASJ,QAAQ,CAACK,EAAE,EAAE;IAC9C,CAAC,CAAC;IAEF,IAAI,CAACJ,yBAAyB,EAAE;MAC5B,OAAO,KAAK;IAChB;IAEA,MAAM;MAAEK;IAAM,CAAC,GAAGL,yBAAyB;;IAE3C;IACA,IAAIK,KAAK,KAAK,WAAW,EAAE;MACvB,OAAO,KAAK;IAChB;;IAEA;IACA;IACA,IAAIP,GAAG,KAAK,GAAG,EAAE;MACb,OAAOO,KAAK,KAAK,QAAQ;IAC7B;IAEA,OAAO,IAAI;EACf;AACJ;AAACC,OAAA,CAAAb,sBAAA,GAAAA,sBAAA","ignoreList":[]}
|
package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/DefaultPermissionsMerger.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FolderPermission } from "../../../flp.types";
|
|
2
|
+
import { Identity } from "@webiny/api-authentication/types";
|
|
3
|
+
import { SecurityPermission } from "@webiny/api-security/types";
|
|
4
|
+
export declare class DefaultPermissionsMerger {
|
|
5
|
+
static merge(identity: Identity, identityPermissions: SecurityPermission[], folderPermissions: FolderPermission[]): FolderPermission[];
|
|
6
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.DefaultPermissionsMerger = void 0;
|
|
7
|
+
class DefaultPermissionsMerger {
|
|
8
|
+
static merge(identity, identityPermissions, folderPermissions) {
|
|
9
|
+
// If the user has full access permission, add a specific "owner" permission to the list.
|
|
10
|
+
// This ensures the user has complete control over the folder.
|
|
11
|
+
const hasFullAccess = identityPermissions.some(p => p.name === "*");
|
|
12
|
+
if (hasFullAccess) {
|
|
13
|
+
return [{
|
|
14
|
+
target: `admin:${identity.id}`,
|
|
15
|
+
level: "owner",
|
|
16
|
+
inheritedFrom: "role:full-access"
|
|
17
|
+
},
|
|
18
|
+
// Remove any permissions related to the full access user,
|
|
19
|
+
// as these are always superseded by the "owner" permission defined above.
|
|
20
|
+
...folderPermissions.filter(p => p.target !== `admin:${identity.id}`)];
|
|
21
|
+
}
|
|
22
|
+
if (folderPermissions.length === 0) {
|
|
23
|
+
// No permissions provided. This means the folder is public.
|
|
24
|
+
// Add a specific "public" permission to the list to ensure the folder is accessible to everyone.
|
|
25
|
+
return [{
|
|
26
|
+
target: `admin:${identity.id}`,
|
|
27
|
+
level: "public",
|
|
28
|
+
inheritedFrom: "public"
|
|
29
|
+
}];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// If there are multiple `admin:${identity.id}` permissions in the array,
|
|
33
|
+
// we need to pick the one with the highest access level. We also remove
|
|
34
|
+
// other permissions for the same identity.
|
|
35
|
+
|
|
36
|
+
// Get permissions related to the current identity (admin).
|
|
37
|
+
const currentAdminPermissions = folderPermissions.filter(p => p.target === `admin:${identity.id}`);
|
|
38
|
+
if (currentAdminPermissions.length === 0) {
|
|
39
|
+
return folderPermissions;
|
|
40
|
+
}
|
|
41
|
+
const noAccessPermission = currentAdminPermissions.find(p => p.level === "no-access" && p.target === `admin:${identity.id}`);
|
|
42
|
+
if (noAccessPermission) {
|
|
43
|
+
// If one of the permissions is `no-access`, then we can immediately return it. This is
|
|
44
|
+
// because `no-access` is the ultimate level of access, and no other permission can override it.
|
|
45
|
+
// Remove all permissions for the current identity and add the winning one.
|
|
46
|
+
const filteredPermissions = folderPermissions.filter(p => p.target !== `admin:${identity.id}`);
|
|
47
|
+
return [...filteredPermissions, noAccessPermission];
|
|
48
|
+
}
|
|
49
|
+
const [firstAdminPermission, ...restAdminPermissions] = currentAdminPermissions;
|
|
50
|
+
const resultPermission = restAdminPermissions.reduce((winner, current) => {
|
|
51
|
+
const winnerInherits = winner.inheritedFrom?.startsWith("parent:");
|
|
52
|
+
const currentInherits = current.inheritedFrom?.startsWith("parent:");
|
|
53
|
+
if (winnerInherits && !currentInherits) {
|
|
54
|
+
return current;
|
|
55
|
+
}
|
|
56
|
+
if (currentInherits && !winnerInherits) {
|
|
57
|
+
return winner;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// At this point, we're either comparing two permissions with `inheritedFrom` or two without it.
|
|
61
|
+
// In other words, we're now at a point where we start comparing the levels (owner > editor > viewer).
|
|
62
|
+
if (current.level === "owner") {
|
|
63
|
+
return current;
|
|
64
|
+
}
|
|
65
|
+
if (current.level === "editor" && winner.level === "viewer") {
|
|
66
|
+
return current;
|
|
67
|
+
}
|
|
68
|
+
return winner;
|
|
69
|
+
}, firstAdminPermission);
|
|
70
|
+
|
|
71
|
+
// Remove all permissions for the current identity and add the winning one.
|
|
72
|
+
return [resultPermission, ...folderPermissions.filter(p => p.target !== `admin:${identity.id}`)];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.DefaultPermissionsMerger = DefaultPermissionsMerger;
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=DefaultPermissionsMerger.js.map
|
package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/DefaultPermissionsMerger.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DefaultPermissionsMerger","merge","identity","identityPermissions","folderPermissions","hasFullAccess","some","p","name","target","id","level","inheritedFrom","filter","length","currentAdminPermissions","noAccessPermission","find","filteredPermissions","firstAdminPermission","restAdminPermissions","resultPermission","reduce","winner","current","winnerInherits","startsWith","currentInherits","exports"],"sources":["DefaultPermissionsMerger.ts"],"sourcesContent":["import type { FolderAccessLevel, FolderPermission } from \"~/flp/flp.types\";\nimport { Identity } from \"@webiny/api-authentication/types\";\nimport { SecurityPermission } from \"@webiny/api-security/types\";\n\nexport class DefaultPermissionsMerger {\n static merge(\n identity: Identity,\n identityPermissions: SecurityPermission[],\n folderPermissions: FolderPermission[]\n ): FolderPermission[] {\n // If the user has full access permission, add a specific \"owner\" permission to the list.\n // This ensures the user has complete control over the folder.\n const hasFullAccess = identityPermissions.some(p => p.name === \"*\");\n if (hasFullAccess) {\n return [\n {\n target: `admin:${identity.id}`,\n level: \"owner\" as FolderAccessLevel,\n inheritedFrom: \"role:full-access\"\n },\n\n // Remove any permissions related to the full access user,\n // as these are always superseded by the \"owner\" permission defined above.\n ...folderPermissions.filter(p => p.target !== `admin:${identity.id}`)\n ];\n }\n\n if (folderPermissions.length === 0) {\n // No permissions provided. This means the folder is public.\n // Add a specific \"public\" permission to the list to ensure the folder is accessible to everyone.\n return [\n {\n target: `admin:${identity.id}`,\n level: \"public\" as FolderAccessLevel,\n inheritedFrom: \"public\"\n }\n ];\n }\n\n // If there are multiple `admin:${identity.id}` permissions in the array,\n // we need to pick the one with the highest access level. We also remove\n // other permissions for the same identity.\n\n // Get permissions related to the current identity (admin).\n const currentAdminPermissions = folderPermissions.filter(\n p => p.target === `admin:${identity.id}`\n );\n\n if (currentAdminPermissions.length === 0) {\n return folderPermissions;\n }\n\n const noAccessPermission = currentAdminPermissions.find(\n p => p.level === \"no-access\" && p.target === `admin:${identity.id}`\n );\n\n if (noAccessPermission) {\n // If one of the permissions is `no-access`, then we can immediately return it. This is\n // because `no-access` is the ultimate level of access, and no other permission can override it.\n // Remove all permissions for the current identity and add the winning one.\n const filteredPermissions = folderPermissions.filter(\n p => p.target !== `admin:${identity.id}`\n );\n\n return [...filteredPermissions, noAccessPermission];\n }\n\n const [firstAdminPermission, ...restAdminPermissions] = currentAdminPermissions;\n\n const resultPermission = restAdminPermissions.reduce((winner, current) => {\n const winnerInherits = winner.inheritedFrom?.startsWith(\"parent:\");\n const currentInherits = current.inheritedFrom?.startsWith(\"parent:\");\n\n if (winnerInherits && !currentInherits) {\n return current;\n }\n if (currentInherits && !winnerInherits) {\n return winner;\n }\n\n // At this point, we're either comparing two permissions with `inheritedFrom` or two without it.\n // In other words, we're now at a point where we start comparing the levels (owner > editor > viewer).\n if (current.level === \"owner\") {\n return current;\n }\n\n if (current.level === \"editor\" && winner.level === \"viewer\") {\n return current;\n }\n\n return winner;\n }, firstAdminPermission);\n\n // Remove all permissions for the current identity and add the winning one.\n return [\n resultPermission,\n ...folderPermissions.filter(p => p.target !== `admin:${identity.id}`)\n ];\n }\n}\n"],"mappings":";;;;;;AAIO,MAAMA,wBAAwB,CAAC;EAClC,OAAOC,KAAKA,CACRC,QAAkB,EAClBC,mBAAyC,EACzCC,iBAAqC,EACnB;IAClB;IACA;IACA,MAAMC,aAAa,GAAGF,mBAAmB,CAACG,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,IAAI,KAAK,GAAG,CAAC;IACnE,IAAIH,aAAa,EAAE;MACf,OAAO,CACH;QACII,MAAM,EAAE,SAASP,QAAQ,CAACQ,EAAE,EAAE;QAC9BC,KAAK,EAAE,OAA4B;QACnCC,aAAa,EAAE;MACnB,CAAC;MAED;MACA;MACA,GAAGR,iBAAiB,CAACS,MAAM,CAACN,CAAC,IAAIA,CAAC,CAACE,MAAM,KAAK,SAASP,QAAQ,CAACQ,EAAE,EAAE,CAAC,CACxE;IACL;IAEA,IAAIN,iBAAiB,CAACU,MAAM,KAAK,CAAC,EAAE;MAChC;MACA;MACA,OAAO,CACH;QACIL,MAAM,EAAE,SAASP,QAAQ,CAACQ,EAAE,EAAE;QAC9BC,KAAK,EAAE,QAA6B;QACpCC,aAAa,EAAE;MACnB,CAAC,CACJ;IACL;;IAEA;IACA;IACA;;IAEA;IACA,MAAMG,uBAAuB,GAAGX,iBAAiB,CAACS,MAAM,CACpDN,CAAC,IAAIA,CAAC,CAACE,MAAM,KAAK,SAASP,QAAQ,CAACQ,EAAE,EAC1C,CAAC;IAED,IAAIK,uBAAuB,CAACD,MAAM,KAAK,CAAC,EAAE;MACtC,OAAOV,iBAAiB;IAC5B;IAEA,MAAMY,kBAAkB,GAAGD,uBAAuB,CAACE,IAAI,CACnDV,CAAC,IAAIA,CAAC,CAACI,KAAK,KAAK,WAAW,IAAIJ,CAAC,CAACE,MAAM,KAAK,SAASP,QAAQ,CAACQ,EAAE,EACrE,CAAC;IAED,IAAIM,kBAAkB,EAAE;MACpB;MACA;MACA;MACA,MAAME,mBAAmB,GAAGd,iBAAiB,CAACS,MAAM,CAChDN,CAAC,IAAIA,CAAC,CAACE,MAAM,KAAK,SAASP,QAAQ,CAACQ,EAAE,EAC1C,CAAC;MAED,OAAO,CAAC,GAAGQ,mBAAmB,EAAEF,kBAAkB,CAAC;IACvD;IAEA,MAAM,CAACG,oBAAoB,EAAE,GAAGC,oBAAoB,CAAC,GAAGL,uBAAuB;IAE/E,MAAMM,gBAAgB,GAAGD,oBAAoB,CAACE,MAAM,CAAC,CAACC,MAAM,EAAEC,OAAO,KAAK;MACtE,MAAMC,cAAc,GAAGF,MAAM,CAACX,aAAa,EAAEc,UAAU,CAAC,SAAS,CAAC;MAClE,MAAMC,eAAe,GAAGH,OAAO,CAACZ,aAAa,EAAEc,UAAU,CAAC,SAAS,CAAC;MAEpE,IAAID,cAAc,IAAI,CAACE,eAAe,EAAE;QACpC,OAAOH,OAAO;MAClB;MACA,IAAIG,eAAe,IAAI,CAACF,cAAc,EAAE;QACpC,OAAOF,MAAM;MACjB;;MAEA;MACA;MACA,IAAIC,OAAO,CAACb,KAAK,KAAK,OAAO,EAAE;QAC3B,OAAOa,OAAO;MAClB;MAEA,IAAIA,OAAO,CAACb,KAAK,KAAK,QAAQ,IAAIY,MAAM,CAACZ,KAAK,KAAK,QAAQ,EAAE;QACzD,OAAOa,OAAO;MAClB;MAEA,OAAOD,MAAM;IACjB,CAAC,EAAEJ,oBAAoB,CAAC;;IAExB;IACA,OAAO,CACHE,gBAAgB,EAChB,GAAGjB,iBAAiB,CAACS,MAAM,CAACN,CAAC,IAAIA,CAAC,CAACE,MAAM,KAAK,SAASP,QAAQ,CAACQ,EAAE,EAAE,CAAC,CACxE;EACL;AACJ;AAACkB,OAAA,CAAA5B,wBAAA,GAAAA,wBAAA","ignoreList":[]}
|
package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissions.d.ts
CHANGED
|
@@ -6,5 +6,4 @@ export declare class GetDefaultPermissions implements IGetDefaultPermissions {
|
|
|
6
6
|
private listPermissionsGateway;
|
|
7
7
|
constructor(getIdentityGateway: IGetIdentityGateway, listPermissionsGateway: IListPermissionsGateway);
|
|
8
8
|
execute(permissions: FolderPermission[]): Promise<FolderPermission[]>;
|
|
9
|
-
private hasFullAccess;
|
|
10
9
|
}
|
|
@@ -4,48 +4,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.GetDefaultPermissions = void 0;
|
|
7
|
+
var _DefaultPermissionsMerger = require("./DefaultPermissionsMerger");
|
|
7
8
|
class GetDefaultPermissions {
|
|
8
9
|
constructor(getIdentityGateway, listPermissionsGateway) {
|
|
9
10
|
this.getIdentityGateway = getIdentityGateway;
|
|
10
11
|
this.listPermissionsGateway = listPermissionsGateway;
|
|
11
12
|
}
|
|
12
13
|
async execute(permissions) {
|
|
13
|
-
const hasFullAccess = await this.hasFullAccess();
|
|
14
14
|
const identity = this.getIdentityGateway.execute();
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
* If the user has full access to the application, add a specific "owner" permission to the list.
|
|
18
|
-
* This ensures the user has complete control over the folder.
|
|
19
|
-
*/
|
|
20
|
-
if (hasFullAccess) {
|
|
21
|
-
return [{
|
|
22
|
-
target: `admin:${identity.id}`,
|
|
23
|
-
level: "owner",
|
|
24
|
-
inheritedFrom: "role:full-access"
|
|
25
|
-
},
|
|
26
|
-
/**
|
|
27
|
-
* Remove any permissions related to the full access user,
|
|
28
|
-
* as these are always superseded by the "owner" permission defined above.
|
|
29
|
-
*/
|
|
30
|
-
...permissions.filter(p => p.target !== `admin:${identity.id}`)];
|
|
31
|
-
}
|
|
32
|
-
if (permissions.length > 0) {
|
|
33
|
-
return permissions;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* No permissions provided. This means the folder is public.
|
|
38
|
-
* Add a specific "public" permission to the list to ensure the folder is accessible to everyone.
|
|
39
|
-
*/
|
|
40
|
-
return [{
|
|
41
|
-
target: `admin:${identity.id}`,
|
|
42
|
-
level: "public",
|
|
43
|
-
inheritedFrom: "public"
|
|
44
|
-
}];
|
|
45
|
-
}
|
|
46
|
-
async hasFullAccess() {
|
|
47
|
-
const permissions = await this.listPermissionsGateway.execute();
|
|
48
|
-
return permissions.some(p => p.name === "*");
|
|
15
|
+
const identityPermissions = await this.listPermissionsGateway.execute();
|
|
16
|
+
return _DefaultPermissionsMerger.DefaultPermissionsMerger.merge(identity, identityPermissions, permissions);
|
|
49
17
|
}
|
|
50
18
|
}
|
|
51
19
|
exports.GetDefaultPermissions = GetDefaultPermissions;
|
package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["GetDefaultPermissions","constructor","getIdentityGateway","listPermissionsGateway","execute","permissions","
|
|
1
|
+
{"version":3,"names":["_DefaultPermissionsMerger","require","GetDefaultPermissions","constructor","getIdentityGateway","listPermissionsGateway","execute","permissions","identity","identityPermissions","DefaultPermissionsMerger","merge","exports"],"sources":["GetDefaultPermissions.ts"],"sourcesContent":["import type { IGetDefaultPermissions } from \"./IGetDefaultPermissions\";\nimport type { IGetIdentityGateway, IListPermissionsGateway } from \"../../gateways\";\nimport type { FolderPermission } from \"~/flp/flp.types\";\nimport { DefaultPermissionsMerger } from \"./DefaultPermissionsMerger\";\n\nexport class GetDefaultPermissions implements IGetDefaultPermissions {\n private getIdentityGateway: IGetIdentityGateway;\n private listPermissionsGateway: IListPermissionsGateway;\n\n constructor(\n getIdentityGateway: IGetIdentityGateway,\n listPermissionsGateway: IListPermissionsGateway\n ) {\n this.getIdentityGateway = getIdentityGateway;\n this.listPermissionsGateway = listPermissionsGateway;\n }\n\n async execute(permissions: FolderPermission[]) {\n const identity = this.getIdentityGateway.execute();\n const identityPermissions = await this.listPermissionsGateway.execute();\n\n return DefaultPermissionsMerger.merge(identity, identityPermissions, permissions);\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,yBAAA,GAAAC,OAAA;AAEO,MAAMC,qBAAqB,CAAmC;EAIjEC,WAAWA,CACPC,kBAAuC,EACvCC,sBAA+C,EACjD;IACE,IAAI,CAACD,kBAAkB,GAAGA,kBAAkB;IAC5C,IAAI,CAACC,sBAAsB,GAAGA,sBAAsB;EACxD;EAEA,MAAMC,OAAOA,CAACC,WAA+B,EAAE;IAC3C,MAAMC,QAAQ,GAAG,IAAI,CAACJ,kBAAkB,CAACE,OAAO,CAAC,CAAC;IAClD,MAAMG,mBAAmB,GAAG,MAAM,IAAI,CAACJ,sBAAsB,CAACC,OAAO,CAAC,CAAC;IAEvE,OAAOI,kDAAwB,CAACC,KAAK,CAACH,QAAQ,EAAEC,mBAAmB,EAAEF,WAAW,CAAC;EACrF;AACJ;AAACK,OAAA,CAAAV,qBAAA,GAAAA,qBAAA","ignoreList":[]}
|
|
@@ -6,5 +6,5 @@ export declare class GetDefaultPermissionsWithTeams implements IGetDefaultPermis
|
|
|
6
6
|
private listIdentityTeamsGateway;
|
|
7
7
|
private decoretee;
|
|
8
8
|
constructor(getIdentityGateway: IGetIdentityGateway, listIdentityTeamsGateway: IListIdentityTeamsGateway, decoretee: IGetDefaultPermissions);
|
|
9
|
-
execute(
|
|
9
|
+
execute(originalPermissions: FolderPermission[]): Promise<FolderPermission[]>;
|
|
10
10
|
}
|
package/flp/FolderLevelPermissions/useCases/GetDefaultPermissions/GetDefaultPermissionsWithTeams.js
CHANGED
|
@@ -10,7 +10,7 @@ class GetDefaultPermissionsWithTeams {
|
|
|
10
10
|
this.listIdentityTeamsGateway = listIdentityTeamsGateway;
|
|
11
11
|
this.decoretee = decoretee;
|
|
12
12
|
}
|
|
13
|
-
async execute(
|
|
13
|
+
async execute(originalPermissions) {
|
|
14
14
|
/**
|
|
15
15
|
* Retrieves the list of teams the current identity belongs to and checks if any of these teams
|
|
16
16
|
* have permissions for the folder. If a team has permissions, the current identity is granted
|
|
@@ -18,6 +18,8 @@ class GetDefaultPermissionsWithTeams {
|
|
|
18
18
|
*/
|
|
19
19
|
const identity = this.getIdentityGateway.execute();
|
|
20
20
|
const identityTeams = (await this.listIdentityTeamsGateway.execute()) ?? [];
|
|
21
|
+
const permissions = [...originalPermissions]; // Clone the original permissions to avoid mutation.
|
|
22
|
+
|
|
21
23
|
if (identityTeams.length) {
|
|
22
24
|
for (const identityTeam of identityTeams) {
|
|
23
25
|
// Check if the team has permissions for the folder.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["GetDefaultPermissionsWithTeams","constructor","getIdentityGateway","listIdentityTeamsGateway","decoretee","execute","
|
|
1
|
+
{"version":3,"names":["GetDefaultPermissionsWithTeams","constructor","getIdentityGateway","listIdentityTeamsGateway","decoretee","execute","originalPermissions","identity","identityTeams","permissions","length","identityTeam","teamPermission","find","p","target","id","push","level","inheritedFrom","exports"],"sources":["GetDefaultPermissionsWithTeams.ts"],"sourcesContent":["import type { IGetDefaultPermissions } from \"./IGetDefaultPermissions\";\nimport type {\n IGetIdentityGateway,\n IListIdentityTeamsGateway\n} from \"~/flp/FolderLevelPermissions/gateways\";\nimport type { FolderPermission } from \"~/flp/flp.types\";\nimport { Team } from \"@webiny/api-security/types\";\n\nexport class GetDefaultPermissionsWithTeams implements IGetDefaultPermissions {\n private getIdentityGateway: IGetIdentityGateway;\n private listIdentityTeamsGateway: IListIdentityTeamsGateway;\n private decoretee: IGetDefaultPermissions;\n\n constructor(\n getIdentityGateway: IGetIdentityGateway,\n listIdentityTeamsGateway: IListIdentityTeamsGateway,\n decoretee: IGetDefaultPermissions\n ) {\n this.getIdentityGateway = getIdentityGateway;\n this.listIdentityTeamsGateway = listIdentityTeamsGateway;\n this.decoretee = decoretee;\n }\n\n async execute(originalPermissions: FolderPermission[]) {\n /**\n * Retrieves the list of teams the current identity belongs to and checks if any of these teams\n * have permissions for the folder. If a team has permissions, the current identity is granted\n * the same permissions, inheriting them from the team.\n */\n const identity = this.getIdentityGateway.execute();\n const identityTeams: Team[] = (await this.listIdentityTeamsGateway.execute()) ?? [];\n\n const permissions = [...originalPermissions]; // Clone the original permissions to avoid mutation.\n\n if (identityTeams.length) {\n for (const identityTeam of identityTeams) {\n // Check if the team has permissions for the folder.\n const teamPermission = permissions.find(\n p => p.target === `team:${identityTeam.id}`\n );\n\n if (teamPermission) {\n // Grant the current identity the same permissions as the team, marking them as inherited.\n permissions.push({\n target: `admin:${identity.id}`,\n level: teamPermission.level,\n inheritedFrom: \"team:\" + identityTeam.id\n });\n }\n }\n }\n\n return await this.decoretee.execute(permissions);\n }\n}\n"],"mappings":";;;;;;AAQO,MAAMA,8BAA8B,CAAmC;EAK1EC,WAAWA,CACPC,kBAAuC,EACvCC,wBAAmD,EACnDC,SAAiC,EACnC;IACE,IAAI,CAACF,kBAAkB,GAAGA,kBAAkB;IAC5C,IAAI,CAACC,wBAAwB,GAAGA,wBAAwB;IACxD,IAAI,CAACC,SAAS,GAAGA,SAAS;EAC9B;EAEA,MAAMC,OAAOA,CAACC,mBAAuC,EAAE;IACnD;AACR;AACA;AACA;AACA;IACQ,MAAMC,QAAQ,GAAG,IAAI,CAACL,kBAAkB,CAACG,OAAO,CAAC,CAAC;IAClD,MAAMG,aAAqB,GAAG,CAAC,MAAM,IAAI,CAACL,wBAAwB,CAACE,OAAO,CAAC,CAAC,KAAK,EAAE;IAEnF,MAAMI,WAAW,GAAG,CAAC,GAAGH,mBAAmB,CAAC,CAAC,CAAC;;IAE9C,IAAIE,aAAa,CAACE,MAAM,EAAE;MACtB,KAAK,MAAMC,YAAY,IAAIH,aAAa,EAAE;QACtC;QACA,MAAMI,cAAc,GAAGH,WAAW,CAACI,IAAI,CACnCC,CAAC,IAAIA,CAAC,CAACC,MAAM,KAAK,QAAQJ,YAAY,CAACK,EAAE,EAC7C,CAAC;QAED,IAAIJ,cAAc,EAAE;UAChB;UACAH,WAAW,CAACQ,IAAI,CAAC;YACbF,MAAM,EAAE,SAASR,QAAQ,CAACS,EAAE,EAAE;YAC9BE,KAAK,EAAEN,cAAc,CAACM,KAAK;YAC3BC,aAAa,EAAE,OAAO,GAAGR,YAAY,CAACK;UAC1C,CAAC,CAAC;QACN;MACJ;IACJ;IAEA,OAAO,MAAM,IAAI,CAACZ,SAAS,CAACC,OAAO,CAACI,WAAW,CAAC;EACpD;AACJ;AAACW,OAAA,CAAApB,8BAAA,GAAAA,8BAAA","ignoreList":[]}
|
package/flp/flp.types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Topic } from "@webiny/pubsub/types";
|
|
2
2
|
import { ITaskRunParams } from "@webiny/tasks/types";
|
|
3
3
|
import { type AcoContext, type Folder } from "../types";
|
|
4
|
-
export type FolderAccessLevel = "owner" | "viewer" | "editor" | "public";
|
|
4
|
+
export type FolderAccessLevel = "owner" | "viewer" | "editor" | "public" | "no-access";
|
|
5
5
|
export interface FolderPermission {
|
|
6
6
|
target: string;
|
|
7
7
|
level: FolderAccessLevel;
|
package/flp/flp.types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["flp.types.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { ITaskRunParams } from \"@webiny/tasks/types\";\nimport { type AcoContext, type Folder } from \"~/types\";\n\nexport type FolderAccessLevel = \"owner\" | \"viewer\" | \"editor\" | \"public\";\n\nexport interface FolderPermission {\n target: string;\n level: FolderAccessLevel;\n inheritedFrom?: string;\n}\n\nexport interface FolderLevelPermission {\n id: string;\n parentId: string;\n slug: string;\n path: string;\n permissions: FolderPermission[];\n type: string;\n}\n\n/********\n * CRUD operations\n *******/\n\nexport interface ListFlpsParams {\n where: {\n path_startsWith?: string;\n parentId?: string;\n type: string;\n };\n}\n\nexport type CreateFlpParams = Pick<\n FolderLevelPermission,\n \"id\" | \"type\" | \"permissions\" | \"path\" | \"parentId\" | \"slug\"\n>;\n\nexport interface UpdateFlpParams {\n parentId?: string;\n slug?: string;\n path?: string;\n permissions?: FolderPermission[];\n type?: string;\n}\n\nexport interface OnFlpBeforeCreateTopicParams {\n input: CreateFlpParams;\n}\n\nexport interface OnFlpAfterCreateTopicParams {\n flp: FolderLevelPermission;\n}\n\nexport interface OnFlpBeforeUpdateTopicParams {\n original: FolderLevelPermission;\n input: Record<string, any>;\n}\n\nexport interface OnFlpAfterUpdateTopicParams {\n original: FolderLevelPermission;\n flp: FolderLevelPermission;\n input: Record<string, any>;\n}\n\nexport interface OnFlpBeforeDeleteTopicParams {\n flp: FolderLevelPermission;\n}\n\nexport interface OnFlpAfterDeleteTopicParams {\n flp: FolderLevelPermission;\n}\n\nexport interface OnFlpBatchBeforeUpdateTopicParams {\n items: Array<{\n original: FolderLevelPermission;\n input: UpdateFlpParams;\n }>;\n}\n\nexport interface OnFlpBatchAfterUpdateTopicParams {\n items: Array<{\n original: FolderLevelPermission;\n flp: FolderLevelPermission;\n input: UpdateFlpParams;\n }>;\n}\n\nexport interface AcoFolderLevelPermissionsCrud {\n list(params: ListFlpsParams): Promise<FolderLevelPermission[]>;\n get(id: string): Promise<FolderLevelPermission | null>;\n create(params: CreateFlpParams): Promise<FolderLevelPermission>;\n update(id: string, data: UpdateFlpParams): Promise<FolderLevelPermission>;\n delete(id: string): Promise<boolean>;\n batchUpdate(\n items: Array<{ id: string; data: UpdateFlpParams }>\n ): Promise<FolderLevelPermission[]>;\n onFlpBeforeCreate: Topic<OnFlpBeforeCreateTopicParams>;\n onFlpAfterCreate: Topic<OnFlpAfterCreateTopicParams>;\n onFlpBeforeUpdate: Topic<OnFlpBeforeUpdateTopicParams>;\n onFlpAfterUpdate: Topic<OnFlpAfterUpdateTopicParams>;\n onFlpBeforeDelete: Topic<OnFlpBeforeDeleteTopicParams>;\n onFlpAfterDelete: Topic<OnFlpAfterDeleteTopicParams>;\n onFlpBatchBeforeUpdate: Topic<OnFlpBatchBeforeUpdateTopicParams>;\n onFlpBatchAfterUpdate: Topic<OnFlpBatchAfterUpdateTopicParams>;\n}\n\n/********\n * Storage operations\n *******/\n\nexport interface StorageOperationsListFlpsParams {\n where: ListFlpsParams[\"where\"] & {\n tenant: string;\n locale: string;\n };\n}\n\nexport interface StorageOperationsGetFlpParams {\n id: string;\n tenant: string;\n locale: string;\n}\n\nexport type StorageOperationsCreateFlpParams = {\n data: FolderLevelPermission & {\n tenant: string;\n locale: string;\n };\n};\n\nexport type StorageOperationsUpdateFlpParams = {\n original: FolderLevelPermission;\n data: UpdateFlpParams & {\n tenant: string;\n locale: string;\n };\n};\n\nexport type StorageOperationsDeleteFlpParams = {\n flp: FolderLevelPermission & {\n tenant: string;\n locale: string;\n };\n};\n\nexport interface StorageOperationsBatchUpdateFlpParams {\n items: Array<{\n original: FolderLevelPermission;\n data: UpdateFlpParams & {\n tenant: string;\n locale: string;\n };\n }>;\n}\n\nexport interface AcoFolderLevelPermissionsStorageOperations {\n list(params: StorageOperationsListFlpsParams): Promise<FolderLevelPermission[]>;\n get(params: StorageOperationsGetFlpParams): Promise<FolderLevelPermission | null>;\n create(params: StorageOperationsCreateFlpParams): Promise<FolderLevelPermission>;\n update(params: StorageOperationsUpdateFlpParams): Promise<FolderLevelPermission>;\n delete(params: StorageOperationsDeleteFlpParams): Promise<void>;\n batchUpdate(params: StorageOperationsBatchUpdateFlpParams): Promise<FolderLevelPermission[]>;\n}\n\n/********\n * Background Tasks\n *******/\n\nexport interface ICreateFlpTaskInput {\n folder: Folder;\n}\n\nexport type ICreateFlpTaskParams = ITaskRunParams<AcoContext, ICreateFlpTaskInput>;\n\nexport interface IUpdateFlpTaskInput {\n folder: Folder;\n queued?: string[];\n}\n\nexport type IUpdateFlpTaskParams = ITaskRunParams<AcoContext, IUpdateFlpTaskInput>;\n\nexport interface IDeleteFlpTaskInput {\n folder: Folder;\n}\n\nexport type IDeleteFlpTaskParams = ITaskRunParams<AcoContext, IDeleteFlpTaskInput>;\n\nexport interface ISyncFlpTaskInput {\n type?: string;\n folderId?: string;\n}\n\nexport type ISyncFlpTaskParams = ITaskRunParams<AcoContext, ISyncFlpTaskInput>;\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["flp.types.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { ITaskRunParams } from \"@webiny/tasks/types\";\nimport { type AcoContext, type Folder } from \"~/types\";\n\nexport type FolderAccessLevel = \"owner\" | \"viewer\" | \"editor\" | \"public\" | \"no-access\";\n\nexport interface FolderPermission {\n target: string;\n level: FolderAccessLevel;\n inheritedFrom?: string;\n}\n\nexport interface FolderLevelPermission {\n id: string;\n parentId: string;\n slug: string;\n path: string;\n permissions: FolderPermission[];\n type: string;\n}\n\n/********\n * CRUD operations\n *******/\n\nexport interface ListFlpsParams {\n where: {\n path_startsWith?: string;\n parentId?: string;\n type: string;\n };\n}\n\nexport type CreateFlpParams = Pick<\n FolderLevelPermission,\n \"id\" | \"type\" | \"permissions\" | \"path\" | \"parentId\" | \"slug\"\n>;\n\nexport interface UpdateFlpParams {\n parentId?: string;\n slug?: string;\n path?: string;\n permissions?: FolderPermission[];\n type?: string;\n}\n\nexport interface OnFlpBeforeCreateTopicParams {\n input: CreateFlpParams;\n}\n\nexport interface OnFlpAfterCreateTopicParams {\n flp: FolderLevelPermission;\n}\n\nexport interface OnFlpBeforeUpdateTopicParams {\n original: FolderLevelPermission;\n input: Record<string, any>;\n}\n\nexport interface OnFlpAfterUpdateTopicParams {\n original: FolderLevelPermission;\n flp: FolderLevelPermission;\n input: Record<string, any>;\n}\n\nexport interface OnFlpBeforeDeleteTopicParams {\n flp: FolderLevelPermission;\n}\n\nexport interface OnFlpAfterDeleteTopicParams {\n flp: FolderLevelPermission;\n}\n\nexport interface OnFlpBatchBeforeUpdateTopicParams {\n items: Array<{\n original: FolderLevelPermission;\n input: UpdateFlpParams;\n }>;\n}\n\nexport interface OnFlpBatchAfterUpdateTopicParams {\n items: Array<{\n original: FolderLevelPermission;\n flp: FolderLevelPermission;\n input: UpdateFlpParams;\n }>;\n}\n\nexport interface AcoFolderLevelPermissionsCrud {\n list(params: ListFlpsParams): Promise<FolderLevelPermission[]>;\n get(id: string): Promise<FolderLevelPermission | null>;\n create(params: CreateFlpParams): Promise<FolderLevelPermission>;\n update(id: string, data: UpdateFlpParams): Promise<FolderLevelPermission>;\n delete(id: string): Promise<boolean>;\n batchUpdate(\n items: Array<{ id: string; data: UpdateFlpParams }>\n ): Promise<FolderLevelPermission[]>;\n onFlpBeforeCreate: Topic<OnFlpBeforeCreateTopicParams>;\n onFlpAfterCreate: Topic<OnFlpAfterCreateTopicParams>;\n onFlpBeforeUpdate: Topic<OnFlpBeforeUpdateTopicParams>;\n onFlpAfterUpdate: Topic<OnFlpAfterUpdateTopicParams>;\n onFlpBeforeDelete: Topic<OnFlpBeforeDeleteTopicParams>;\n onFlpAfterDelete: Topic<OnFlpAfterDeleteTopicParams>;\n onFlpBatchBeforeUpdate: Topic<OnFlpBatchBeforeUpdateTopicParams>;\n onFlpBatchAfterUpdate: Topic<OnFlpBatchAfterUpdateTopicParams>;\n}\n\n/********\n * Storage operations\n *******/\n\nexport interface StorageOperationsListFlpsParams {\n where: ListFlpsParams[\"where\"] & {\n tenant: string;\n locale: string;\n };\n}\n\nexport interface StorageOperationsGetFlpParams {\n id: string;\n tenant: string;\n locale: string;\n}\n\nexport type StorageOperationsCreateFlpParams = {\n data: FolderLevelPermission & {\n tenant: string;\n locale: string;\n };\n};\n\nexport type StorageOperationsUpdateFlpParams = {\n original: FolderLevelPermission;\n data: UpdateFlpParams & {\n tenant: string;\n locale: string;\n };\n};\n\nexport type StorageOperationsDeleteFlpParams = {\n flp: FolderLevelPermission & {\n tenant: string;\n locale: string;\n };\n};\n\nexport interface StorageOperationsBatchUpdateFlpParams {\n items: Array<{\n original: FolderLevelPermission;\n data: UpdateFlpParams & {\n tenant: string;\n locale: string;\n };\n }>;\n}\n\nexport interface AcoFolderLevelPermissionsStorageOperations {\n list(params: StorageOperationsListFlpsParams): Promise<FolderLevelPermission[]>;\n get(params: StorageOperationsGetFlpParams): Promise<FolderLevelPermission | null>;\n create(params: StorageOperationsCreateFlpParams): Promise<FolderLevelPermission>;\n update(params: StorageOperationsUpdateFlpParams): Promise<FolderLevelPermission>;\n delete(params: StorageOperationsDeleteFlpParams): Promise<void>;\n batchUpdate(params: StorageOperationsBatchUpdateFlpParams): Promise<FolderLevelPermission[]>;\n}\n\n/********\n * Background Tasks\n *******/\n\nexport interface ICreateFlpTaskInput {\n folder: Folder;\n}\n\nexport type ICreateFlpTaskParams = ITaskRunParams<AcoContext, ICreateFlpTaskInput>;\n\nexport interface IUpdateFlpTaskInput {\n folder: Folder;\n queued?: string[];\n}\n\nexport type IUpdateFlpTaskParams = ITaskRunParams<AcoContext, IUpdateFlpTaskInput>;\n\nexport interface IDeleteFlpTaskInput {\n folder: Folder;\n}\n\nexport type IDeleteFlpTaskParams = ITaskRunParams<AcoContext, IDeleteFlpTaskInput>;\n\nexport interface ISyncFlpTaskInput {\n type?: string;\n folderId?: string;\n}\n\nexport type ISyncFlpTaskParams = ITaskRunParams<AcoContext, ISyncFlpTaskInput>;\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FolderLevelPermission
|
|
1
|
+
import type { FolderLevelPermission, FolderPermission } from "../flp.types";
|
|
2
2
|
export declare class Permissions {
|
|
3
|
-
static create(permissions?: FolderPermission[], parentFlp?:
|
|
3
|
+
static create(permissions?: FolderPermission[], parentFlp?: FolderLevelPermission | null): FolderPermission[];
|
|
4
4
|
}
|
|
@@ -6,31 +6,40 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.Permissions = void 0;
|
|
7
7
|
class Permissions {
|
|
8
8
|
static create(permissions, parentFlp) {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return folderPermissions;
|
|
9
|
+
const parentFolderPermissions = parentFlp?.permissions || [];
|
|
10
|
+
const currentFolderPermissions = permissions?.filter(p => p.inheritedFrom !== `parent:${parentFlp?.id}`) || [];
|
|
11
|
+
if (!parentFolderPermissions.length) {
|
|
12
|
+
return currentFolderPermissions;
|
|
14
13
|
}
|
|
15
|
-
const {
|
|
16
|
-
id: parentId,
|
|
17
|
-
permissions: parentPermissions
|
|
18
|
-
} = parentFlp;
|
|
19
|
-
|
|
20
|
-
// Remove all previously inherited permissions
|
|
21
|
-
const cleanedPermissions = folderPermissions.filter(p => p.inheritedFrom !== `parent:${parentId}`);
|
|
22
14
|
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
|
|
15
|
+
// Merge parent and current folder permissions:
|
|
16
|
+
// - current folder permissions take precedence over parent permissions
|
|
17
|
+
// - only if parent permission's level is set to `no-access`, then we ignore the current folder permission
|
|
18
|
+
const permissionsInheritedFromParentFolder = [];
|
|
19
|
+
for (const parentFolderPermission of parentFolderPermissions) {
|
|
20
|
+
if (parentFolderPermission.level === "no-access") {
|
|
21
|
+
permissionsInheritedFromParentFolder.push({
|
|
22
|
+
...parentFolderPermission,
|
|
23
|
+
inheritedFrom: `parent:${parentFlp.id}`
|
|
24
|
+
});
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const currentFolderHasOverridePermission = currentFolderPermissions.some(permission => permission.target === parentFolderPermission.target);
|
|
28
|
+
if (currentFolderHasOverridePermission) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
permissionsInheritedFromParentFolder.push({
|
|
32
|
+
...parentFolderPermission,
|
|
33
|
+
inheritedFrom: `parent:${parentFlp.id}`
|
|
34
|
+
});
|
|
35
|
+
}
|
|
26
36
|
|
|
27
|
-
//
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return [...cleanedPermissions, ...inheritedPermissions];
|
|
37
|
+
// Add current folder permissions that are not present in the parent folder permissions.
|
|
38
|
+
const applicableCurrentFolderPermissions = currentFolderPermissions.filter(permission => {
|
|
39
|
+
const alreadyInInheritedPermissions = permissionsInheritedFromParentFolder.some(p => p.target === permission.target);
|
|
40
|
+
return !alreadyInInheritedPermissions;
|
|
41
|
+
});
|
|
42
|
+
return [...applicableCurrentFolderPermissions, ...permissionsInheritedFromParentFolder];
|
|
34
43
|
}
|
|
35
44
|
}
|
|
36
45
|
exports.Permissions = Permissions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Permissions","create","permissions","parentFlp","
|
|
1
|
+
{"version":3,"names":["Permissions","create","permissions","parentFlp","parentFolderPermissions","currentFolderPermissions","filter","p","inheritedFrom","id","length","permissionsInheritedFromParentFolder","parentFolderPermission","level","push","currentFolderHasOverridePermission","some","permission","target","applicableCurrentFolderPermissions","alreadyInInheritedPermissions","exports"],"sources":["Permissions.ts"],"sourcesContent":["import type { FolderLevelPermission, FolderPermission } from \"~/flp/flp.types\";\n\nexport class Permissions {\n public static create(\n permissions?: FolderPermission[],\n parentFlp?: FolderLevelPermission | null\n ): FolderPermission[] {\n const parentFolderPermissions = parentFlp?.permissions || [];\n const currentFolderPermissions =\n permissions?.filter(p => p.inheritedFrom !== `parent:${parentFlp?.id}`) || [];\n\n if (!parentFolderPermissions.length) {\n return currentFolderPermissions;\n }\n\n // Merge parent and current folder permissions:\n // - current folder permissions take precedence over parent permissions\n // - only if parent permission's level is set to `no-access`, then we ignore the current folder permission\n const permissionsInheritedFromParentFolder: FolderPermission[] = [];\n\n for (const parentFolderPermission of parentFolderPermissions) {\n if (parentFolderPermission.level === \"no-access\") {\n permissionsInheritedFromParentFolder.push({\n ...parentFolderPermission,\n inheritedFrom: `parent:${parentFlp!.id}`\n });\n continue;\n }\n\n const currentFolderHasOverridePermission = currentFolderPermissions.some(\n permission => permission.target === parentFolderPermission.target\n );\n\n if (currentFolderHasOverridePermission) {\n continue;\n }\n\n permissionsInheritedFromParentFolder.push({\n ...parentFolderPermission,\n inheritedFrom: `parent:${parentFlp!.id}`\n });\n }\n\n // Add current folder permissions that are not present in the parent folder permissions.\n const applicableCurrentFolderPermissions = currentFolderPermissions.filter(permission => {\n const alreadyInInheritedPermissions = permissionsInheritedFromParentFolder.some(\n p => p.target === permission.target\n );\n\n return !alreadyInInheritedPermissions;\n });\n\n return [...applicableCurrentFolderPermissions, ...permissionsInheritedFromParentFolder];\n }\n}\n"],"mappings":";;;;;;AAEO,MAAMA,WAAW,CAAC;EACrB,OAAcC,MAAMA,CAChBC,WAAgC,EAChCC,SAAwC,EACtB;IAClB,MAAMC,uBAAuB,GAAGD,SAAS,EAAED,WAAW,IAAI,EAAE;IAC5D,MAAMG,wBAAwB,GAC1BH,WAAW,EAAEI,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACC,aAAa,KAAK,UAAUL,SAAS,EAAEM,EAAE,EAAE,CAAC,IAAI,EAAE;IAEjF,IAAI,CAACL,uBAAuB,CAACM,MAAM,EAAE;MACjC,OAAOL,wBAAwB;IACnC;;IAEA;IACA;IACA;IACA,MAAMM,oCAAwD,GAAG,EAAE;IAEnE,KAAK,MAAMC,sBAAsB,IAAIR,uBAAuB,EAAE;MAC1D,IAAIQ,sBAAsB,CAACC,KAAK,KAAK,WAAW,EAAE;QAC9CF,oCAAoC,CAACG,IAAI,CAAC;UACtC,GAAGF,sBAAsB;UACzBJ,aAAa,EAAE,UAAUL,SAAS,CAAEM,EAAE;QAC1C,CAAC,CAAC;QACF;MACJ;MAEA,MAAMM,kCAAkC,GAAGV,wBAAwB,CAACW,IAAI,CACpEC,UAAU,IAAIA,UAAU,CAACC,MAAM,KAAKN,sBAAsB,CAACM,MAC/D,CAAC;MAED,IAAIH,kCAAkC,EAAE;QACpC;MACJ;MAEAJ,oCAAoC,CAACG,IAAI,CAAC;QACtC,GAAGF,sBAAsB;QACzBJ,aAAa,EAAE,UAAUL,SAAS,CAAEM,EAAE;MAC1C,CAAC,CAAC;IACN;;IAEA;IACA,MAAMU,kCAAkC,GAAGd,wBAAwB,CAACC,MAAM,CAACW,UAAU,IAAI;MACrF,MAAMG,6BAA6B,GAAGT,oCAAoC,CAACK,IAAI,CAC3ET,CAAC,IAAIA,CAAC,CAACW,MAAM,KAAKD,UAAU,CAACC,MACjC,CAAC;MAED,OAAO,CAACE,6BAA6B;IACzC,CAAC,CAAC;IAEF,OAAO,CAAC,GAAGD,kCAAkC,EAAE,GAAGR,oCAAoC,CAAC;EAC3F;AACJ;AAACU,OAAA,CAAArB,WAAA,GAAAA,WAAA","ignoreList":[]}
|
package/folder/folder.model.js
CHANGED
|
@@ -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","extensionsField","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\nconst extensionsField = () =>\n createModelField({\n label: \"Extensions\",\n fieldId: \"extensions\",\n type: \"object\",\n settings: {\n layout: [],\n fields: []\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: [\n titleField(),\n slugField(),\n typeField(),\n parentIdField(),\n permissionsField(),\n extensionsField()\n ]\n });\n};\n"],"mappings":"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","ignoreList":[]}
|
|
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","extensionsField","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 label: \"No Access\",\n value: \"no-access\"\n }\n ]\n }\n }\n ],\n layout: [[\"target\"], [\"level\"]]\n }\n });\n\nconst extensionsField = () =>\n createModelField({\n label: \"Extensions\",\n fieldId: \"extensions\",\n type: \"object\",\n settings: {\n layout: [],\n fields: []\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: [\n titleField(),\n slugField(),\n typeField(),\n parentIdField(),\n permissionsField(),\n extensionsField()\n ]\n });\n};\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-aco",
|
|
3
|
-
"version": "5.43.0-beta.
|
|
3
|
+
"version": "5.43.0-beta.3",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"aco:base"
|
|
@@ -22,38 +22,38 @@
|
|
|
22
22
|
"directory": "dist"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@webiny/api": "5.43.0-beta.
|
|
26
|
-
"@webiny/api-authentication": "5.43.0-beta.
|
|
27
|
-
"@webiny/api-headless-cms": "5.43.0-beta.
|
|
28
|
-
"@webiny/api-i18n": "5.43.0-beta.
|
|
29
|
-
"@webiny/api-security": "5.43.0-beta.
|
|
30
|
-
"@webiny/api-tenancy": "5.43.0-beta.
|
|
31
|
-
"@webiny/aws-sdk": "5.43.0-beta.
|
|
32
|
-
"@webiny/db-dynamodb": "5.43.0-beta.
|
|
33
|
-
"@webiny/error": "5.43.0-beta.
|
|
34
|
-
"@webiny/handler": "5.43.0-beta.
|
|
35
|
-
"@webiny/handler-graphql": "5.43.0-beta.
|
|
36
|
-
"@webiny/pubsub": "5.43.0-beta.
|
|
37
|
-
"@webiny/tasks": "5.43.0-beta.
|
|
38
|
-
"@webiny/utils": "5.43.0-beta.
|
|
39
|
-
"@webiny/validation": "5.43.0-beta.
|
|
25
|
+
"@webiny/api": "5.43.0-beta.3",
|
|
26
|
+
"@webiny/api-authentication": "5.43.0-beta.3",
|
|
27
|
+
"@webiny/api-headless-cms": "5.43.0-beta.3",
|
|
28
|
+
"@webiny/api-i18n": "5.43.0-beta.3",
|
|
29
|
+
"@webiny/api-security": "5.43.0-beta.3",
|
|
30
|
+
"@webiny/api-tenancy": "5.43.0-beta.3",
|
|
31
|
+
"@webiny/aws-sdk": "5.43.0-beta.3",
|
|
32
|
+
"@webiny/db-dynamodb": "5.43.0-beta.3",
|
|
33
|
+
"@webiny/error": "5.43.0-beta.3",
|
|
34
|
+
"@webiny/handler": "5.43.0-beta.3",
|
|
35
|
+
"@webiny/handler-graphql": "5.43.0-beta.3",
|
|
36
|
+
"@webiny/pubsub": "5.43.0-beta.3",
|
|
37
|
+
"@webiny/tasks": "5.43.0-beta.3",
|
|
38
|
+
"@webiny/utils": "5.43.0-beta.3",
|
|
39
|
+
"@webiny/validation": "5.43.0-beta.3",
|
|
40
40
|
"lodash": "4.17.21"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@webiny/api-admin-users": "5.43.0-beta.
|
|
44
|
-
"@webiny/api-file-manager": "5.43.0-beta.
|
|
45
|
-
"@webiny/api-i18n-ddb": "5.43.0-beta.
|
|
46
|
-
"@webiny/api-security-so-ddb": "5.43.0-beta.
|
|
47
|
-
"@webiny/api-tenancy-so-ddb": "5.43.0-beta.
|
|
48
|
-
"@webiny/api-wcp": "5.43.0-beta.
|
|
49
|
-
"@webiny/handler-aws": "5.43.0-beta.
|
|
50
|
-
"@webiny/plugins": "5.43.0-beta.
|
|
51
|
-
"@webiny/project-utils": "5.43.0-beta.
|
|
52
|
-
"@webiny/wcp": "5.43.0-beta.
|
|
43
|
+
"@webiny/api-admin-users": "5.43.0-beta.3",
|
|
44
|
+
"@webiny/api-file-manager": "5.43.0-beta.3",
|
|
45
|
+
"@webiny/api-i18n-ddb": "5.43.0-beta.3",
|
|
46
|
+
"@webiny/api-security-so-ddb": "5.43.0-beta.3",
|
|
47
|
+
"@webiny/api-tenancy-so-ddb": "5.43.0-beta.3",
|
|
48
|
+
"@webiny/api-wcp": "5.43.0-beta.3",
|
|
49
|
+
"@webiny/handler-aws": "5.43.0-beta.3",
|
|
50
|
+
"@webiny/plugins": "5.43.0-beta.3",
|
|
51
|
+
"@webiny/project-utils": "5.43.0-beta.3",
|
|
52
|
+
"@webiny/wcp": "5.43.0-beta.3",
|
|
53
53
|
"graphql": "15.9.0",
|
|
54
54
|
"prettier": "2.8.8",
|
|
55
55
|
"rimraf": "6.0.1",
|
|
56
56
|
"typescript": "5.3.3"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "bb3de95f65a48bc7264719fcd2d78bf78749fc69"
|
|
59
59
|
}
|
package/types.d.ts
CHANGED
|
@@ -96,8 +96,8 @@ export interface IAcoApp {
|
|
|
96
96
|
removeField: IAcoAppRemoveFieldCallable;
|
|
97
97
|
modifyField: IAcoAppModifyFieldCallable;
|
|
98
98
|
}
|
|
99
|
-
export type IAcoAppOnEntry<T extends GenericSearchData = GenericSearchData> = (entry: SearchRecord<T
|
|
100
|
-
export type IAcoAppOnEntryList<T extends GenericSearchData = GenericSearchData> = (
|
|
99
|
+
export type IAcoAppOnEntry<T extends GenericSearchData = GenericSearchData> = (entry: SearchRecord<T>, context: AcoContext) => Promise<SearchRecord<T>>;
|
|
100
|
+
export type IAcoAppOnEntryList<T extends GenericSearchData = GenericSearchData> = (entries: SearchRecord<T>[], context: AcoContext) => Promise<SearchRecord<T>[]>;
|
|
101
101
|
export type AcoRequestAction = "create" | "update" | "delete" | "move" | "fetch";
|
|
102
102
|
export type IAcoAppOnAnyRequest = (context: AcoContext, action: AcoRequestAction) => Promise<void>;
|
|
103
103
|
export interface IAcoAppParams {
|
package/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_filter","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_folder","_record","_flp","ListSortDirection"],"sources":["types.ts"],"sourcesContent":["import { TenancyContext, Tenant } from \"@webiny/api-tenancy/types\";\nimport { Context as BaseContext } from \"@webiny/handler/types\";\nimport { I18NContext, I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityContext } from \"@webiny/api-security/types\";\nimport { AdminUsersContext } from \"@webiny/api-admin-users/types\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { Context as TasksContext } from \"@webiny/tasks/types\";\nimport { CmsContext, CmsModel, CmsModelField } from \"@webiny/api-headless-cms/types\";\nimport type {\n AcoSearchRecordCrud,\n AcoSearchRecordCrudBase,\n AcoSearchRecordStorageOperations,\n GenericSearchData,\n SearchRecord\n} from \"~/record/record.types\";\nimport type { AcoFolderCrud, AcoFolderStorageOperations } from \"~/folder/folder.types\";\nimport type { AcoFilterCrud, AcoFilterStorageOperations } from \"~/filter/filter.types\";\nimport type {\n AcoFolderLevelPermissionsCrud,\n AcoFolderLevelPermissionsStorageOperations\n} from \"~/flp/flp.types\";\nimport { FolderLevelPermissions } from \"~/flp\";\n\nexport * from \"./filter/filter.types\";\nexport * from \"./folder/folder.types\";\nexport * from \"./record/record.types\";\nexport * from \"./flp/flp.types\";\n\nexport interface User {\n id: string;\n type: string;\n displayName: string | null;\n}\n\nexport interface ListMeta {\n cursor: string | null;\n totalCount: number;\n hasMoreItems: boolean;\n}\n\nexport enum ListSortDirection {\n ASC,\n DESC\n}\n\nexport type ListSort = Record<string, ListSortDirection>;\n\nexport interface AcoBaseFields {\n id: string;\n entryId: string;\n createdOn: string;\n modifiedOn: string | null;\n savedOn: string;\n createdBy: User;\n modifiedBy: User | null;\n savedBy: User;\n}\n\nexport interface AdvancedContentOrganisation {\n folder: AcoFolderCrud;\n search: AcoSearchRecordCrud;\n filter: AcoFilterCrud;\n flp: AcoFolderLevelPermissionsCrud;\n folderLevelPermissions: FolderLevelPermissions;\n apps: IAcoApps;\n registerApp: (params: IAcoAppRegisterParams) => Promise<IAcoApp>;\n getApp: (name: string) => IAcoApp;\n listApps: () => IAcoApp[];\n}\n\nexport interface CreateAcoParams {\n getLocale: () => I18NLocale;\n getTenant: () => Tenant;\n storageOperations: AcoStorageOperations;\n folderLevelPermissions: FolderLevelPermissions;\n}\n\nexport interface AcoStorageOperations {\n folder: AcoFolderStorageOperations;\n search: AcoSearchRecordStorageOperations;\n filter: AcoFilterStorageOperations;\n flp: AcoFolderLevelPermissionsStorageOperations;\n}\n\nexport interface AcoContext\n extends BaseContext,\n I18NContext,\n TenancyContext,\n SecurityContext,\n AdminUsersContext,\n CmsContext,\n FileManagerContext,\n TasksContext {\n aco: AdvancedContentOrganisation;\n}\n\n/**\n * @deprecated Use AcoContext instead\n */\nexport type ACOContext = AcoContext;\n\n/**\n * Apps\n */\nexport interface IAcoAppAddFieldCallable {\n (field: CmsModelField): void;\n}\n\nexport interface IAcoAppRemoveFieldCallable {\n (id: string): void;\n}\n\nexport interface IAcoAppModifyFieldCallableCallback {\n (field: CmsModelField): CmsModelField;\n}\n\nexport interface IAcoAppModifyFieldCallable {\n (id: string, cb: IAcoAppModifyFieldCallableCallback): void;\n}\n\nexport interface IAcoApp {\n context: AcoContext;\n search: AcoSearchRecordCrudBase;\n folder: AcoFolderCrud;\n name: string;\n model: CmsModel;\n getFields: () => CmsModelField[];\n addField: IAcoAppAddFieldCallable;\n removeField: IAcoAppRemoveFieldCallable;\n modifyField: IAcoAppModifyFieldCallable;\n}\n// TODO: determine correct type\nexport type IAcoAppOnEntry<T extends GenericSearchData = GenericSearchData> = (\n entry: SearchRecord<T
|
|
1
|
+
{"version":3,"names":["_filter","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_folder","_record","_flp","ListSortDirection"],"sources":["types.ts"],"sourcesContent":["import { TenancyContext, Tenant } from \"@webiny/api-tenancy/types\";\nimport { Context as BaseContext } from \"@webiny/handler/types\";\nimport { I18NContext, I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityContext } from \"@webiny/api-security/types\";\nimport { AdminUsersContext } from \"@webiny/api-admin-users/types\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { Context as TasksContext } from \"@webiny/tasks/types\";\nimport { CmsContext, CmsModel, CmsModelField } from \"@webiny/api-headless-cms/types\";\nimport type {\n AcoSearchRecordCrud,\n AcoSearchRecordCrudBase,\n AcoSearchRecordStorageOperations,\n GenericSearchData,\n SearchRecord\n} from \"~/record/record.types\";\nimport type { AcoFolderCrud, AcoFolderStorageOperations } from \"~/folder/folder.types\";\nimport type { AcoFilterCrud, AcoFilterStorageOperations } from \"~/filter/filter.types\";\nimport type {\n AcoFolderLevelPermissionsCrud,\n AcoFolderLevelPermissionsStorageOperations\n} from \"~/flp/flp.types\";\nimport { FolderLevelPermissions } from \"~/flp\";\n\nexport * from \"./filter/filter.types\";\nexport * from \"./folder/folder.types\";\nexport * from \"./record/record.types\";\nexport * from \"./flp/flp.types\";\n\nexport interface User {\n id: string;\n type: string;\n displayName: string | null;\n}\n\nexport interface ListMeta {\n cursor: string | null;\n totalCount: number;\n hasMoreItems: boolean;\n}\n\nexport enum ListSortDirection {\n ASC,\n DESC\n}\n\nexport type ListSort = Record<string, ListSortDirection>;\n\nexport interface AcoBaseFields {\n id: string;\n entryId: string;\n createdOn: string;\n modifiedOn: string | null;\n savedOn: string;\n createdBy: User;\n modifiedBy: User | null;\n savedBy: User;\n}\n\nexport interface AdvancedContentOrganisation {\n folder: AcoFolderCrud;\n search: AcoSearchRecordCrud;\n filter: AcoFilterCrud;\n flp: AcoFolderLevelPermissionsCrud;\n folderLevelPermissions: FolderLevelPermissions;\n apps: IAcoApps;\n registerApp: (params: IAcoAppRegisterParams) => Promise<IAcoApp>;\n getApp: (name: string) => IAcoApp;\n listApps: () => IAcoApp[];\n}\n\nexport interface CreateAcoParams {\n getLocale: () => I18NLocale;\n getTenant: () => Tenant;\n storageOperations: AcoStorageOperations;\n folderLevelPermissions: FolderLevelPermissions;\n}\n\nexport interface AcoStorageOperations {\n folder: AcoFolderStorageOperations;\n search: AcoSearchRecordStorageOperations;\n filter: AcoFilterStorageOperations;\n flp: AcoFolderLevelPermissionsStorageOperations;\n}\n\nexport interface AcoContext\n extends BaseContext,\n I18NContext,\n TenancyContext,\n SecurityContext,\n AdminUsersContext,\n CmsContext,\n FileManagerContext,\n TasksContext {\n aco: AdvancedContentOrganisation;\n}\n\n/**\n * @deprecated Use AcoContext instead\n */\nexport type ACOContext = AcoContext;\n\n/**\n * Apps\n */\nexport interface IAcoAppAddFieldCallable {\n (field: CmsModelField): void;\n}\n\nexport interface IAcoAppRemoveFieldCallable {\n (id: string): void;\n}\n\nexport interface IAcoAppModifyFieldCallableCallback {\n (field: CmsModelField): CmsModelField;\n}\n\nexport interface IAcoAppModifyFieldCallable {\n (id: string, cb: IAcoAppModifyFieldCallableCallback): void;\n}\n\nexport interface IAcoApp {\n context: AcoContext;\n search: AcoSearchRecordCrudBase;\n folder: AcoFolderCrud;\n name: string;\n model: CmsModel;\n getFields: () => CmsModelField[];\n addField: IAcoAppAddFieldCallable;\n removeField: IAcoAppRemoveFieldCallable;\n modifyField: IAcoAppModifyFieldCallable;\n}\n// TODO: determine correct type\nexport type IAcoAppOnEntry<T extends GenericSearchData = GenericSearchData> = (\n entry: SearchRecord<T>,\n context: AcoContext\n) => Promise<SearchRecord<T>>;\nexport type IAcoAppOnEntryList<T extends GenericSearchData = GenericSearchData> = (\n entries: SearchRecord<T>[],\n context: AcoContext\n) => Promise<SearchRecord<T>[]>;\nexport type AcoRequestAction = \"create\" | \"update\" | \"delete\" | \"move\" | \"fetch\";\nexport type IAcoAppOnAnyRequest = (context: AcoContext, action: AcoRequestAction) => Promise<void>;\n\nexport interface IAcoAppParams {\n name: string;\n apiName: string;\n model: CmsModel;\n fields: CmsModelField[];\n onEntry?: IAcoAppOnEntry;\n onEntryList?: IAcoAppOnEntryList;\n onAnyRequest?: IAcoAppOnAnyRequest;\n}\n\nexport type IAcoAppsOptions = CreateAcoParams;\n\nexport interface IAcoApps {\n list: () => IAcoApp[];\n register: (app: IAcoAppParams) => Promise<IAcoApp>;\n}\n\nexport type IAcoAppRegisterParams = Omit<IAcoAppParams, \"model\">;\n"],"mappings":";;;;;;;;;AAuBA,IAAAA,OAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAb,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,OAAA,GAAAb,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAW,OAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAS,OAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,OAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AACA,IAAAU,OAAA,GAAAd,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAY,OAAA,EAAAX,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAU,OAAA,CAAAV,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,OAAA,CAAAV,GAAA;IAAA;EAAA;AAAA;AACA,IAAAW,IAAA,GAAAf,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAa,IAAA,EAAAZ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAW,IAAA,CAAAX,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAG,IAAA,CAAAX,GAAA;IAAA;EAAA;AAAA;AAAgC,IAcpBY,iBAAiB,GAAAP,OAAA,CAAAO,iBAAA,0BAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA;AAwD7B;AACA;AACA;AAGA;AACA;AACA;AA4BA","ignoreList":[]}
|