@webiny/api-headless-cms 0.0.0-unstable.c59b9cc5b9 → 0.0.0-unstable.c7dec08bb0

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.
Files changed (80) hide show
  1. package/constants.d.ts +1 -0
  2. package/constants.js +8 -0
  3. package/constants.js.map +1 -0
  4. package/context.js +37 -5
  5. package/context.js.map +1 -1
  6. package/crud/contentEntry.crud.d.ts +4 -0
  7. package/crud/contentEntry.crud.js +155 -55
  8. package/crud/contentEntry.crud.js.map +1 -1
  9. package/crud/contentModel/validateModelFields.js +1 -1
  10. package/crud/contentModel/validateModelFields.js.map +1 -1
  11. package/crud/contentModel/validation.d.ts +76 -76
  12. package/crud/contentModel.crud.d.ts +2 -0
  13. package/crud/contentModel.crud.js +22 -12
  14. package/crud/contentModel.crud.js.map +1 -1
  15. package/crud/contentModelGroup/validation.d.ts +4 -4
  16. package/crud/contentModelGroup.crud.d.ts +2 -0
  17. package/crud/contentModelGroup.crud.js +41 -20
  18. package/crud/contentModelGroup.crud.js.map +1 -1
  19. package/crud/settings.crud.d.ts +2 -0
  20. package/crud/settings.crud.js +2 -6
  21. package/crud/settings.crud.js.map +1 -1
  22. package/graphql/getSchema.js +1 -1
  23. package/graphql/getSchema.js.map +1 -1
  24. package/graphql/index.d.ts +1 -1
  25. package/graphql/schema/baseSchema.js +16 -0
  26. package/graphql/schema/baseSchema.js.map +1 -1
  27. package/graphql/schema/contentEntries.js +6 -1
  28. package/graphql/schema/contentEntries.js.map +1 -1
  29. package/graphql/schema/createManageResolvers.d.ts +1 -1
  30. package/graphql/schema/createManageResolvers.js +10 -0
  31. package/graphql/schema/createManageResolvers.js.map +1 -1
  32. package/graphql/schema/createManageSDL.js +19 -4
  33. package/graphql/schema/createManageSDL.js.map +1 -1
  34. package/graphql/schema/createReadSDL.js +1 -0
  35. package/graphql/schema/createReadSDL.js.map +1 -1
  36. package/graphql/schema/resolvers/manage/resolveMove.d.ts +8 -0
  37. package/graphql/schema/resolvers/manage/resolveMove.js +30 -0
  38. package/graphql/schema/resolvers/manage/resolveMove.js.map +1 -0
  39. package/graphql/system.d.ts +2 -5
  40. package/graphql/system.js +1 -11
  41. package/graphql/system.js.map +1 -1
  42. package/graphqlFields/number.js +1 -0
  43. package/graphqlFields/number.js.map +1 -1
  44. package/graphqlFields/object.js +2 -2
  45. package/graphqlFields/object.js.map +1 -1
  46. package/graphqlFields/text.js +2 -0
  47. package/graphqlFields/text.js.map +1 -1
  48. package/index.d.ts +1 -1
  49. package/package.json +19 -23
  50. package/types.d.ts +38 -5
  51. package/types.js.map +1 -1
  52. package/utils/createTypeFromFields.js +1 -1
  53. package/utils/createTypeFromFields.js.map +1 -1
  54. package/utils/permissions/EntriesPermissions.d.ts +4 -0
  55. package/utils/permissions/EntriesPermissions.js +9 -0
  56. package/utils/permissions/EntriesPermissions.js.map +1 -0
  57. package/utils/permissions/ModelGroupsPermissions.d.ts +11 -0
  58. package/utils/permissions/ModelGroupsPermissions.js +48 -0
  59. package/utils/permissions/ModelGroupsPermissions.js.map +1 -0
  60. package/utils/permissions/ModelsPermissions.d.ts +20 -0
  61. package/utils/permissions/ModelsPermissions.js +91 -0
  62. package/utils/permissions/ModelsPermissions.js.map +1 -0
  63. package/utils/permissions/SettingsPermissions.d.ts +4 -0
  64. package/utils/permissions/SettingsPermissions.js +9 -0
  65. package/utils/permissions/SettingsPermissions.js.map +1 -0
  66. package/utils/renderListFilterFields.d.ts +1 -0
  67. package/utils/renderListFilterFields.js +10 -4
  68. package/utils/renderListFilterFields.js.map +1 -1
  69. package/utils/renderSortEnum.d.ts +1 -1
  70. package/utils/renderSortEnum.js +3 -0
  71. package/utils/renderSortEnum.js.map +1 -1
  72. package/utils/access.d.ts +0 -8
  73. package/utils/access.js +0 -76
  74. package/utils/access.js.map +0 -1
  75. package/utils/ownership.d.ts +0 -8
  76. package/utils/ownership.js +0 -33
  77. package/utils/ownership.js.map +0 -1
  78. package/utils/permissions.d.ts +0 -7
  79. package/utils/permissions.js +0 -91
  80. package/utils/permissions.js.map +0 -1
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.ModelsPermissions = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _apiSecurity = require("@webiny/api-security");
10
+ class ModelsPermissions extends _apiSecurity.AppPermissions {
11
+ constructor(params) {
12
+ super(params);
13
+ (0, _defineProperty2.default)(this, "modelGroupsPermissions", void 0);
14
+ this.modelGroupsPermissions = params.modelGroupsPermissions;
15
+ }
16
+ async canAccessModel({
17
+ model,
18
+ locale
19
+ }) {
20
+ if (await this.hasFullAccess()) {
21
+ return true;
22
+ }
23
+ const modelGroupsPermissions = this.modelGroupsPermissions;
24
+
25
+ // eslint-disable-next-line
26
+ const modelsPermissions = this;
27
+ const canReadGroups = await modelGroupsPermissions.ensure({
28
+ rwd: "r"
29
+ }, {
30
+ throw: false
31
+ });
32
+ if (!canReadGroups) {
33
+ return false;
34
+ }
35
+ const canReadModels = await modelsPermissions.ensure({
36
+ rwd: "r"
37
+ }, {
38
+ throw: false
39
+ });
40
+ if (!canReadModels) {
41
+ return false;
42
+ }
43
+ const modelGroupsPermissionsList = await modelGroupsPermissions.getPermissions();
44
+ const modelsPermissionsList = await this.getPermissions();
45
+ for (let i = 0; i < modelGroupsPermissionsList.length; i++) {
46
+ const modelGroupPermission = modelGroupsPermissionsList[i];
47
+ const {
48
+ groups
49
+ } = modelGroupPermission;
50
+ for (let j = 0; j < modelsPermissionsList.length; j++) {
51
+ const modelPermission = modelsPermissionsList[j];
52
+ const {
53
+ models
54
+ } = modelPermission;
55
+ // when no models or groups defined on permission
56
+ // it means user has access to everything
57
+ if (!models && !groups) {
58
+ return true;
59
+ }
60
+
61
+ // Does the model belong to a group for which user has permission?
62
+ if (groups) {
63
+ if (Array.isArray(groups[locale]) === false || groups[locale].includes(model.group.id) === false) {
64
+ continue;
65
+ }
66
+ }
67
+
68
+ // Does the user have access to the specific model?
69
+ if (models) {
70
+ if (Array.isArray(models[locale]) === false || models[locale].includes(model.modelId) === false) {
71
+ continue;
72
+ }
73
+ }
74
+ return true;
75
+ }
76
+ }
77
+ return false;
78
+ }
79
+ async ensureCanAccessModel(params) {
80
+ const canAccessModel = await this.canAccessModel(params);
81
+ if (canAccessModel) {
82
+ return;
83
+ }
84
+ throw new _apiSecurity.NotAuthorizedError({
85
+ data: {
86
+ reason: `Not allowed to access model "${params.model.modelId}".`
87
+ }
88
+ });
89
+ }
90
+ }
91
+ exports.ModelsPermissions = ModelsPermissions;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ModelsPermissions","AppPermissions","constructor","params","modelGroupsPermissions","canAccessModel","model","locale","hasFullAccess","modelsPermissions","canReadGroups","ensure","rwd","throw","canReadModels","modelGroupsPermissionsList","getPermissions","modelsPermissionsList","i","length","modelGroupPermission","groups","j","modelPermission","models","Array","isArray","includes","group","id","modelId","ensureCanAccessModel","NotAuthorizedError","data","reason"],"sources":["ModelsPermissions.ts"],"sourcesContent":["import { AppPermissions, AppPermissionsParams, NotAuthorizedError } from \"@webiny/api-security\";\nimport { CmsGroupPermission, CmsModel, CmsModelPermission } from \"~/types\";\nimport { ModelGroupsPermissions } from \"~/utils/permissions/ModelGroupsPermissions\";\n\nexport interface ModelsPermissionsParams extends AppPermissionsParams<CmsGroupPermission> {\n modelGroupsPermissions: ModelGroupsPermissions;\n}\n\nexport interface CanAccessModelParams {\n model: CmsModel;\n locale: string;\n}\n\nexport interface EnsureModelAccessParams {\n model: CmsModel;\n locale: string;\n}\n\nexport class ModelsPermissions extends AppPermissions<CmsModelPermission> {\n private modelGroupsPermissions: ModelGroupsPermissions;\n\n constructor(params: ModelsPermissionsParams) {\n super(params);\n this.modelGroupsPermissions = params.modelGroupsPermissions;\n }\n\n async canAccessModel({ model, locale }: CanAccessModelParams) {\n if (await this.hasFullAccess()) {\n return true;\n }\n\n const modelGroupsPermissions = this.modelGroupsPermissions;\n\n // eslint-disable-next-line\n const modelsPermissions = this;\n\n const canReadGroups = await modelGroupsPermissions.ensure({ rwd: \"r\" }, { throw: false });\n if (!canReadGroups) {\n return false;\n }\n\n const canReadModels = await modelsPermissions.ensure({ rwd: \"r\" }, { throw: false });\n if (!canReadModels) {\n return false;\n }\n\n const modelGroupsPermissionsList = await modelGroupsPermissions.getPermissions();\n const modelsPermissionsList = await this.getPermissions();\n\n for (let i = 0; i < modelGroupsPermissionsList.length; i++) {\n const modelGroupPermission = modelGroupsPermissionsList[i];\n\n const { groups } = modelGroupPermission;\n\n for (let j = 0; j < modelsPermissionsList.length; j++) {\n const modelPermission = modelsPermissionsList[j];\n\n const { models } = modelPermission;\n // when no models or groups defined on permission\n // it means user has access to everything\n if (!models && !groups) {\n return true;\n }\n\n // Does the model belong to a group for which user has permission?\n if (groups) {\n if (\n Array.isArray(groups[locale]) === false ||\n groups[locale].includes(model.group.id) === false\n ) {\n continue;\n }\n }\n\n // Does the user have access to the specific model?\n if (models) {\n if (\n Array.isArray(models[locale]) === false ||\n models[locale].includes(model.modelId) === false\n ) {\n continue;\n }\n }\n\n return true;\n }\n }\n\n return false;\n }\n\n async ensureCanAccessModel(params: EnsureModelAccessParams) {\n const canAccessModel = await this.canAccessModel(params);\n if (canAccessModel) {\n return;\n }\n\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access model \"${params.model.modelId}\".`\n }\n });\n }\n}\n"],"mappings":";;;;;;;;AAAA;AAkBO,MAAMA,iBAAiB,SAASC,2BAAc,CAAqB;EAGtEC,WAAW,CAACC,MAA+B,EAAE;IACzC,KAAK,CAACA,MAAM,CAAC;IAAC;IACd,IAAI,CAACC,sBAAsB,GAAGD,MAAM,CAACC,sBAAsB;EAC/D;EAEA,MAAMC,cAAc,CAAC;IAAEC,KAAK;IAAEC;EAA6B,CAAC,EAAE;IAC1D,IAAI,MAAM,IAAI,CAACC,aAAa,EAAE,EAAE;MAC5B,OAAO,IAAI;IACf;IAEA,MAAMJ,sBAAsB,GAAG,IAAI,CAACA,sBAAsB;;IAE1D;IACA,MAAMK,iBAAiB,GAAG,IAAI;IAE9B,MAAMC,aAAa,GAAG,MAAMN,sBAAsB,CAACO,MAAM,CAAC;MAAEC,GAAG,EAAE;IAAI,CAAC,EAAE;MAAEC,KAAK,EAAE;IAAM,CAAC,CAAC;IACzF,IAAI,CAACH,aAAa,EAAE;MAChB,OAAO,KAAK;IAChB;IAEA,MAAMI,aAAa,GAAG,MAAML,iBAAiB,CAACE,MAAM,CAAC;MAAEC,GAAG,EAAE;IAAI,CAAC,EAAE;MAAEC,KAAK,EAAE;IAAM,CAAC,CAAC;IACpF,IAAI,CAACC,aAAa,EAAE;MAChB,OAAO,KAAK;IAChB;IAEA,MAAMC,0BAA0B,GAAG,MAAMX,sBAAsB,CAACY,cAAc,EAAE;IAChF,MAAMC,qBAAqB,GAAG,MAAM,IAAI,CAACD,cAAc,EAAE;IAEzD,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,0BAA0B,CAACI,MAAM,EAAED,CAAC,EAAE,EAAE;MACxD,MAAME,oBAAoB,GAAGL,0BAA0B,CAACG,CAAC,CAAC;MAE1D,MAAM;QAAEG;MAAO,CAAC,GAAGD,oBAAoB;MAEvC,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,qBAAqB,CAACE,MAAM,EAAEG,CAAC,EAAE,EAAE;QACnD,MAAMC,eAAe,GAAGN,qBAAqB,CAACK,CAAC,CAAC;QAEhD,MAAM;UAAEE;QAAO,CAAC,GAAGD,eAAe;QAClC;QACA;QACA,IAAI,CAACC,MAAM,IAAI,CAACH,MAAM,EAAE;UACpB,OAAO,IAAI;QACf;;QAEA;QACA,IAAIA,MAAM,EAAE;UACR,IACII,KAAK,CAACC,OAAO,CAACL,MAAM,CAACd,MAAM,CAAC,CAAC,KAAK,KAAK,IACvCc,MAAM,CAACd,MAAM,CAAC,CAACoB,QAAQ,CAACrB,KAAK,CAACsB,KAAK,CAACC,EAAE,CAAC,KAAK,KAAK,EACnD;YACE;UACJ;QACJ;;QAEA;QACA,IAAIL,MAAM,EAAE;UACR,IACIC,KAAK,CAACC,OAAO,CAACF,MAAM,CAACjB,MAAM,CAAC,CAAC,KAAK,KAAK,IACvCiB,MAAM,CAACjB,MAAM,CAAC,CAACoB,QAAQ,CAACrB,KAAK,CAACwB,OAAO,CAAC,KAAK,KAAK,EAClD;YACE;UACJ;QACJ;QAEA,OAAO,IAAI;MACf;IACJ;IAEA,OAAO,KAAK;EAChB;EAEA,MAAMC,oBAAoB,CAAC5B,MAA+B,EAAE;IACxD,MAAME,cAAc,GAAG,MAAM,IAAI,CAACA,cAAc,CAACF,MAAM,CAAC;IACxD,IAAIE,cAAc,EAAE;MAChB;IACJ;IAEA,MAAM,IAAI2B,+BAAkB,CAAC;MACzBC,IAAI,EAAE;QACFC,MAAM,EAAG,gCAA+B/B,MAAM,CAACG,KAAK,CAACwB,OAAQ;MACjE;IACJ,CAAC,CAAC;EACN;AACJ;AAAC"}
@@ -0,0 +1,4 @@
1
+ import { CmsSettingsPermission } from "../../types";
2
+ import { AppPermissions } from "@webiny/api-security";
3
+ export declare class SettingsPermissions extends AppPermissions<CmsSettingsPermission> {
4
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SettingsPermissions = void 0;
7
+ var _apiSecurity = require("@webiny/api-security");
8
+ class SettingsPermissions extends _apiSecurity.AppPermissions {}
9
+ exports.SettingsPermissions = SettingsPermissions;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SettingsPermissions","AppPermissions"],"sources":["SettingsPermissions.ts"],"sourcesContent":["import { CmsSettingsPermission } from \"~/types\";\nimport { AppPermissions } from \"@webiny/api-security\";\n\nexport class SettingsPermissions extends AppPermissions<CmsSettingsPermission> {}\n"],"mappings":";;;;;;AACA;AAEO,MAAMA,mBAAmB,SAASC,2BAAc,CAAwB;AAAE"}
@@ -4,6 +4,7 @@ interface RenderListFilterFieldsParams {
4
4
  fields: CmsModelField[];
5
5
  type: ApiEndpoint;
6
6
  fieldTypePlugins: CmsFieldTypePlugins;
7
+ excludeFields?: string[];
7
8
  }
