@webiny/api-record-locking 5.40.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.
Files changed (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/abstractions/IGetLockRecordUseCase.d.ts +8 -0
  4. package/abstractions/IGetLockRecordUseCase.js +7 -0
  5. package/abstractions/IGetLockRecordUseCase.js.map +1 -0
  6. package/abstractions/IGetLockedEntryLockRecordUseCase.d.ts +8 -0
  7. package/abstractions/IGetLockedEntryLockRecordUseCase.js +7 -0
  8. package/abstractions/IGetLockedEntryLockRecordUseCase.js.map +1 -0
  9. package/abstractions/IIsEntryLocked.d.ts +8 -0
  10. package/abstractions/IIsEntryLocked.js +7 -0
  11. package/abstractions/IIsEntryLocked.js.map +1 -0
  12. package/abstractions/IKickOutCurrentUserUseCase.d.ts +5 -0
  13. package/abstractions/IKickOutCurrentUserUseCase.js +7 -0
  14. package/abstractions/IKickOutCurrentUserUseCase.js.map +1 -0
  15. package/abstractions/IListAllLockRecordsUseCase.d.ts +9 -0
  16. package/abstractions/IListAllLockRecordsUseCase.js +7 -0
  17. package/abstractions/IListAllLockRecordsUseCase.js.map +1 -0
  18. package/abstractions/IListLockRecordsUseCase.d.ts +10 -0
  19. package/abstractions/IListLockRecordsUseCase.js +7 -0
  20. package/abstractions/IListLockRecordsUseCase.js.map +1 -0
  21. package/abstractions/ILockEntryUseCase.d.ts +11 -0
  22. package/abstractions/ILockEntryUseCase.js +7 -0
  23. package/abstractions/ILockEntryUseCase.js.map +1 -0
  24. package/abstractions/IUnlockEntryRequestUseCase.d.ts +11 -0
  25. package/abstractions/IUnlockEntryRequestUseCase.js +7 -0
  26. package/abstractions/IUnlockEntryRequestUseCase.js.map +1 -0
  27. package/abstractions/IUnlockEntryUseCase.d.ts +12 -0
  28. package/abstractions/IUnlockEntryUseCase.js +7 -0
  29. package/abstractions/IUnlockEntryUseCase.js.map +1 -0
  30. package/abstractions/IUpdateEntryLockUseCase.d.ts +11 -0
  31. package/abstractions/IUpdateEntryLockUseCase.js +7 -0
  32. package/abstractions/IUpdateEntryLockUseCase.js.map +1 -0
  33. package/crud/crud.d.ts +6 -0
  34. package/crud/crud.js +188 -0
  35. package/crud/crud.js.map +1 -0
  36. package/crud/model.d.ts +2 -0
  37. package/crud/model.js +127 -0
  38. package/crud/model.js.map +1 -0
  39. package/graphql/schema.d.ts +7 -0
  40. package/graphql/schema.js +280 -0
  41. package/graphql/schema.js.map +1 -0
  42. package/index.d.ts +3 -0
  43. package/index.js +38 -0
  44. package/index.js.map +1 -0
  45. package/package.json +64 -0
  46. package/types.d.ts +172 -0
  47. package/types.js +30 -0
  48. package/types.js.map +1 -0
  49. package/useCases/GetLockRecord/GetLockRecordUseCase.d.ts +10 -0
  50. package/useCases/GetLockRecord/GetLockRecordUseCase.js +35 -0
  51. package/useCases/GetLockRecord/GetLockRecordUseCase.js.map +1 -0
  52. package/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase.d.ts +16 -0
  53. package/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase.js +27 -0
  54. package/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase.js.map +1 -0
  55. package/useCases/IsEntryLocked/IsEntryLockedUseCase.d.ts +16 -0
  56. package/useCases/IsEntryLocked/IsEntryLockedUseCase.js +35 -0
  57. package/useCases/IsEntryLocked/IsEntryLockedUseCase.js.map +1 -0
  58. package/useCases/KickOutCurrentUser/KickOutCurrentUserUseCase.d.ts +12 -0
  59. package/useCases/KickOutCurrentUser/KickOutCurrentUserUseCase.js +46 -0
  60. package/useCases/KickOutCurrentUser/KickOutCurrentUserUseCase.js.map +1 -0
  61. package/useCases/ListAllLockRecordsUseCase/ListAllLockRecordsUseCase.d.ts +10 -0
  62. package/useCases/ListAllLockRecordsUseCase/ListAllLockRecordsUseCase.js +32 -0
  63. package/useCases/ListAllLockRecordsUseCase/ListAllLockRecordsUseCase.js.map +1 -0
  64. package/useCases/ListLockRecordsUseCase/ListLockRecordsUseCase.d.ts +14 -0
  65. package/useCases/ListLockRecordsUseCase/ListLockRecordsUseCase.js +27 -0
  66. package/useCases/ListLockRecordsUseCase/ListLockRecordsUseCase.js.map +1 -0
  67. package/useCases/LockEntryUseCase/LockEntryUseCase.d.ts +13 -0
  68. package/useCases/LockEntryUseCase/LockEntryUseCase.js +51 -0
  69. package/useCases/LockEntryUseCase/LockEntryUseCase.js.map +1 -0
  70. package/useCases/UnlockEntryUseCase/UnlockEntryUseCase.d.ts +20 -0
  71. package/useCases/UnlockEntryUseCase/UnlockEntryUseCase.js +67 -0
  72. package/useCases/UnlockEntryUseCase/UnlockEntryUseCase.js.map +1 -0
  73. package/useCases/UnlockRequestUseCase/UnlockEntryRequestUseCase.d.ts +15 -0
  74. package/useCases/UnlockRequestUseCase/UnlockEntryRequestUseCase.js +78 -0
  75. package/useCases/UnlockRequestUseCase/UnlockEntryRequestUseCase.js.map +1 -0
  76. package/useCases/UpdateEntryLock/UpdateEntryLockUseCase.d.ts +18 -0
  77. package/useCases/UpdateEntryLock/UpdateEntryLockUseCase.js +48 -0
  78. package/useCases/UpdateEntryLock/UpdateEntryLockUseCase.js.map +1 -0
  79. package/useCases/index.d.ts +28 -0
  80. package/useCases/index.js +83 -0
  81. package/useCases/index.js.map +1 -0
  82. package/utils/calculateExpiresOn.d.ts +2 -0
  83. package/utils/calculateExpiresOn.js +15 -0
  84. package/utils/calculateExpiresOn.js.map +1 -0
  85. package/utils/checkPermissions.d.ts +7 -0
  86. package/utils/checkPermissions.js +21 -0
  87. package/utils/checkPermissions.js.map +1 -0
  88. package/utils/convertEntryToLockRecord.d.ts +28 -0
  89. package/utils/convertEntryToLockRecord.js +88 -0
  90. package/utils/convertEntryToLockRecord.js.map +1 -0
  91. package/utils/convertWhereCondition.d.ts +4 -0
  92. package/utils/convertWhereCondition.js +41 -0
  93. package/utils/convertWhereCondition.js.map +1 -0
  94. package/utils/getTimeout.d.ts +4 -0
  95. package/utils/getTimeout.js +20 -0
  96. package/utils/getTimeout.js.map +1 -0
  97. package/utils/isLockedFactory.d.ts +5 -0
  98. package/utils/isLockedFactory.js +20 -0
  99. package/utils/isLockedFactory.js.map +1 -0
  100. package/utils/lockRecordDatabaseId.d.ts +2 -0
  101. package/utils/lockRecordDatabaseId.js +24 -0
  102. package/utils/lockRecordDatabaseId.js.map +1 -0
  103. package/utils/resolve.d.ts +8 -0
  104. package/utils/resolve.js +30 -0
  105. package/utils/resolve.js.map +1 -0
  106. package/utils/validateSameIdentity.d.ts +6 -0
  107. package/utils/validateSameIdentity.js +24 -0
  108. package/utils/validateSameIdentity.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_apiHeadlessCms","require","RECORD_LOCKING_MODEL_ID","exports","createLockingModel","createCmsModel","createPrivateModel","modelId","name","fields","id","type","fieldId","storageId","label","validation","message","multipleValues","settings"],"sources":["model.ts"],"sourcesContent":["import { createCmsModel, createPrivateModel } from \"@webiny/api-headless-cms\";\n\nexport const RECORD_LOCKING_MODEL_ID = \"wby_recordLocking\";\n\nexport const createLockingModel = () => {\n return createCmsModel(\n createPrivateModel({\n modelId: RECORD_LOCKING_MODEL_ID,\n name: \"Record Lock Tracking\",\n fields: [\n {\n id: \"targetId\",\n type: \"text\",\n fieldId: \"targetId\",\n storageId: \"text@targetId\",\n label: \"Target ID\",\n validation: [\n {\n name: \"required\",\n message: \"Target ID is required.\"\n }\n ]\n },\n /**\n * Since we need a generic way to track records, we will use type to determine if it's a cms record or a page or a form, etc...\n * Update IHeadlessCmsLockRecordValues in types.ts file with additional fields as required.\n *\n * @see IHeadlessCmsLockRecordValues\n */\n {\n id: \"type\",\n type: \"text\",\n fieldId: \"type\",\n storageId: \"text@type\",\n label: \"Record Type\",\n validation: [\n {\n name: \"required\",\n message: \"Record type is required.\"\n }\n ]\n },\n {\n id: \"actions\",\n type: \"object\",\n fieldId: \"actions\",\n storageId: \"object@actions\",\n label: \"Actions\",\n multipleValues: true,\n settings: {\n fields: [\n {\n id: \"type\",\n type: \"text\",\n fieldId: \"type\",\n storageId: \"text@type\",\n label: \"Action Type\",\n validation: [\n {\n name: \"required\",\n message: \"Action type is required.\"\n }\n ]\n },\n {\n id: \"message\",\n type: \"text\",\n fieldId: \"message\",\n storageId: \"text@message\",\n label: \"Message\"\n },\n {\n id: \"createdBy\",\n type: \"object\",\n fieldId: \"createdBy\",\n storageId: \"object@createdBy\",\n label: \"Created By\",\n validation: [\n {\n name: \"required\",\n message: \"Created by is required.\"\n }\n ],\n settings: {\n fields: [\n {\n id: \"id\",\n type: \"text\",\n fieldId: \"id\",\n storageId: \"text@id\",\n label: \"ID\",\n validation: [\n {\n name: \"required\",\n message: \"ID is required.\"\n }\n ]\n },\n {\n id: \"displayName\",\n type: \"text\",\n fieldId: \"displayName\",\n storageId: \"text@displayName\",\n label: \"Display Name\",\n validation: [\n {\n name: \"required\",\n message: \"Display name is required.\"\n }\n ]\n },\n {\n id: \"type\",\n type: \"text\",\n fieldId: \"type\",\n storageId: \"text@type\",\n label: \"Type\",\n validation: [\n {\n name: \"required\",\n message: \"Type is required.\"\n }\n ]\n }\n ]\n }\n },\n {\n id: \"createdOn\",\n type: \"datetime\",\n fieldId: \"createdOn\",\n storageId: \"datetime@createdOn\",\n settings: {\n type: \"dateTimeWithoutTimezone\"\n },\n label: \"Created On\",\n validation: [\n {\n name: \"required\",\n message: \"Created on is required.\"\n }\n ]\n }\n ]\n }\n }\n ]\n })\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import { Context } from "../types";
2
+ import { IGraphQLSchemaPlugin } from "@webiny/handler-graphql";
3
+ interface Params {
4
+ context: Pick<Context, "plugins" | "recordLocking" | "security" | "cms">;
5
+ }
6
+ export declare const createGraphQLSchema: (params: Params) => Promise<IGraphQLSchemaPlugin<Context>>;
7
+ export {};
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createGraphQLSchema = void 0;
7
+ var _resolve = require("../utils/resolve");
8
+ var _handlerGraphql = require("@webiny/handler-graphql");
9
+ var _renderFields = require("@webiny/api-headless-cms/utils/renderFields");
10
+ var _createFieldTypePluginRecords = require("@webiny/api-headless-cms/graphql/schema/createFieldTypePluginRecords");
11
+ var _renderListFilterFields = require("@webiny/api-headless-cms/utils/renderListFilterFields");
12
+ var _renderSortEnum = require("@webiny/api-headless-cms/utils/renderSortEnum");
13
+ var _checkPermissions = require("../utils/checkPermissions");
14
+ const createGraphQLSchema = async params => {
15
+ const context = params.context;
16
+ const model = await context.recordLocking.getModel();
17
+ const models = await context.security.withoutAuthorization(async () => {
18
+ return (await context.cms.listModels()).filter(model => {
19
+ if (model.fields.length === 0) {
20
+ return false;
21
+ } else if (model.isPrivate) {
22
+ return false;
23
+ }
24
+ return true;
25
+ });
26
+ });
27
+ const fieldTypePlugins = (0, _createFieldTypePluginRecords.createFieldTypePluginRecords)(context.plugins);
28
+ const recordLockingFields = (0, _renderFields.renderFields)({
29
+ models,
30
+ model,
31
+ fields: model.fields,
32
+ type: "manage",
33
+ fieldTypePlugins
34
+ });
35
+ const listFilterFieldsRender = (0, _renderListFilterFields.renderListFilterFields)({
36
+ model,
37
+ fields: model.fields,
38
+ type: "manage",
39
+ fieldTypePlugins,
40
+ excludeFields: ["entryId"]
41
+ });
42
+ const sortEnumRender = (0, _renderSortEnum.renderSortEnum)({
43
+ model,
44
+ fields: model.fields,
45
+ fieldTypePlugins,
46
+ sorterPlugins: []
47
+ });
48
+ const plugin = (0, _handlerGraphql.createGraphQLSchemaPlugin)({
49
+ typeDefs: /* GraphQL */`
50
+ ${recordLockingFields.map(f => f.typeDefs).join("\n")}
51
+
52
+ type RecordLockingError {
53
+ message: String
54
+ code: String
55
+ data: JSON
56
+ stack: String
57
+ }
58
+
59
+ enum RecordLockingRecordActionType {
60
+ requested
61
+ approved
62
+ denied
63
+ }
64
+
65
+ type RecordLockingIdentity {
66
+ id: String!
67
+ displayName: String
68
+ type: String
69
+ }
70
+
71
+ type RecordLockingRecordAction {
72
+ id: ID!
73
+ type: RecordLockingRecordActionType!
74
+ message: String
75
+ createdBy: RecordLockingIdentity!
76
+ createdOn: DateTime!
77
+ }
78
+
79
+ type RecordLockingRecord {
80
+ id: ID!
81
+ lockedBy: RecordLockingIdentity!
82
+ lockedOn: DateTime!
83
+ updatedOn: DateTime!
84
+ expiresOn: DateTime!
85
+ ${recordLockingFields.map(f => f.fields).join("\n")}
86
+ }
87
+
88
+ type RecordLockingIsEntryLockedResponse {
89
+ data: Boolean
90
+ error: RecordLockingError
91
+ }
92
+
93
+ type RecordLockingGetLockRecordResponse {
94
+ data: RecordLockingRecord
95
+ error: RecordLockingError
96
+ }
97
+
98
+ type RecordLockingGetLockedEntryLockRecordResponse {
99
+ data: RecordLockingRecord
100
+ error: RecordLockingError
101
+ }
102
+
103
+ type RecordLockingListLockRecordsResponse {
104
+ data: [RecordLockingRecord!]
105
+ error: RecordLockingError
106
+ }
107
+
108
+ type RecordLockingLockEntryResponse {
109
+ data: RecordLockingRecord
110
+ error: RecordLockingError
111
+ }
112
+
113
+ type RecordLockingUpdateLockResponse {
114
+ data: RecordLockingRecord
115
+ error: RecordLockingError
116
+ }
117
+
118
+ type RecordLockingUnlockEntryResponse {
119
+ data: RecordLockingRecord
120
+ error: RecordLockingError
121
+ }
122
+
123
+ type RecordLockingUnlockEntryRequestResponse {
124
+ data: RecordLockingRecord
125
+ error: RecordLockingError
126
+ }
127
+
128
+ input RecordLockingListWhereInput {
129
+ ${listFilterFieldsRender}
130
+ }
131
+
132
+ enum RecordLockingListSorter {
133
+ ${sortEnumRender}
134
+ }
135
+
136
+ type RecordLockingQuery {
137
+ _empty: String
138
+ }
139
+
140
+ type RecordLockingMutation {
141
+ _empty: String
142
+ }
143
+
144
+ extend type RecordLockingQuery {
145
+ isEntryLocked(id: ID!, type: String!): RecordLockingIsEntryLockedResponse!
146
+ getLockRecord(id: ID!, type: String!): RecordLockingGetLockRecordResponse!
147
+ # Returns lock record or null - if entry is locked in context of the current user, does not throw an error like getLockRecord if no record in the DB
148
+ getLockedEntryLockRecord(id: ID!, type: String!): RecordLockingGetLockedEntryLockRecordResponse!
149
+ listAllLockRecords(
150
+ where: RecordLockingListWhereInput
151
+ sort: [RecordLockingListSorter!]
152
+ limit: Int
153
+ after: String
154
+ ): RecordLockingListLockRecordsResponse!
155
+ # Basically same as listAllLockRecords except this one will filter out records with expired lock.
156
+ listLockRecords(
157
+ where: RecordLockingListWhereInput
158
+ sort: [RecordLockingListSorter!]
159
+ limit: Int
160
+ after: String
161
+ ): RecordLockingListLockRecordsResponse!
162
+ }
163
+
164
+ extend type RecordLockingMutation {
165
+ lockEntry(id: ID!, type: String!): RecordLockingLockEntryResponse!
166
+ updateEntryLock(id: ID!, type: String!): RecordLockingUpdateLockResponse!
167
+ unlockEntry(id: ID!, type: String!, force: Boolean): RecordLockingUnlockEntryResponse!
168
+ unlockEntryRequest(
169
+ id: ID!
170
+ type: String!
171
+ ): RecordLockingUnlockEntryRequestResponse!
172
+ }
173
+
174
+ extend type Query {
175
+ recordLocking: RecordLockingQuery
176
+ }
177
+
178
+ extend type Mutation {
179
+ recordLocking: RecordLockingMutation
180
+ }
181
+ `,
182
+ resolvers: {
183
+ Query: {
184
+ recordLocking: async () => ({})
185
+ },
186
+ Mutation: {
187
+ recordLocking: async () => ({})
188
+ },
189
+ RecordLockingQuery: {
190
+ async isEntryLocked(_, args, context) {
191
+ return (0, _resolve.resolve)(async () => {
192
+ await (0, _checkPermissions.checkPermissions)(context);
193
+ return context.recordLocking.isEntryLocked({
194
+ id: args.id,
195
+ type: args.type
196
+ });
197
+ });
198
+ },
199
+ async getLockRecord(_, args, context) {
200
+ return (0, _resolve.resolve)(async () => {
201
+ await (0, _checkPermissions.checkPermissions)(context);
202
+ const result = await context.recordLocking.getLockRecord({
203
+ id: args.id,
204
+ type: args.type
205
+ });
206
+ if (result) {
207
+ return result;
208
+ }
209
+ throw new _handlerGraphql.NotFoundError("Lock record not found.");
210
+ });
211
+ },
212
+ async getLockedEntryLockRecord(_, args, context) {
213
+ return (0, _resolve.resolve)(async () => {
214
+ await (0, _checkPermissions.checkPermissions)(context);
215
+ return await context.recordLocking.getLockedEntryLockRecord({
216
+ id: args.id,
217
+ type: args.type
218
+ });
219
+ });
220
+ },
221
+ async listLockRecords(_, args, context) {
222
+ return (0, _resolve.resolveList)(async () => {
223
+ await (0, _checkPermissions.checkPermissions)(context);
224
+ return await context.recordLocking.listLockRecords(args);
225
+ });
226
+ },
227
+ listAllLockRecords(_, args, context) {
228
+ return (0, _resolve.resolveList)(async () => {
229
+ await (0, _checkPermissions.checkPermissions)(context);
230
+ return await context.recordLocking.listAllLockRecords(args);
231
+ });
232
+ }
233
+ },
234
+ RecordLockingMutation: {
235
+ async lockEntry(_, args, context) {
236
+ return (0, _resolve.resolve)(async () => {
237
+ await (0, _checkPermissions.checkPermissions)(context);
238
+ return context.recordLocking.lockEntry({
239
+ id: args.id,
240
+ type: args.type
241
+ });
242
+ });
243
+ },
244
+ async updateEntryLock(_, args, context) {
245
+ return (0, _resolve.resolve)(async () => {
246
+ await (0, _checkPermissions.checkPermissions)(context);
247
+ return context.recordLocking.updateEntryLock({
248
+ id: args.id,
249
+ type: args.type
250
+ });
251
+ });
252
+ },
253
+ async unlockEntry(_, args, context) {
254
+ return (0, _resolve.resolve)(async () => {
255
+ await (0, _checkPermissions.checkPermissions)(context);
256
+ return await context.recordLocking.unlockEntry({
257
+ id: args.id,
258
+ type: args.type,
259
+ force: args.force
260
+ });
261
+ });
262
+ },
263
+ async unlockEntryRequest(_, args, context) {
264
+ return (0, _resolve.resolve)(async () => {
265
+ await (0, _checkPermissions.checkPermissions)(context);
266
+ return await context.recordLocking.unlockEntryRequest({
267
+ id: args.id,
268
+ type: args.type
269
+ });
270
+ });
271
+ }
272
+ }
273
+ }
274
+ });
275
+ plugin.name = "recordLocking.graphql.schema.locking";
276
+ return plugin;
277
+ };
278
+ exports.createGraphQLSchema = createGraphQLSchema;
279
+
280
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_resolve","require","_handlerGraphql","_renderFields","_createFieldTypePluginRecords","_renderListFilterFields","_renderSortEnum","_checkPermissions","createGraphQLSchema","params","context","model","recordLocking","getModel","models","security","withoutAuthorization","cms","listModels","filter","fields","length","isPrivate","fieldTypePlugins","createFieldTypePluginRecords","plugins","recordLockingFields","renderFields","type","listFilterFieldsRender","renderListFilterFields","excludeFields","sortEnumRender","renderSortEnum","sorterPlugins","plugin","createGraphQLSchemaPlugin","typeDefs","map","f","join","resolvers","Query","Mutation","RecordLockingQuery","isEntryLocked","_","args","resolve","checkPermissions","id","getLockRecord","result","NotFoundError","getLockedEntryLockRecord","listLockRecords","resolveList","listAllLockRecords","RecordLockingMutation","lockEntry","updateEntryLock","unlockEntry","force","unlockEntryRequest","name","exports"],"sources":["schema.ts"],"sourcesContent":["import { resolve, resolveList } from \"~/utils/resolve\";\nimport { Context } from \"~/types\";\nimport {\n createGraphQLSchemaPlugin,\n IGraphQLSchemaPlugin,\n NotFoundError\n} from \"@webiny/handler-graphql\";\nimport { renderFields } from \"@webiny/api-headless-cms/utils/renderFields\";\nimport { createFieldTypePluginRecords } from \"@webiny/api-headless-cms/graphql/schema/createFieldTypePluginRecords\";\nimport { renderListFilterFields } from \"@webiny/api-headless-cms/utils/renderListFilterFields\";\nimport { renderSortEnum } from \"@webiny/api-headless-cms/utils/renderSortEnum\";\nimport { checkPermissions } from \"~/utils/checkPermissions\";\n\ninterface Params {\n context: Pick<Context, \"plugins\" | \"recordLocking\" | \"security\" | \"cms\">;\n}\nexport const createGraphQLSchema = async (\n params: Params\n): Promise<IGraphQLSchemaPlugin<Context>> => {\n const context = params.context;\n\n const model = await context.recordLocking.getModel();\n\n const models = await context.security.withoutAuthorization(async () => {\n return (await context.cms.listModels()).filter(model => {\n if (model.fields.length === 0) {\n return false;\n } else if (model.isPrivate) {\n return false;\n }\n return true;\n });\n });\n\n const fieldTypePlugins = createFieldTypePluginRecords(context.plugins);\n\n const recordLockingFields = renderFields({\n models,\n model,\n fields: model.fields,\n type: \"manage\",\n fieldTypePlugins\n });\n\n const listFilterFieldsRender = renderListFilterFields({\n model,\n fields: model.fields,\n type: \"manage\",\n fieldTypePlugins,\n excludeFields: [\"entryId\"]\n });\n\n const sortEnumRender = renderSortEnum({\n model,\n fields: model.fields,\n fieldTypePlugins,\n sorterPlugins: []\n });\n\n const plugin = createGraphQLSchemaPlugin<Context>({\n typeDefs: /* GraphQL */ `\n ${recordLockingFields.map(f => f.typeDefs).join(\"\\n\")}\n\n type RecordLockingError {\n message: String\n code: String\n data: JSON\n stack: String\n }\n\n enum RecordLockingRecordActionType {\n requested\n approved\n denied\n }\n\n type RecordLockingIdentity {\n id: String!\n displayName: String\n type: String\n }\n\n type RecordLockingRecordAction {\n id: ID!\n type: RecordLockingRecordActionType!\n message: String\n createdBy: RecordLockingIdentity!\n createdOn: DateTime!\n }\n\n type RecordLockingRecord {\n id: ID!\n lockedBy: RecordLockingIdentity!\n lockedOn: DateTime!\n updatedOn: DateTime!\n expiresOn: DateTime!\n ${recordLockingFields.map(f => f.fields).join(\"\\n\")}\n }\n\n type RecordLockingIsEntryLockedResponse {\n data: Boolean\n error: RecordLockingError\n }\n\n type RecordLockingGetLockRecordResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingGetLockedEntryLockRecordResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingListLockRecordsResponse {\n data: [RecordLockingRecord!]\n error: RecordLockingError\n }\n\n type RecordLockingLockEntryResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n \n type RecordLockingUpdateLockResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingUnlockEntryResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingUnlockEntryRequestResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n input RecordLockingListWhereInput {\n ${listFilterFieldsRender}\n }\n\n enum RecordLockingListSorter {\n ${sortEnumRender}\n }\n\n type RecordLockingQuery {\n _empty: String\n }\n\n type RecordLockingMutation {\n _empty: String\n }\n\n extend type RecordLockingQuery {\n isEntryLocked(id: ID!, type: String!): RecordLockingIsEntryLockedResponse!\n getLockRecord(id: ID!, type: String!): RecordLockingGetLockRecordResponse!\n # Returns lock record or null - if entry is locked in context of the current user, does not throw an error like getLockRecord if no record in the DB\n getLockedEntryLockRecord(id: ID!, type: String!): RecordLockingGetLockedEntryLockRecordResponse!\n listAllLockRecords(\n where: RecordLockingListWhereInput\n sort: [RecordLockingListSorter!]\n limit: Int\n after: String\n ): RecordLockingListLockRecordsResponse!\n # Basically same as listAllLockRecords except this one will filter out records with expired lock.\n listLockRecords(\n where: RecordLockingListWhereInput\n sort: [RecordLockingListSorter!]\n limit: Int\n after: String\n ): RecordLockingListLockRecordsResponse!\n }\n\n extend type RecordLockingMutation {\n lockEntry(id: ID!, type: String!): RecordLockingLockEntryResponse!\n updateEntryLock(id: ID!, type: String!): RecordLockingUpdateLockResponse!\n unlockEntry(id: ID!, type: String!, force: Boolean): RecordLockingUnlockEntryResponse!\n unlockEntryRequest(\n id: ID!\n type: String!\n ): RecordLockingUnlockEntryRequestResponse!\n }\n\n extend type Query {\n recordLocking: RecordLockingQuery\n }\n\n extend type Mutation {\n recordLocking: RecordLockingMutation\n }\n `,\n resolvers: {\n Query: {\n recordLocking: async () => ({})\n },\n Mutation: {\n recordLocking: async () => ({})\n },\n RecordLockingQuery: {\n async isEntryLocked(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return context.recordLocking.isEntryLocked({\n id: args.id,\n type: args.type\n });\n });\n },\n async getLockRecord(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const result = await context.recordLocking.getLockRecord({\n id: args.id,\n type: args.type\n });\n if (result) {\n return result;\n }\n throw new NotFoundError(\"Lock record not found.\");\n });\n },\n async getLockedEntryLockRecord(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.recordLocking.getLockedEntryLockRecord({\n id: args.id,\n type: args.type\n });\n });\n },\n\n async listLockRecords(_, args, context) {\n return resolveList(async () => {\n await checkPermissions(context);\n return await context.recordLocking.listLockRecords(args);\n });\n },\n listAllLockRecords(_, args, context) {\n return resolveList(async () => {\n await checkPermissions(context);\n return await context.recordLocking.listAllLockRecords(args);\n });\n }\n },\n RecordLockingMutation: {\n async lockEntry(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return context.recordLocking.lockEntry({\n id: args.id,\n type: args.type\n });\n });\n },\n async updateEntryLock(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return context.recordLocking.updateEntryLock({\n id: args.id,\n type: args.type\n });\n });\n },\n async unlockEntry(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.recordLocking.unlockEntry({\n id: args.id,\n type: args.type,\n force: args.force\n });\n });\n },\n async unlockEntryRequest(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.recordLocking.unlockEntryRequest({\n id: args.id,\n type: args.type\n });\n });\n }\n }\n }\n });\n\n plugin.name = \"recordLocking.graphql.schema.locking\";\n\n return plugin;\n};\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAEA,IAAAC,eAAA,GAAAD,OAAA;AAKA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,6BAAA,GAAAH,OAAA;AACA,IAAAI,uBAAA,GAAAJ,OAAA;AACA,IAAAK,eAAA,GAAAL,OAAA;AACA,IAAAM,iBAAA,GAAAN,OAAA;AAKO,MAAMO,mBAAmB,GAAG,MAC/BC,MAAc,IAC2B;EACzC,MAAMC,OAAO,GAAGD,MAAM,CAACC,OAAO;EAE9B,MAAMC,KAAK,GAAG,MAAMD,OAAO,CAACE,aAAa,CAACC,QAAQ,CAAC,CAAC;EAEpD,MAAMC,MAAM,GAAG,MAAMJ,OAAO,CAACK,QAAQ,CAACC,oBAAoB,CAAC,YAAY;IACnE,OAAO,CAAC,MAAMN,OAAO,CAACO,GAAG,CAACC,UAAU,CAAC,CAAC,EAAEC,MAAM,CAACR,KAAK,IAAI;MACpD,IAAIA,KAAK,CAACS,MAAM,CAACC,MAAM,KAAK,CAAC,EAAE;QAC3B,OAAO,KAAK;MAChB,CAAC,MAAM,IAAIV,KAAK,CAACW,SAAS,EAAE;QACxB,OAAO,KAAK;MAChB;MACA,OAAO,IAAI;IACf,CAAC,CAAC;EACN,CAAC,CAAC;EAEF,MAAMC,gBAAgB,GAAG,IAAAC,0DAA4B,EAACd,OAAO,CAACe,OAAO,CAAC;EAEtE,MAAMC,mBAAmB,GAAG,IAAAC,0BAAY,EAAC;IACrCb,MAAM;IACNH,KAAK;IACLS,MAAM,EAAET,KAAK,CAACS,MAAM;IACpBQ,IAAI,EAAE,QAAQ;IACdL;EACJ,CAAC,CAAC;EAEF,MAAMM,sBAAsB,GAAG,IAAAC,8CAAsB,EAAC;IAClDnB,KAAK;IACLS,MAAM,EAAET,KAAK,CAACS,MAAM;IACpBQ,IAAI,EAAE,QAAQ;IACdL,gBAAgB;IAChBQ,aAAa,EAAE,CAAC,SAAS;EAC7B,CAAC,CAAC;EAEF,MAAMC,cAAc,GAAG,IAAAC,8BAAc,EAAC;IAClCtB,KAAK;IACLS,MAAM,EAAET,KAAK,CAACS,MAAM;IACpBG,gBAAgB;IAChBW,aAAa,EAAE;EACnB,CAAC,CAAC;EAEF,MAAMC,MAAM,GAAG,IAAAC,yCAAyB,EAAU;IAC9CC,QAAQ,EAAE,aAAe;AACjC,cAAcX,mBAAmB,CAACY,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACF,QAAQ,CAAC,CAACG,IAAI,CAAC,IAAI,CAAE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkBd,mBAAmB,CAACY,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACnB,MAAM,CAAC,CAACoB,IAAI,CAAC,IAAI,CAAE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkBX,sBAAuB;AACzC;AACA;AACA;AACA,kBAAkBG,cAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;IACDS,SAAS,EAAE;MACPC,KAAK,EAAE;QACH9B,aAAa,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;MAClC,CAAC;MACD+B,QAAQ,EAAE;QACN/B,aAAa,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;MAClC,CAAC;MACDgC,kBAAkB,EAAE;QAChB,MAAMC,aAAaA,CAACC,CAAC,EAAEC,IAAI,EAAErC,OAAO,EAAE;UAClC,OAAO,IAAAsC,gBAAO,EAAC,YAAY;YACvB,MAAM,IAAAC,kC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","ignoreList":[]}
package/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { ContextPlugin } from "@webiny/api";
2
+ import { Context } from "./types";
3
+ export declare const createRecordLocking: () => ContextPlugin<Context>[];
package/index.js ADDED
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createRecordLocking = void 0;
7
+ var _schema = require("./graphql/schema");
8
+ var _api = require("@webiny/api");
9
+ var _crud = require("./crud/crud");
10
+ var _model = require("./crud/model");
11
+ var _apiHeadlessCms = require("@webiny/api-headless-cms");
12
+ const createContextPlugin = () => {
13
+ const plugin = new _api.ContextPlugin(async context => {
14
+ if (!context.wcp.canUseRecordLocking()) {
15
+ return;
16
+ }
17
+ const ready = await (0, _apiHeadlessCms.isHeadlessCmsReady)(context);
18
+ if (!ready) {
19
+ return;
20
+ }
21
+ context.plugins.register((0, _model.createLockingModel)());
22
+ context.recordLocking = await (0, _crud.createRecordLockingCrud)({
23
+ context
24
+ });
25
+ const graphQlPlugin = await (0, _schema.createGraphQLSchema)({
26
+ context
27
+ });
28
+ context.plugins.register(graphQlPlugin);
29
+ });
30
+ plugin.name = "context.recordLocking";
31
+ return plugin;
32
+ };
33
+ const createRecordLocking = () => {
34
+ return [createContextPlugin()];
35
+ };
36
+ exports.createRecordLocking = createRecordLocking;
37
+
38
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_schema","require","_api","_crud","_model","_apiHeadlessCms","createContextPlugin","plugin","ContextPlugin","context","wcp","canUseRecordLocking","ready","isHeadlessCmsReady","plugins","register","createLockingModel","recordLocking","createRecordLockingCrud","graphQlPlugin","createGraphQLSchema","name","createRecordLocking","exports"],"sources":["index.ts"],"sourcesContent":["import { createGraphQLSchema } from \"~/graphql/schema\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { Context } from \"~/types\";\nimport { createRecordLockingCrud } from \"~/crud/crud\";\nimport { createLockingModel } from \"~/crud/model\";\nimport { isHeadlessCmsReady } from \"@webiny/api-headless-cms\";\n\nconst createContextPlugin = () => {\n const plugin = new ContextPlugin<Context>(async context => {\n if (!context.wcp.canUseRecordLocking()) {\n return;\n }\n\n const ready = await isHeadlessCmsReady(context);\n if (!ready) {\n return;\n }\n context.plugins.register(createLockingModel());\n\n context.recordLocking = await createRecordLockingCrud({\n context\n });\n\n const graphQlPlugin = await createGraphQLSchema({ context });\n context.plugins.register(graphQlPlugin);\n });\n plugin.name = \"context.recordLocking\";\n\n return plugin;\n};\n\nexport const createRecordLocking = () => {\n return [createContextPlugin()];\n};\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AAEA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AAEA,MAAMK,mBAAmB,GAAGA,CAAA,KAAM;EAC9B,MAAMC,MAAM,GAAG,IAAIC,kBAAa,CAAU,MAAMC,OAAO,IAAI;IACvD,IAAI,CAACA,OAAO,CAACC,GAAG,CAACC,mBAAmB,CAAC,CAAC,EAAE;MACpC;IACJ;IAEA,MAAMC,KAAK,GAAG,MAAM,IAAAC,kCAAkB,EAACJ,OAAO,CAAC;IAC/C,IAAI,CAACG,KAAK,EAAE;MACR;IACJ;IACAH,OAAO,CAACK,OAAO,CAACC,QAAQ,CAAC,IAAAC,yBAAkB,EAAC,CAAC,CAAC;IAE9CP,OAAO,CAACQ,aAAa,GAAG,MAAM,IAAAC,6BAAuB,EAAC;MAClDT;IACJ,CAAC,CAAC;IAEF,MAAMU,aAAa,GAAG,MAAM,IAAAC,2BAAmB,EAAC;MAAEX;IAAQ,CAAC,CAAC;IAC5DA,OAAO,CAACK,OAAO,CAACC,QAAQ,CAACI,aAAa,CAAC;EAC3C,CAAC,CAAC;EACFZ,MAAM,CAACc,IAAI,GAAG,uBAAuB;EAErC,OAAOd,MAAM;AACjB,CAAC;AAEM,MAAMe,mBAAmB,GAAGA,CAAA,KAAM;EACrC,OAAO,CAAChB,mBAAmB,CAAC,CAAC,CAAC;AAClC,CAAC;AAACiB,OAAA,CAAAD,mBAAA,GAAAA,mBAAA","ignoreList":[]}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@webiny/api-record-locking",
3
+ "version": "5.40.0-beta.3",
4
+ "main": "index.js",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/webiny/webiny-js.git"
8
+ },
9
+ "description": "Record Locking built on top of the Headless CMS.",
10
+ "contributors": [
11
+ "Bruno Zorić <bruno@webiny.com>"
12
+ ],
13
+ "license": "MIT",
14
+ "dependencies": {
15
+ "@babel/runtime": "7.24.1",
16
+ "@types/aws-lambda": "8.10.136",
17
+ "@webiny/api": "5.40.0-beta.3",
18
+ "@webiny/api-headless-cms": "5.40.0-beta.3",
19
+ "@webiny/api-websockets": "5.40.0-beta.3",
20
+ "@webiny/error": "5.40.0-beta.3",
21
+ "@webiny/handler": "5.40.0-beta.3",
22
+ "@webiny/handler-aws": "5.40.0-beta.3",
23
+ "@webiny/handler-graphql": "5.40.0-beta.3",
24
+ "@webiny/plugins": "5.40.0-beta.3",
25
+ "@webiny/pubsub": "5.40.0-beta.3",
26
+ "@webiny/utils": "5.40.0-beta.3"
27
+ },
28
+ "devDependencies": {
29
+ "@babel/cli": "7.24.1",
30
+ "@babel/core": "7.24.3",
31
+ "@babel/preset-env": "7.24.3",
32
+ "@babel/preset-typescript": "7.24.1",
33
+ "@webiny/api-i18n": "5.40.0-beta.3",
34
+ "@webiny/api-security": "5.40.0-beta.3",
35
+ "@webiny/api-tenancy": "5.40.0-beta.3",
36
+ "@webiny/api-wcp": "5.40.0-beta.3",
37
+ "@webiny/cli": "5.40.0-beta.3",
38
+ "@webiny/project-utils": "5.40.0-beta.3",
39
+ "graphql": "15.8.0",
40
+ "rimraf": "5.0.5",
41
+ "ttypescript": "1.5.15",
42
+ "type-fest": "2.19.0",
43
+ "typescript": "4.7.4"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public",
47
+ "directory": "dist"
48
+ },
49
+ "scripts": {
50
+ "build": "yarn webiny run build",
51
+ "watch": "yarn webiny run watch"
52
+ },
53
+ "gitHead": "638d8b84063906cd1aa979ed6e0487ad26fbcf2f",
54
+ "adio": {
55
+ "ignore": {
56
+ "src": [
57
+ "aws-lambda"
58
+ ],
59
+ "dependencies": [
60
+ "@types/aws-lambda"
61
+ ]
62
+ }
63
+ }
64
+ }
package/types.d.ts ADDED
@@ -0,0 +1,172 @@
1
+ import { CmsContext, CmsEntry, CmsEntryListParams, CmsEntryMeta, CmsError, CmsIdentity, CmsModel, CmsModelManager } from "@webiny/api-headless-cms/types";
2
+ import { Topic } from "@webiny/pubsub/types";
3
+ import { Context as IWebsocketsContext, IWebsocketsContextObject } from "@webiny/api-websockets/types";
4
+ export { CmsError, CmsEntry };
5
+ export declare type IRecordLockingIdentity = CmsIdentity;
6
+ export declare type IRecordLockingModelManager = CmsModelManager<IRecordLockingLockRecordValues>;
7
+ export declare type IRecordLockingMeta = CmsEntryMeta;
8
+ export interface IHasFullAccessCallable {
9
+ (): Promise<boolean>;
10
+ }
11
+ export interface IGetWebsocketsContextCallable {
12
+ (): IWebsocketsContextObject;
13
+ }
14
+ export interface IGetIdentity {
15
+ (): IRecordLockingIdentity;
16
+ }
17
+ export interface IRecordLockingLockRecordValues {
18
+ targetId: string;
19
+ type: IRecordLockingLockRecordEntryType;
20
+ actions?: IRecordLockingLockRecordAction[];
21
+ }
22
+ export declare enum IRecordLockingLockRecordActionType {
23
+ requested = "requested",
24
+ approved = "approved",
25
+ denied = "denied"
26
+ }
27
+ export interface IRecordLockingLockRecordRequestedAction {
28
+ type: IRecordLockingLockRecordActionType.requested;
29
+ message?: string;
30
+ createdOn: Date;
31
+ createdBy: IRecordLockingIdentity;
32
+ }
33
+ export interface IRecordLockingLockRecordApprovedAction {
34
+ type: IRecordLockingLockRecordActionType.approved;
35
+ message?: string;
36
+ createdOn: Date;
37
+ createdBy: IRecordLockingIdentity;
38
+ }
39
+ export interface IRecordLockingLockRecordDeniedAction {
40
+ type: IRecordLockingLockRecordActionType.denied;
41
+ message?: string;
42
+ createdOn: Date;
43
+ createdBy: IRecordLockingIdentity;
44
+ }
45
+ export declare type IRecordLockingLockRecordAction = IRecordLockingLockRecordRequestedAction | IRecordLockingLockRecordApprovedAction | IRecordLockingLockRecordDeniedAction;
46
+ export interface IRecordLockingLockRecordObject {
47
+ id: string;
48
+ targetId: string;
49
+ type: IRecordLockingLockRecordEntryType;
50
+ lockedBy: IRecordLockingIdentity;
51
+ lockedOn: Date;
52
+ updatedOn: Date;
53
+ expiresOn: Date;
54
+ actions?: IRecordLockingLockRecordAction[];
55
+ }
56
+ export interface IRecordLockingLockRecord extends IRecordLockingLockRecordObject {
57
+ toObject(): IRecordLockingLockRecordObject;
58
+ addAction(action: IRecordLockingLockRecordAction): void;
59
+ getUnlockRequested(): IRecordLockingLockRecordRequestedAction | undefined;
60
+ getUnlockApproved(): IRecordLockingLockRecordApprovedAction | undefined;
61
+ getUnlockDenied(): IRecordLockingLockRecordDeniedAction | undefined;
62
+ }
63
+ /**
64
+ * Do not use any special chars other than #, as we use this to create lock record IDs.
65
+ */
66
+ export declare type IRecordLockingLockRecordEntryType = string;
67
+ export declare type IRecordLockingListAllLockRecordsParams = Pick<CmsEntryListParams, "where" | "limit" | "sort" | "after">;
68
+ export declare type IRecordLockingListLockRecordsParams = IRecordLockingListAllLockRecordsParams;
69
+ export interface IRecordLockingListAllLockRecordsResponse {
70
+ items: IRecordLockingLockRecord[];
71
+ meta: IRecordLockingMeta;
72
+ }
73
+ export declare type IRecordLockingListLockRecordsResponse = IRecordLockingListAllLockRecordsResponse;
74
+ export interface IRecordLockingGetLockRecordParams {
75
+ id: string;
76
+ type: IRecordLockingLockRecordEntryType;
77
+ }
78
+ export interface IRecordLockingIsLockedParams {
79
+ id: string;
80
+ type: IRecordLockingLockRecordEntryType;
81
+ }
82
+ export interface IRecordLockingGetLockedEntryLockRecordParams {
83
+ id: string;
84
+ type: IRecordLockingLockRecordEntryType;
85
+ }
86
+ export interface IRecordLockingLockEntryParams {
87
+ id: string;
88
+ type: IRecordLockingLockRecordEntryType;
89
+ }
90
+ export interface IRecordLockingUpdateEntryLockParams {
91
+ id: string;
92
+ type: IRecordLockingLockRecordEntryType;
93
+ }
94
+ export interface IRecordLockingUnlockEntryParams {
95
+ id: string;
96
+ type: IRecordLockingLockRecordEntryType;
97
+ force?: boolean;
98
+ }
99
+ export interface IRecordLockingUnlockEntryRequestParams {
100
+ id: string;
101
+ type: IRecordLockingLockRecordEntryType;
102
+ }
103
+ export interface OnEntryBeforeLockTopicParams {
104
+ id: string;
105
+ type: IRecordLockingLockRecordEntryType;
106
+ }
107
+ export interface OnEntryAfterLockTopicParams {
108
+ id: string;
109
+ type: IRecordLockingLockRecordEntryType;
110
+ record: IRecordLockingLockRecord;
111
+ }
112
+ export interface OnEntryLockErrorTopicParams {
113
+ id: string;
114
+ type: IRecordLockingLockRecordEntryType;
115
+ error: CmsError;
116
+ }
117
+ export interface OnEntryBeforeUnlockTopicParams {
118
+ id: string;
119
+ type: IRecordLockingLockRecordEntryType;
120
+ getIdentity: IGetIdentity;
121
+ }
122
+ export interface OnEntryAfterUnlockTopicParams {
123
+ id: string;
124
+ type: IRecordLockingLockRecordEntryType;
125
+ record: IRecordLockingLockRecord;
126
+ }
127
+ export interface OnEntryUnlockErrorTopicParams {
128
+ id: string;
129
+ type: IRecordLockingLockRecordEntryType;
130
+ error: CmsError;
131
+ }
132
+ export interface OnEntryBeforeUnlockRequestTopicParams {
133
+ id: string;
134
+ type: IRecordLockingLockRecordEntryType;
135
+ }
136
+ export interface OnEntryAfterUnlockRequestTopicParams {
137
+ id: string;
138
+ type: IRecordLockingLockRecordEntryType;
139
+ record: IRecordLockingLockRecord;
140
+ }
141
+ export interface OnEntryUnlockRequestErrorTopicParams {
142
+ id: string;
143
+ type: IRecordLockingLockRecordEntryType;
144
+ error: CmsError;
145
+ }
146
+ export interface IRecordLocking {
147
+ onEntryBeforeLock: Topic<OnEntryBeforeLockTopicParams>;
148
+ onEntryAfterLock: Topic<OnEntryAfterLockTopicParams>;
149
+ onEntryLockError: Topic<OnEntryLockErrorTopicParams>;
150
+ onEntryBeforeUnlock: Topic<OnEntryBeforeUnlockTopicParams>;
151
+ onEntryAfterUnlock: Topic<OnEntryAfterUnlockTopicParams>;
152
+ onEntryUnlockError: Topic<OnEntryUnlockErrorTopicParams>;
153
+ onEntryBeforeUnlockRequest: Topic<OnEntryBeforeUnlockRequestTopicParams>;
154
+ onEntryAfterUnlockRequest: Topic<OnEntryAfterUnlockRequestTopicParams>;
155
+ onEntryUnlockRequestError: Topic<OnEntryUnlockRequestErrorTopicParams>;
156
+ getModel(): Promise<CmsModel>;
157
+ listAllLockRecords(params?: IRecordLockingListAllLockRecordsParams): Promise<IRecordLockingListAllLockRecordsResponse>;
158
+ /**
159
+ * Same call as listAllLockRecords, except this one will filter out records with expired lock.
160
+ */
161
+ listLockRecords(params?: IRecordLockingListLockRecordsParams): Promise<IRecordLockingListLockRecordsResponse>;
162
+ getLockRecord(params: IRecordLockingGetLockRecordParams): Promise<IRecordLockingLockRecord | null>;
163
+ isEntryLocked(params: IRecordLockingIsLockedParams): Promise<boolean>;
164
+ getLockedEntryLockRecord(params: IRecordLockingGetLockedEntryLockRecordParams): Promise<IRecordLockingLockRecord | null>;
165
+ lockEntry(params: IRecordLockingLockEntryParams): Promise<IRecordLockingLockRecord>;
166
+ updateEntryLock(params: IRecordLockingUpdateEntryLockParams): Promise<IRecordLockingLockRecord>;
167
+ unlockEntry(params: IRecordLockingUnlockEntryParams): Promise<IRecordLockingLockRecord>;
168
+ unlockEntryRequest(params: IRecordLockingUnlockEntryRequestParams): Promise<IRecordLockingLockRecord>;
169
+ }
170
+ export interface Context extends CmsContext, IWebsocketsContext {
171
+ recordLocking: IRecordLocking;
172
+ }
package/types.js ADDED
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "CmsEntry", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _types.CmsEntry;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "CmsError", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _types.CmsError;
16
+ }
17
+ });
18
+ exports.IRecordLockingLockRecordActionType = void 0;
19
+ var _types = require("@webiny/api-headless-cms/types");
20
+ let IRecordLockingLockRecordActionType = exports.IRecordLockingLockRecordActionType = /*#__PURE__*/function (IRecordLockingLockRecordActionType) {
21
+ IRecordLockingLockRecordActionType["requested"] = "requested";
22
+ IRecordLockingLockRecordActionType["approved"] = "approved";
23
+ IRecordLockingLockRecordActionType["denied"] = "denied";
24
+ return IRecordLockingLockRecordActionType;
25
+ }({});
26
+ /**
27
+ * Do not use any special chars other than #, as we use this to create lock record IDs.
28
+ */
29
+
30
+ //# sourceMappingURL=types.js.map