8
9
  interface RenderListFilterFields {
9
10
  (params: RenderListFilterFieldsParams): string;
@@ -10,15 +10,21 @@ const renderListFilterFields = params => {
10
10
  model,
11
11
  fields,
12
12
  type,
13
- fieldTypePlugins
13
+ fieldTypePlugins,
14
+ excludeFields = []
14
15
  } = params;
15
- const result = [["id: ID", "id_not: ID", "id_in: [ID!]", "id_not_in: [ID!]", "entryId: String", "entryId_not: String", "entryId_in: [String!]", "entryId_not_in: [String!]", "createdOn: DateTime", "createdOn_gt: DateTime", "createdOn_gte: DateTime", "createdOn_lt: DateTime", "createdOn_lte: DateTime", "createdOn_between: [DateTime!]", "createdOn_not_between: [DateTime!]", "savedOn: DateTime", "savedOn_gt: DateTime", "savedOn_gte: DateTime", "savedOn_lt: DateTime", "savedOn_lte: DateTime", "savedOn_between: [DateTime!]", "savedOn_not_between: [DateTime!]", "createdBy: String", "createdBy_not: String", "createdBy_in: [String!]", "createdBy_not_in: [String!]", "ownedBy: String", "ownedBy_not: String", "ownedBy_in: [String!]", "ownedBy_not_in: [String!]"].join("\n")];
16
+ const result = ["id: ID", "id_not: ID", "id_in: [ID!]", "id_not_in: [ID!]", "entryId: String", "entryId_not: String", "entryId_in: [String!]", "entryId_not_in: [String!]", "createdOn: DateTime", "createdOn_gt: DateTime", "createdOn_gte: DateTime", "createdOn_lt: DateTime", "createdOn_lte: DateTime", "createdOn_between: [DateTime!]", "createdOn_not_between: [DateTime!]", "savedOn: DateTime", "savedOn_gt: DateTime", "savedOn_gte: DateTime", "savedOn_lt: DateTime", "savedOn_lte: DateTime", "savedOn_between: [DateTime!]", "savedOn_not_between: [DateTime!]", "createdBy: String", "createdBy_not: String", "createdBy_in: [String!]", "createdBy_not_in: [String!]", "ownedBy: String", "ownedBy_not: String", "ownedBy_in: [String!]", "ownedBy_not_in: [String!]"];
16
17
  /**
17
18
  * We can find different statuses only in the manage API endpoint.
18
19
  */
19
20
  if (type === "manage") {
20
21
  result.push("status: String", "status_not: String", "status_in: [String!]", "status_not_in: [String!]");
21
22
  }
23
+ const finalFields = result.filter(field => {
24
+ return !excludeFields.some(excl => {
25
+ return field.startsWith(`${excl}_`) || field.startsWith(`${excl}: `);
26
+ });
27
+ });
22
28
  for (const field of fields) {
23
29
  var _fieldTypePlugins$bas, _fieldTypePlugins$bas2;
24
30
  // Every time a client updates content model's fields, we check the type of each field. If a field plugin
@@ -31,12 +37,12 @@ const renderListFilterFields = params => {
31
37
  if (typeof createListFilters !== "function") {
32
38
  continue;
33
39
  }
34
- result.push(createListFilters({
40
+ finalFields.push(createListFilters({
35
41
  model,
36
42
  field,
37
43
  plugins: fieldTypePlugins
38
44
  }));
39
45
  }
40
- return result.filter(Boolean).join("\n");
46
+ return finalFields.filter(Boolean).join("\n");
41
47
  };
42
48
  exports.renderListFilterFields = renderListFilterFields;
@@ -1 +1 @@
1
- {"version":3,"names":["renderListFilterFields","params","model","fields","type","fieldTypePlugins","result","join","push","field","baseType","getBaseFieldType","createListFilters","plugins","filter","Boolean"],"sources":["renderListFilterFields.ts"],"sourcesContent":["import {\n ApiEndpoint,\n CmsFieldTypePlugins,\n CmsModel,\n CmsModelField,\n CmsModelFieldToGraphQLPlugin\n} from \"~/types\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType\";\n\ninterface RenderListFilterFieldsParams {\n model: CmsModel;\n fields: CmsModelField[];\n type: ApiEndpoint;\n fieldTypePlugins: CmsFieldTypePlugins;\n}\ninterface RenderListFilterFields {\n (params: RenderListFilterFieldsParams): string;\n}\n\ntype CreateListFiltersType =\n | CmsModelFieldToGraphQLPlugin[\"read\"][\"createListFilters\"]\n | CmsModelFieldToGraphQLPlugin[\"manage\"][\"createListFilters\"];\n\nexport const renderListFilterFields: RenderListFilterFields = (params): string => {\n const { model, fields, type, fieldTypePlugins } = params;\n const result: string[] = [\n [\n \"id: ID\",\n \"id_not: ID\",\n \"id_in: [ID!]\",\n \"id_not_in: [ID!]\",\n \"entryId: String\",\n \"entryId_not: String\",\n \"entryId_in: [String!]\",\n \"entryId_not_in: [String!]\",\n \"createdOn: DateTime\",\n \"createdOn_gt: DateTime\",\n \"createdOn_gte: DateTime\",\n \"createdOn_lt: DateTime\",\n \"createdOn_lte: DateTime\",\n \"createdOn_between: [DateTime!]\",\n \"createdOn_not_between: [DateTime!]\",\n \"savedOn: DateTime\",\n \"savedOn_gt: DateTime\",\n \"savedOn_gte: DateTime\",\n \"savedOn_lt: DateTime\",\n \"savedOn_lte: DateTime\",\n \"savedOn_between: [DateTime!]\",\n \"savedOn_not_between: [DateTime!]\",\n \"createdBy: String\",\n \"createdBy_not: String\",\n \"createdBy_in: [String!]\",\n \"createdBy_not_in: [String!]\",\n \"ownedBy: String\",\n \"ownedBy_not: String\",\n \"ownedBy_in: [String!]\",\n \"ownedBy_not_in: [String!]\"\n ].join(\"\\n\")\n ];\n /**\n * We can find different statuses only in the manage API endpoint.\n */\n if (type === \"manage\") {\n result.push(\n \"status: String\",\n \"status_not: String\",\n \"status_in: [String!]\",\n \"status_not_in: [String!]\"\n );\n }\n\n for (const field of fields) {\n // Every time a client updates content model's fields, we check the type of each field. If a field plugin\n // for a particular \"field.type\" doesn't exist on the backend yet, we throw an error. But still, we also\n // want to be careful when accessing the field plugin here too. It is still possible to have a content model\n // that contains a field, for which we don't have a plugin registered on the backend. For example, user\n // could've just removed the plugin from the backend.\n const baseType = getBaseFieldType(field);\n const createListFilters: CreateListFiltersType | undefined =\n fieldTypePlugins[baseType]?.[type]?.createListFilters;\n if (typeof createListFilters !== \"function\") {\n continue;\n }\n result.push(createListFilters({ model, field, plugins: fieldTypePlugins }));\n }\n\n return result.filter(Boolean).join(\"\\n\");\n};\n"],"mappings":";;;;;;AAOA;AAgBO,MAAMA,sBAA8C,GAAIC,MAAM,IAAa;EAC9E,MAAM;IAAEC,KAAK;IAAEC,MAAM;IAAEC,IAAI;IAAEC;EAAiB,CAAC,GAAGJ,MAAM;EACxD,MAAMK,MAAgB,GAAG,CACrB,CACI,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,oCAAoC,EACpC,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,8BAA8B,EAC9B,kCAAkC,EAClC,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,CAC9B,CAACC,IAAI,CAAC,IAAI,CAAC,CACf;EACD;AACJ;AACA;EACI,IAAIH,IAAI,KAAK,QAAQ,EAAE;IACnBE,MAAM,CAACE,IAAI,CACP,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,CAC7B;EACL;EAEA,KAAK,MAAMC,KAAK,IAAIN,MAAM,EAAE;IAAA;IACxB;IACA;IACA;IACA;IACA;IACA,MAAMO,QAAQ,GAAG,IAAAC,kCAAgB,EAACF,KAAK,CAAC;IACxC,MAAMG,iBAAoD,4BACtDP,gBAAgB,CAACK,QAAQ,CAAC,oFAA1B,sBAA6BN,IAAI,CAAC,2DAAlC,uBAAoCQ,iBAAiB;IACzD,IAAI,OAAOA,iBAAiB,KAAK,UAAU,EAAE;MACzC;IACJ;IACAN,MAAM,CAACE,IAAI,CAACI,iBAAiB,CAAC;MAAEV,KAAK;MAAEO,KAAK;MAAEI,OAAO,EAAER;IAAiB,CAAC,CAAC,CAAC;EAC/E;EAEA,OAAOC,MAAM,CAACQ,MAAM,CAACC,OAAO,CAAC,CAACR,IAAI,CAAC,IAAI,CAAC;AAC5C,CAAC;AAAC"}
1
+ {"version":3,"names":["renderListFilterFields","params","model","fields","type","fieldTypePlugins","excludeFields","result","push","finalFields","filter","field","some","excl","startsWith","baseType","getBaseFieldType","createListFilters","plugins","Boolean","join"],"sources":["renderListFilterFields.ts"],"sourcesContent":["import {\n ApiEndpoint,\n CmsFieldTypePlugins,\n CmsModel,\n CmsModelField,\n CmsModelFieldToGraphQLPlugin\n} from \"~/types\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType\";\n\ninterface RenderListFilterFieldsParams {\n model: CmsModel;\n fields: CmsModelField[];\n type: ApiEndpoint;\n fieldTypePlugins: CmsFieldTypePlugins;\n excludeFields?: string[];\n}\ninterface RenderListFilterFields {\n (params: RenderListFilterFieldsParams): string;\n}\n\ntype CreateListFiltersType =\n | CmsModelFieldToGraphQLPlugin[\"read\"][\"createListFilters\"]\n | CmsModelFieldToGraphQLPlugin[\"manage\"][\"createListFilters\"];\n\nexport const renderListFilterFields: RenderListFilterFields = (params): string => {\n const { model, fields, type, fieldTypePlugins, excludeFields = [] } = params;\n const result: string[] = [\n \"id: ID\",\n \"id_not: ID\",\n \"id_in: [ID!]\",\n \"id_not_in: [ID!]\",\n \"entryId: String\",\n \"entryId_not: String\",\n \"entryId_in: [String!]\",\n \"entryId_not_in: [String!]\",\n \"createdOn: DateTime\",\n \"createdOn_gt: DateTime\",\n \"createdOn_gte: DateTime\",\n \"createdOn_lt: DateTime\",\n \"createdOn_lte: DateTime\",\n \"createdOn_between: [DateTime!]\",\n \"createdOn_not_between: [DateTime!]\",\n \"savedOn: DateTime\",\n \"savedOn_gt: DateTime\",\n \"savedOn_gte: DateTime\",\n \"savedOn_lt: DateTime\",\n \"savedOn_lte: DateTime\",\n \"savedOn_between: [DateTime!]\",\n \"savedOn_not_between: [DateTime!]\",\n \"createdBy: String\",\n \"createdBy_not: String\",\n \"createdBy_in: [String!]\",\n \"createdBy_not_in: [String!]\",\n \"ownedBy: String\",\n \"ownedBy_not: String\",\n \"ownedBy_in: [String!]\",\n \"ownedBy_not_in: [String!]\"\n ];\n /**\n * We can find different statuses only in the manage API endpoint.\n */\n if (type === \"manage\") {\n result.push(\n \"status: String\",\n \"status_not: String\",\n \"status_in: [String!]\",\n \"status_not_in: [String!]\"\n );\n }\n\n const finalFields = result.filter(field => {\n return !excludeFields.some(excl => {\n return field.startsWith(`${excl}_`) || field.startsWith(`${excl}: `);\n });\n });\n\n for (const field of fields) {\n // Every time a client updates content model's fields, we check the type of each field. If a field plugin\n // for a particular \"field.type\" doesn't exist on the backend yet, we throw an error. But still, we also\n // want to be careful when accessing the field plugin here too. It is still possible to have a content model\n // that contains a field, for which we don't have a plugin registered on the backend. For example, user\n // could've just removed the plugin from the backend.\n const baseType = getBaseFieldType(field);\n const createListFilters: CreateListFiltersType | undefined =\n fieldTypePlugins[baseType]?.[type]?.createListFilters;\n if (typeof createListFilters !== \"function\") {\n continue;\n }\n finalFields.push(createListFilters({ model, field, plugins: fieldTypePlugins }));\n }\n\n return finalFields.filter(Boolean).join(\"\\n\");\n};\n"],"mappings":";;;;;;AAOA;AAiBO,MAAMA,sBAA8C,GAAIC,MAAM,IAAa;EAC9E,MAAM;IAAEC,KAAK;IAAEC,MAAM;IAAEC,IAAI;IAAEC,gBAAgB;IAAEC,aAAa,GAAG;EAAG,CAAC,GAAGL,MAAM;EAC5E,MAAMM,MAAgB,GAAG,CACrB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,oCAAoC,EACpC,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,8BAA8B,EAC9B,kCAAkC,EAClC,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,CAC9B;EACD;AACJ;AACA;EACI,IAAIH,IAAI,KAAK,QAAQ,EAAE;IACnBG,MAAM,CAACC,IAAI,CACP,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,CAC7B;EACL;EAEA,MAAMC,WAAW,GAAGF,MAAM,CAACG,MAAM,CAACC,KAAK,IAAI;IACvC,OAAO,CAACL,aAAa,CAACM,IAAI,CAACC,IAAI,IAAI;MAC/B,OAAOF,KAAK,CAACG,UAAU,CAAE,GAAED,IAAK,GAAE,CAAC,IAAIF,KAAK,CAACG,UAAU,CAAE,GAAED,IAAK,IAAG,CAAC;IACxE,CAAC,CAAC;EACN,CAAC,CAAC;EAEF,KAAK,MAAMF,KAAK,IAAIR,MAAM,EAAE;IAAA;IACxB;IACA;IACA;IACA;IACA;IACA,MAAMY,QAAQ,GAAG,IAAAC,kCAAgB,EAACL,KAAK,CAAC;IACxC,MAAMM,iBAAoD,4BACtDZ,gBAAgB,CAACU,QAAQ,CAAC,oFAA1B,sBAA6BX,IAAI,CAAC,2DAAlC,uBAAoCa,iBAAiB;IACzD,IAAI,OAAOA,iBAAiB,KAAK,UAAU,EAAE;MACzC;IACJ;IACAR,WAAW,CAACD,IAAI,CAACS,iBAAiB,CAAC;MAAEf,KAAK;MAAES,KAAK;MAAEO,OAAO,EAAEb;IAAiB,CAAC,CAAC,CAAC;EACpF;EAEA,OAAOI,WAAW,CAACC,MAAM,CAACS,OAAO,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;AACjD,CAAC;AAAC"}
@@ -4,7 +4,7 @@ interface RenderSortEnumParams {
4
4
  model: CmsModel;
5
5
  fields: CmsModelField[];
6
6
  fieldTypePlugins: CmsFieldTypePlugins;
7
- sorterPlugins: CmsGraphQLSchemaSorterPlugin[];
7
+ sorterPlugins?: CmsGraphQLSchemaSorterPlugin[];
8
8
  }
9
9
  interface RenderSortEnum {
10
10
  (params: RenderSortEnumParams): string;
@@ -33,6 +33,9 @@ const renderSortEnum = ({
33
33
  sorters.push(`${field.fieldId}_ASC`);
34
34
  sorters.push(`${field.fieldId}_DESC`);
35
35
  }
36
+ if (!sorterPlugins) {
37
+ return sorters.join("\n");
38
+ }
36
39
  return sorterPlugins.reduce((result, plugin) => {
37
40
  return plugin.createSorter({
38
41
  model,
@@ -1 +1 @@
1
- {"version":3,"names":["renderSortEnum","model","fields","fieldTypePlugins","sorterPlugins","sorters","field","plugin","getBaseFieldType","createSorters","result","isSortable","push","fieldId","reduce","createSorter","join"],"sources":["renderSortEnum.ts"],"sourcesContent":["import { CmsFieldTypePlugins, CmsModel, CmsModelField } from \"~/types\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType\";\nimport { CmsGraphQLSchemaSorterPlugin } from \"~/plugins/CmsGraphQLSchemaSorterPlugin\";\n\ninterface RenderSortEnumParams {\n model: CmsModel;\n fields: CmsModelField[];\n fieldTypePlugins: CmsFieldTypePlugins;\n sorterPlugins: CmsGraphQLSchemaSorterPlugin[];\n}\ninterface RenderSortEnum {\n (params: RenderSortEnumParams): string;\n}\n\nexport const renderSortEnum: RenderSortEnum = ({\n model,\n fields,\n fieldTypePlugins,\n sorterPlugins\n}): string => {\n let sorters: string[] = [\n `id_ASC`,\n `id_DESC`,\n \"savedOn_ASC\",\n \"savedOn_DESC\",\n \"createdOn_ASC\",\n \"createdOn_DESC\"\n ];\n\n for (const field of fields) {\n const plugin = fieldTypePlugins[getBaseFieldType(field)];\n if (!plugin) {\n continue;\n } else if (plugin.createSorters) {\n const result = plugin.createSorters({\n model,\n field,\n sorters\n });\n if (result) {\n sorters = result;\n continue;\n }\n }\n if (!plugin.isSortable) {\n continue;\n }\n sorters.push(`${field.fieldId}_ASC`);\n sorters.push(`${field.fieldId}_DESC`);\n }\n\n return sorterPlugins\n .reduce((result, plugin) => {\n return plugin.createSorter({\n model,\n sorters: result\n });\n }, sorters)\n .join(\"\\n\");\n};\n"],"mappings":";;;;;;AACA;AAaO,MAAMA,cAA8B,GAAG,CAAC;EAC3CC,KAAK;EACLC,MAAM;EACNC,gBAAgB;EAChBC;AACJ,CAAC,KAAa;EACV,IAAIC,OAAiB,GAAG,CACnB,QAAO,EACP,SAAQ,EACT,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,CACnB;EAED,KAAK,MAAMC,KAAK,IAAIJ,MAAM,EAAE;IACxB,MAAMK,MAAM,GAAGJ,gBAAgB,CAAC,IAAAK,kCAAgB,EAACF,KAAK,CAAC,CAAC;IACxD,IAAI,CAACC,MAAM,EAAE;MACT;IACJ,CAAC,MAAM,IAAIA,MAAM,CAACE,aAAa,EAAE;MAC7B,MAAMC,MAAM,GAAGH,MAAM,CAACE,aAAa,CAAC;QAChCR,KAAK;QACLK,KAAK;QACLD;MACJ,CAAC,CAAC;MACF,IAAIK,MAAM,EAAE;QACRL,OAAO,GAAGK,MAAM;QAChB;MACJ;IACJ;IACA,IAAI,CAACH,MAAM,CAACI,UAAU,EAAE;MACpB;IACJ;IACAN,OAAO,CAACO,IAAI,CAAE,GAAEN,KAAK,CAACO,OAAQ,MAAK,CAAC;IACpCR,OAAO,CAACO,IAAI,CAAE,GAAEN,KAAK,CAACO,OAAQ,OAAM,CAAC;EACzC;EAEA,OAAOT,aAAa,CACfU,MAAM,CAAC,CAACJ,MAAM,EAAEH,MAAM,KAAK;IACxB,OAAOA,MAAM,CAACQ,YAAY,CAAC;MACvBd,KAAK;MACLI,OAAO,EAAEK;IACb,CAAC,CAAC;EACN,CAAC,EAAEL,OAAO,CAAC,CACVW,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAAC"}
1
+ {"version":3,"names":["renderSortEnum","model","fields","fieldTypePlugins","sorterPlugins","sorters","field","plugin","getBaseFieldType","createSorters","result","isSortable","push","fieldId","join","reduce","createSorter"],"sources":["renderSortEnum.ts"],"sourcesContent":["import { CmsFieldTypePlugins, CmsModel, CmsModelField } from \"~/types\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType\";\nimport { CmsGraphQLSchemaSorterPlugin } from \"~/plugins/CmsGraphQLSchemaSorterPlugin\";\n\ninterface RenderSortEnumParams {\n model: CmsModel;\n fields: CmsModelField[];\n fieldTypePlugins: CmsFieldTypePlugins;\n sorterPlugins?: CmsGraphQLSchemaSorterPlugin[];\n}\ninterface RenderSortEnum {\n (params: RenderSortEnumParams): string;\n}\n\nexport const renderSortEnum: RenderSortEnum = ({\n model,\n fields,\n fieldTypePlugins,\n sorterPlugins\n}): string => {\n let sorters: string[] = [\n `id_ASC`,\n `id_DESC`,\n \"savedOn_ASC\",\n \"savedOn_DESC\",\n \"createdOn_ASC\",\n \"createdOn_DESC\"\n ];\n\n for (const field of fields) {\n const plugin = fieldTypePlugins[getBaseFieldType(field)];\n if (!plugin) {\n continue;\n } else if (plugin.createSorters) {\n const result = plugin.createSorters({\n model,\n field,\n sorters\n });\n if (result) {\n sorters = result;\n continue;\n }\n }\n if (!plugin.isSortable) {\n continue;\n }\n sorters.push(`${field.fieldId}_ASC`);\n sorters.push(`${field.fieldId}_DESC`);\n }\n if (!sorterPlugins) {\n return sorters.join(\"\\n\");\n }\n\n return sorterPlugins\n .reduce((result, plugin) => {\n return plugin.createSorter({\n model,\n sorters: result\n });\n }, sorters)\n .join(\"\\n\");\n};\n"],"mappings":";;;;;;AACA;AAaO,MAAMA,cAA8B,GAAG,CAAC;EAC3CC,KAAK;EACLC,MAAM;EACNC,gBAAgB;EAChBC;AACJ,CAAC,KAAa;EACV,IAAIC,OAAiB,GAAG,CACnB,QAAO,EACP,SAAQ,EACT,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,CACnB;EAED,KAAK,MAAMC,KAAK,IAAIJ,MAAM,EAAE;IACxB,MAAMK,MAAM,GAAGJ,gBAAgB,CAAC,IAAAK,kCAAgB,EAACF,KAAK,CAAC,CAAC;IACxD,IAAI,CAACC,MAAM,EAAE;MACT;IACJ,CAAC,MAAM,IAAIA,MAAM,CAACE,aAAa,EAAE;MAC7B,MAAMC,MAAM,GAAGH,MAAM,CAACE,aAAa,CAAC;QAChCR,KAAK;QACLK,KAAK;QACLD;MACJ,CAAC,CAAC;MACF,IAAIK,MAAM,EAAE;QACRL,OAAO,GAAGK,MAAM;QAChB;MACJ;IACJ;IACA,IAAI,CAACH,MAAM,CAACI,UAAU,EAAE;MACpB;IACJ;IACAN,OAAO,CAACO,IAAI,CAAE,GAAEN,KAAK,CAACO,OAAQ,MAAK,CAAC;IACpCR,OAAO,CAACO,IAAI,CAAE,GAAEN,KAAK,CAACO,OAAQ,OAAM,CAAC;EACzC;EACA,IAAI,CAACT,aAAa,EAAE;IAChB,OAAOC,OAAO,CAACS,IAAI,CAAC,IAAI,CAAC;EAC7B;EAEA,OAAOV,aAAa,CACfW,MAAM,CAAC,CAACL,MAAM,EAAEH,MAAM,KAAK;IACxB,OAAOA,MAAM,CAACS,YAAY,CAAC;MACvBf,KAAK;MACLI,OAAO,EAAEK;IACb,CAAC,CAAC;EACN,CAAC,EAAEL,OAAO,CAAC,CACVS,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAAC"}
package/utils/access.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import { CmsContext, CmsGroup, CmsGroupPermission, CmsModel } from "../types";
2
- export declare const validateGroupAccess: (context: CmsContext, permission: CmsGroupPermission, group: CmsGroup) => boolean;
3
- export declare const validateModelAccess: (context: CmsContext, model: CmsModel) => Promise<boolean>;
4
- /**
5
- * model access is checking for both specific model or group access
6
- * if permission has specific models set as access pattern then groups will not matter (although both can be set)
7
- */
8
- export declare const checkModelAccess: (context: CmsContext, model: CmsModel) => Promise<void>;
package/utils/access.js DELETED
@@ -1,76 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.validateModelAccess = exports.validateGroupAccess = exports.checkModelAccess = void 0;
7
- var _apiSecurity = require("@webiny/api-security");
8
- var _permissions = require("./permissions");
9
- const validateGroupAccess = (context, permission, group) => {
10
- const {
11
- groups
12
- } = permission;
13
- // when no groups defined on permission
14
- // it means user has access to everything
15
- if (!groups) {
16
- return true;
17
- }
18
- const locale = context.cms.getLocale().code;
19
- // when there is no locale in groups, it means that no access was given
20
- // this happens when access control was set but no models or groups were added
21
- if (Array.isArray(groups[locale]) === false || groups[locale].includes(group.id) === false) {
22
- return false;
23
- }
24
- return true;
25
- };
26
- exports.validateGroupAccess = validateGroupAccess;
27
- const validateModelAccess = async (context, model) => {
28
- const modelGroupPermission = await (0, _permissions.checkPermissions)(context, "cms.contentModelGroup", {
29
- rwd: "r"
30
- });
31
- const {
32
- groups
33
- } = modelGroupPermission;
34
- const modelPermission = await (0, _permissions.checkPermissions)(context, "cms.contentModel", {
35
- rwd: "r"
36
- });
37
- const {
38
- models
39
- } = modelPermission;
40
- // when no models or groups defined on permission
41
- // it means user has access to everything
42
- if (!models && !groups) {
43
- return true;
44
- }
45
- const locale = context.cms.getLocale().code;
46
- // Check whether the model is question belongs to "content model groups" for which user has permission.
47
- if (groups) {
48
- if (Array.isArray(groups[locale]) === false || groups[locale].includes(model.group.id) === false) {
49
- return false;
50
- }
51
- }
52
- // Check whether the model is question belongs to "content models" for which user has permission.
53
- if (models) {
54
- if (Array.isArray(models[locale]) === false || models[locale].includes(model.modelId) === false) {
55
- return false;
56
- }
57
- }
58
- return true;
59
- };
60
-
61
- /**
62
- * model access is checking for both specific model or group access
63
- * if permission has specific models set as access pattern then groups will not matter (although both can be set)
64
- */
65
- exports.validateModelAccess = validateModelAccess;
66
- const checkModelAccess = async (context, model) => {
67
- if (await validateModelAccess(context, model)) {
68
- return;
69
- }
70
- throw new _apiSecurity.NotAuthorizedError({
71
- data: {
72
- reason: `Not allowed to access model "${model.modelId}".`
73
- }
74
- });
75
- };
76
- exports.checkModelAccess = checkModelAccess;
@@ -1 +0,0 @@
1
- {"version":3,"names":["validateGroupAccess","context","permission","group","groups","locale","cms","getLocale","code","Array","isArray","includes","id","validateModelAccess","model","modelGroupPermission","checkPermissions","rwd","modelPermission","models","modelId","checkModelAccess","NotAuthorizedError","data","reason"],"sources":["access.ts"],"sourcesContent":["import { NotAuthorizedError } from \"@webiny/api-security\";\nimport { CmsContext, CmsGroup, CmsGroupPermission, CmsModel, CmsModelPermission } from \"~/types\";\nimport { checkPermissions } from \"./permissions\";\n\nexport const validateGroupAccess = (\n context: CmsContext,\n permission: CmsGroupPermission,\n group: CmsGroup\n): boolean => {\n const { groups } = permission;\n // when no groups defined on permission\n // it means user has access to everything\n if (!groups) {\n return true;\n }\n const locale = context.cms.getLocale().code;\n // when there is no locale in groups, it means that no access was given\n // this happens when access control was set but no models or groups were added\n if (Array.isArray(groups[locale]) === false || groups[locale].includes(group.id) === false) {\n return false;\n }\n return true;\n};\n\nexport const validateModelAccess = async (\n context: CmsContext,\n model: CmsModel\n): Promise<boolean> => {\n const modelGroupPermission: CmsGroupPermission = await checkPermissions(\n context,\n \"cms.contentModelGroup\",\n { rwd: \"r\" }\n );\n const { groups } = modelGroupPermission;\n\n const modelPermission: CmsModelPermission = await checkPermissions(\n context,\n \"cms.contentModel\",\n {\n rwd: \"r\"\n }\n );\n const { models } = modelPermission;\n // when no models or groups defined on permission\n // it means user has access to everything\n if (!models && !groups) {\n return true;\n }\n const locale = context.cms.getLocale().code;\n // Check whether the model is question belongs to \"content model groups\" for which user has permission.\n if (groups) {\n if (\n Array.isArray(groups[locale]) === false ||\n groups[locale].includes(model.group.id) === false\n ) {\n return false;\n }\n }\n // Check whether the model is question belongs to \"content models\" for which user has permission.\n if (models) {\n if (\n Array.isArray(models[locale]) === false ||\n models[locale].includes(model.modelId) === false\n ) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * model access is checking for both specific model or group access\n * if permission has specific models set as access pattern then groups will not matter (although both can be set)\n */\nexport const checkModelAccess = async (context: CmsContext, model: CmsModel): Promise<void> => {\n if (await validateModelAccess(context, model)) {\n return;\n }\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access model \"${model.modelId}\".`\n }\n });\n};\n"],"mappings":";;;;;;AAAA;AAEA;AAEO,MAAMA,mBAAmB,GAAG,CAC/BC,OAAmB,EACnBC,UAA8B,EAC9BC,KAAe,KACL;EACV,MAAM;IAAEC;EAAO,CAAC,GAAGF,UAAU;EAC7B;EACA;EACA,IAAI,CAACE,MAAM,EAAE;IACT,OAAO,IAAI;EACf;EACA,MAAMC,MAAM,GAAGJ,OAAO,CAACK,GAAG,CAACC,SAAS,EAAE,CAACC,IAAI;EAC3C;EACA;EACA,IAAIC,KAAK,CAACC,OAAO,CAACN,MAAM,CAACC,MAAM,CAAC,CAAC,KAAK,KAAK,IAAID,MAAM,CAACC,MAAM,CAAC,CAACM,QAAQ,CAACR,KAAK,CAACS,EAAE,CAAC,KAAK,KAAK,EAAE;IACxF,OAAO,KAAK;EAChB;EACA,OAAO,IAAI;AACf,CAAC;AAAC;AAEK,MAAMC,mBAAmB,GAAG,OAC/BZ,OAAmB,EACnBa,KAAe,KACI;EACnB,MAAMC,oBAAwC,GAAG,MAAM,IAAAC,6BAAgB,EACnEf,OAAO,EACP,uBAAuB,EACvB;IAAEgB,GAAG,EAAE;EAAI,CAAC,CACf;EACD,MAAM;IAAEb;EAAO,CAAC,GAAGW,oBAAoB;EAEvC,MAAMG,eAAmC,GAAG,MAAM,IAAAF,6BAAgB,EAC9Df,OAAO,EACP,kBAAkB,EAClB;IACIgB,GAAG,EAAE;EACT,CAAC,CACJ;EACD,MAAM;IAAEE;EAAO,CAAC,GAAGD,eAAe;EAClC;EACA;EACA,IAAI,CAACC,MAAM,IAAI,CAACf,MAAM,EAAE;IACpB,OAAO,IAAI;EACf;EACA,MAAMC,MAAM,GAAGJ,OAAO,CAACK,GAAG,CAACC,SAAS,EAAE,CAACC,IAAI;EAC3C;EACA,IAAIJ,MAAM,EAAE;IACR,IACIK,KAAK,CAACC,OAAO,CAACN,MAAM,CAACC,MAAM,CAAC,CAAC,KAAK,KAAK,IACvCD,MAAM,CAACC,MAAM,CAAC,CAACM,QAAQ,CAACG,KAAK,CAACX,KAAK,CAACS,EAAE,CAAC,KAAK,KAAK,EACnD;MACE,OAAO,KAAK;IAChB;EACJ;EACA;EACA,IAAIO,MAAM,EAAE;IACR,IACIV,KAAK,CAACC,OAAO,CAACS,MAAM,CAACd,MAAM,CAAC,CAAC,KAAK,KAAK,IACvCc,MAAM,CAACd,MAAM,CAAC,CAACM,QAAQ,CAACG,KAAK,CAACM,OAAO,CAAC,KAAK,KAAK,EAClD;MACE,OAAO,KAAK;IAChB;EACJ;EAEA,OAAO,IAAI;AACf,CAAC;;AAED;AACA;AACA;AACA;AAHA;AAIO,MAAMC,gBAAgB,GAAG,OAAOpB,OAAmB,EAAEa,KAAe,KAAoB;EAC3F,IAAI,MAAMD,mBAAmB,CAACZ,OAAO,EAAEa,KAAK,CAAC,EAAE;IAC3C;EACJ;EACA,MAAM,IAAIQ,+BAAkB,CAAC;IACzBC,IAAI,EAAE;MACFC,MAAM,EAAG,gCAA+BV,KAAK,CAACM,OAAQ;IAC1D;EACJ,CAAC,CAAC;AACN,CAAC;AAAC"}
@@ -1,8 +0,0 @@
1
- import { BaseCmsSecurityPermission, CmsContext, CmsIdentity } from "../types";
2
- interface OwnableRecord {
3
- createdBy?: CmsIdentity;
4
- ownedBy?: CmsIdentity;
5
- }
6
- export declare const checkOwnership: (context: CmsContext, permission: BaseCmsSecurityPermission, record: OwnableRecord) => void;
7
- export declare const validateOwnership: (context: CmsContext, permission: BaseCmsSecurityPermission, record: OwnableRecord) => boolean;
8
- export {};
@@ -1,33 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.validateOwnership = exports.checkOwnership = void 0;
7
- var _apiSecurity = require("@webiny/api-security");
8
- const checkOwnership = (context, permission, record) => {
9
- var _record$ownedBy, _record$createdBy;
10
- if (!permission.own) {
11
- return;
12
- }
13
- const identity = context.security.getIdentity();
14
- const owner = identity && ((_record$ownedBy = record.ownedBy) === null || _record$ownedBy === void 0 ? void 0 : _record$ownedBy.id) === identity.id;
15
- const creator = identity && ((_record$createdBy = record.createdBy) === null || _record$createdBy === void 0 ? void 0 : _record$createdBy.id) === identity.id;
16
- if (!owner && !creator) {
17
- throw new _apiSecurity.NotAuthorizedError({
18
- data: {
19
- reason: `You are not the owner of the record.`
20
- }
21
- });
22
- }
23
- };
24
- exports.checkOwnership = checkOwnership;
25
- const validateOwnership = (context, permission, record) => {
26
- try {
27
- checkOwnership(context, permission, record);
28
- return true;
29
- } catch {
30
- return false;
31
- }
32
- };
33
- exports.validateOwnership = validateOwnership;
@@ -1 +0,0 @@
1
- {"version":3,"names":["checkOwnership","context","permission","record","own","identity","security","getIdentity","owner","ownedBy","id","creator","createdBy","NotAuthorizedError","data","reason","validateOwnership"],"sources":["ownership.ts"],"sourcesContent":["import { BaseCmsSecurityPermission, CmsContext, CmsIdentity } from \"~/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\ninterface OwnableRecord {\n createdBy?: CmsIdentity;\n ownedBy?: CmsIdentity;\n}\n\nexport const checkOwnership = (\n context: CmsContext,\n permission: BaseCmsSecurityPermission,\n record: OwnableRecord\n): void => {\n if (!permission.own) {\n return;\n }\n\n const identity = context.security.getIdentity();\n const owner = identity && record.ownedBy?.id === identity.id;\n const creator = identity && record.createdBy?.id === identity.id;\n\n if (!owner && !creator) {\n throw new NotAuthorizedError({\n data: {\n reason: `You are not the owner of the record.`\n }\n });\n }\n};\n\nexport const validateOwnership = (\n context: CmsContext,\n permission: BaseCmsSecurityPermission,\n record: OwnableRecord\n): boolean => {\n try {\n checkOwnership(context, permission, record);\n return true;\n } catch {\n return false;\n }\n};\n"],"mappings":";;;;;;AACA;AAOO,MAAMA,cAAc,GAAG,CAC1BC,OAAmB,EACnBC,UAAqC,EACrCC,MAAqB,KACd;EAAA;EACP,IAAI,CAACD,UAAU,CAACE,GAAG,EAAE;IACjB;EACJ;EAEA,MAAMC,QAAQ,GAAGJ,OAAO,CAACK,QAAQ,CAACC,WAAW,EAAE;EAC/C,MAAMC,KAAK,GAAGH,QAAQ,IAAI,oBAAAF,MAAM,CAACM,OAAO,oDAAd,gBAAgBC,EAAE,MAAKL,QAAQ,CAACK,EAAE;EAC5D,MAAMC,OAAO,GAAGN,QAAQ,IAAI,sBAAAF,MAAM,CAACS,SAAS,sDAAhB,kBAAkBF,EAAE,MAAKL,QAAQ,CAACK,EAAE;EAEhE,IAAI,CAACF,KAAK,IAAI,CAACG,OAAO,EAAE;IACpB,MAAM,IAAIE,+BAAkB,CAAC;MACzBC,IAAI,EAAE;QACFC,MAAM,EAAG;MACb;IACJ,CAAC,CAAC;EACN;AACJ,CAAC;AAAC;AAEK,MAAMC,iBAAiB,GAAG,CAC7Bf,OAAmB,EACnBC,UAAqC,EACrCC,MAAqB,KACX;EACV,IAAI;IACAH,cAAc,CAACC,OAAO,EAAEC,UAAU,EAAEC,MAAM,CAAC;IAC3C,OAAO,IAAI;EACf,CAAC,CAAC,MAAM;IACJ,OAAO,KAAK;EAChB;AACJ,CAAC;AAAC"}
@@ -1,7 +0,0 @@
1
- import { BaseCmsSecurityPermission, CmsContext, CmsEntryPermission } from "../types";
2
- export declare const hasRwd: (permission: BaseCmsSecurityPermission, rwd: string) => boolean;
3
- export declare const hasPw: (permission: CmsEntryPermission, pw: string) => boolean;
4
- export declare const checkPermissions: <TPermission extends BaseCmsSecurityPermission = BaseCmsSecurityPermission>(context: CmsContext, name: string, check?: {
5
- rwd?: string;
6
- pw?: string;
7
- }) => Promise<TPermission>;
@@ -1,91 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.hasRwd = exports.hasPw = exports.checkPermissions = void 0;
7
- var _apiSecurity = require("@webiny/api-security");
8
- const hasRwd = (permission, rwd) => {
9
- if (typeof permission.rwd !== "string") {
10
- return true;
11
- }
12
- return permission.rwd.includes(rwd);
13
- };
14
- exports.hasRwd = hasRwd;
15
- const hasPw = (permission, pw) => {
16
- const isCustom = Object.keys(permission).length > 1; // "name" key is always present
17
-
18
- if (!isCustom) {
19
- // Means it's a "full-access" permission.
20
- return true;
21
- }
22
- if (typeof permission.pw !== "string") {
23
- return false;
24
- }
25
- return permission.pw.includes(pw);
26
- };
27
- exports.hasPw = hasPw;
28
- const PW = {
29
- p: "publish",
30
- u: "unpublish"
31
- };
32
- const RWD = {
33
- r: "read",
34
- w: "write",
35
- d: "delete"
36
- };
37
- const checkPermissions = async (context, name, check) => {
38
- // Check if user is allowed to edit content in current language
39
- const contentPermission = await context.security.getPermission("content.i18n");
40
- if (!contentPermission) {
41
- throw new _apiSecurity.NotAuthorizedError({
42
- data: {
43
- reason: "Missing access to content in any locale."
44
- }
45
- });
46
- }
47
-
48
- // We need to check this manually as CMS locale comes from the URL and not the default i18n app.
49
- const code = context.cms.getLocale().code;
50
- const locales = contentPermission.locales;
51
-
52
- // IMPORTANT: If we have a `contentPermission`, and `locales` key is NOT SET - it means the user has access to all locales.
53
- // However, if the the `locales` IS SET - check that it contains the required locale.
54
- if (Array.isArray(locales) && !locales.includes(code)) {
55
- throw new _apiSecurity.NotAuthorizedError({
56
- data: {
57
- reason: `Not allowed to access content in "${code}."`
58
- }
59
- });
60
- }
61
- const permission = await context.security.getPermission(name);
62
- if (!permission) {
63
- throw new _apiSecurity.NotAuthorizedError({
64
- data: {
65
- reason: `Missing permission "${name}".`
66
- }
67
- });
68
- }
69
- if (!check) {
70
- return permission;
71
- }
72
- if (check.rwd && !hasRwd(permission, check.rwd)) {
73
- throw new _apiSecurity.NotAuthorizedError({
74
- data: {
75
- reason: `Not allowed to perform "${RWD[check.rwd]}" on "${name}".`
76
- }
77
- });
78
- }
79
-
80
- // p = publish
81
- // u = unpublish
82
- if (check.pw && !hasPw(permission, check.pw)) {
83
- throw new _apiSecurity.NotAuthorizedError({
84
- data: {
85
- reason: `Not allowed to perform "${PW[check.pw]}" on "${name}".`
86
- }
87
- });
88
- }
89
- return permission;
90
- };
91
- exports.checkPermissions = checkPermissions;
@@ -1 +0,0 @@
1
- {"version":3,"names":["hasRwd","permission","rwd","includes","hasPw","pw","isCustom","Object","keys","length","PW","p","u","RWD","r","w","d","checkPermissions","context","name","check","contentPermission","security","getPermission","NotAuthorizedError","data","reason","code","cms","getLocale","locales","Array","isArray"],"sources":["permissions.ts"],"sourcesContent":["import { BaseCmsSecurityPermission, CmsContext, CmsEntryPermission } from \"~/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\nexport const hasRwd = (permission: BaseCmsSecurityPermission, rwd: string): boolean => {\n if (typeof permission.rwd !== \"string\") {\n return true;\n }\n\n return permission.rwd.includes(rwd);\n};\n\nexport const hasPw = (permission: CmsEntryPermission, pw: string): boolean => {\n const isCustom = Object.keys(permission).length > 1; // \"name\" key is always present\n\n if (!isCustom) {\n // Means it's a \"full-access\" permission.\n return true;\n }\n\n if (typeof permission.pw !== \"string\") {\n return false;\n }\n\n return permission.pw.includes(pw);\n};\n\nconst PW: Record<string, string> = {\n p: \"publish\",\n u: \"unpublish\"\n};\n\nconst RWD: Record<string, string> = {\n r: \"read\",\n w: \"write\",\n d: \"delete\"\n};\n\nexport const checkPermissions = async <\n TPermission extends BaseCmsSecurityPermission = BaseCmsSecurityPermission\n>(\n context: CmsContext,\n name: string,\n check?: { rwd?: string; pw?: string }\n): Promise<TPermission> => {\n // Check if user is allowed to edit content in current language\n const contentPermission = await context.security.getPermission(\"content.i18n\");\n\n if (!contentPermission) {\n throw new NotAuthorizedError({\n data: {\n reason: \"Missing access to content in any locale.\"\n }\n });\n }\n\n // We need to check this manually as CMS locale comes from the URL and not the default i18n app.\n const code = context.cms.getLocale().code;\n\n const locales: string[] = contentPermission.locales;\n\n // IMPORTANT: If we have a `contentPermission`, and `locales` key is NOT SET - it means the user has access to all locales.\n // However, if the the `locales` IS SET - check that it contains the required locale.\n if (Array.isArray(locales) && !locales.includes(code)) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access content in \"${code}.\"`\n }\n });\n }\n\n const permission = await context.security.getPermission<TPermission>(name);\n\n if (!permission) {\n throw new NotAuthorizedError({\n data: {\n reason: `Missing permission \"${name}\".`\n }\n });\n }\n\n if (!check) {\n return permission;\n }\n\n if (check.rwd && !hasRwd(permission, check.rwd)) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to perform \"${RWD[check.rwd]}\" on \"${name}\".`\n }\n });\n }\n\n // p = publish\n // u = unpublish\n if (check.pw && !hasPw(permission, check.pw)) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to perform \"${PW[check.pw]}\" on \"${name}\".`\n }\n });\n }\n\n return permission;\n};\n"],"mappings":";;;;;;AACA;AAEO,MAAMA,MAAM,GAAG,CAACC,UAAqC,EAAEC,GAAW,KAAc;EACnF,IAAI,OAAOD,UAAU,CAACC,GAAG,KAAK,QAAQ,EAAE;IACpC,OAAO,IAAI;EACf;EAEA,OAAOD,UAAU,CAACC,GAAG,CAACC,QAAQ,CAACD,GAAG,CAAC;AACvC,CAAC;AAAC;AAEK,MAAME,KAAK,GAAG,CAACH,UAA8B,EAAEI,EAAU,KAAc;EAC1E,MAAMC,QAAQ,GAAGC,MAAM,CAACC,IAAI,CAACP,UAAU,CAAC,CAACQ,MAAM,GAAG,CAAC,CAAC,CAAC;;EAErD,IAAI,CAACH,QAAQ,EAAE;IACX;IACA,OAAO,IAAI;EACf;EAEA,IAAI,OAAOL,UAAU,CAACI,EAAE,KAAK,QAAQ,EAAE;IACnC,OAAO,KAAK;EAChB;EAEA,OAAOJ,UAAU,CAACI,EAAE,CAACF,QAAQ,CAACE,EAAE,CAAC;AACrC,CAAC;AAAC;AAEF,MAAMK,EAA0B,GAAG;EAC/BC,CAAC,EAAE,SAAS;EACZC,CAAC,EAAE;AACP,CAAC;AAED,MAAMC,GAA2B,GAAG;EAChCC,CAAC,EAAE,MAAM;EACTC,CAAC,EAAE,OAAO;EACVC,CAAC,EAAE;AACP,CAAC;AAEM,MAAMC,gBAAgB,GAAG,OAG5BC,OAAmB,EACnBC,IAAY,EACZC,KAAqC,KACd;EACvB;EACA,MAAMC,iBAAiB,GAAG,MAAMH,OAAO,CAACI,QAAQ,CAACC,aAAa,CAAC,cAAc,CAAC;EAE9E,IAAI,CAACF,iBAAiB,EAAE;IACpB,MAAM,IAAIG,+BAAkB,CAAC;MACzBC,IAAI,EAAE;QACFC,MAAM,EAAE;MACZ;IACJ,CAAC,CAAC;EACN;;EAEA;EACA,MAAMC,IAAI,GAAGT,OAAO,CAACU,GAAG,CAACC,SAAS,EAAE,CAACF,IAAI;EAEzC,MAAMG,OAAiB,GAAGT,iBAAiB,CAACS,OAAO;;EAEnD;EACA;EACA,IAAIC,KAAK,CAACC,OAAO,CAACF,OAAO,CAAC,IAAI,CAACA,OAAO,CAAC3B,QAAQ,CAACwB,IAAI,CAAC,EAAE;IACnD,MAAM,IAAIH,+BAAkB,CAAC;MACzBC,IAAI,EAAE;QACFC,MAAM,EAAG,qCAAoCC,IAAK;MACtD;IACJ,CAAC,CAAC;EACN;EAEA,MAAM1B,UAAU,GAAG,MAAMiB,OAAO,CAACI,QAAQ,CAACC,aAAa,CAAcJ,IAAI,CAAC;EAE1E,IAAI,CAAClB,UAAU,EAAE;IACb,MAAM,IAAIuB,+BAAkB,CAAC;MACzBC,IAAI,EAAE;QACFC,MAAM,EAAG,uBAAsBP,IAAK;MACxC;IACJ,CAAC,CAAC;EACN;EAEA,IAAI,CAACC,KAAK,EAAE;IACR,OAAOnB,UAAU;EACrB;EAEA,IAAImB,KAAK,CAAClB,GAAG,IAAI,CAACF,MAAM,CAACC,UAAU,EAAEmB,KAAK,CAAClB,GAAG,CAAC,EAAE;IAC7C,MAAM,IAAIsB,+BAAkB,CAAC;MACzBC,IAAI,EAAE;QACFC,MAAM,EAAG,2BAA0Bb,GAAG,CAACO,KAAK,CAAClB,GAAG,CAAE,SAAQiB,IAAK;MACnE;IACJ,CAAC,CAAC;EACN;;EAEA;EACA;EACA,IAAIC,KAAK,CAACf,EAAE,IAAI,CAACD,KAAK,CAACH,UAAU,EAAEmB,KAAK,CAACf,EAAE,CAAC,EAAE;IAC1C,MAAM,IAAImB,+BAAkB,CAAC;MACzBC,IAAI,EAAE;QACFC,MAAM,EAAG,2BAA0BhB,EAAE,CAACU,KAAK,CAACf,EAAE,CAAE,SAAQc,IAAK;MACjE;IACJ,CAAC,CAAC;EACN;EAEA,OAAOlB,UAAU;AACrB,CAAC;AAAC"}