@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.
- package/LICENSE +21 -0
- package/README.md +10 -0
- package/abstractions/IGetLockRecordUseCase.d.ts +8 -0
- package/abstractions/IGetLockRecordUseCase.js +7 -0
- package/abstractions/IGetLockRecordUseCase.js.map +1 -0
- package/abstractions/IGetLockedEntryLockRecordUseCase.d.ts +8 -0
- package/abstractions/IGetLockedEntryLockRecordUseCase.js +7 -0
- package/abstractions/IGetLockedEntryLockRecordUseCase.js.map +1 -0
- package/abstractions/IIsEntryLocked.d.ts +8 -0
- package/abstractions/IIsEntryLocked.js +7 -0
- package/abstractions/IIsEntryLocked.js.map +1 -0
- package/abstractions/IKickOutCurrentUserUseCase.d.ts +5 -0
- package/abstractions/IKickOutCurrentUserUseCase.js +7 -0
- package/abstractions/IKickOutCurrentUserUseCase.js.map +1 -0
- package/abstractions/IListAllLockRecordsUseCase.d.ts +9 -0
- package/abstractions/IListAllLockRecordsUseCase.js +7 -0
- package/abstractions/IListAllLockRecordsUseCase.js.map +1 -0
- package/abstractions/IListLockRecordsUseCase.d.ts +10 -0
- package/abstractions/IListLockRecordsUseCase.js +7 -0
- package/abstractions/IListLockRecordsUseCase.js.map +1 -0
- package/abstractions/ILockEntryUseCase.d.ts +11 -0
- package/abstractions/ILockEntryUseCase.js +7 -0
- package/abstractions/ILockEntryUseCase.js.map +1 -0
- package/abstractions/IUnlockEntryRequestUseCase.d.ts +11 -0
- package/abstractions/IUnlockEntryRequestUseCase.js +7 -0
- package/abstractions/IUnlockEntryRequestUseCase.js.map +1 -0
- package/abstractions/IUnlockEntryUseCase.d.ts +12 -0
- package/abstractions/IUnlockEntryUseCase.js +7 -0
- package/abstractions/IUnlockEntryUseCase.js.map +1 -0
- package/abstractions/IUpdateEntryLockUseCase.d.ts +11 -0
- package/abstractions/IUpdateEntryLockUseCase.js +7 -0
- package/abstractions/IUpdateEntryLockUseCase.js.map +1 -0
- package/crud/crud.d.ts +6 -0
- package/crud/crud.js +188 -0
- package/crud/crud.js.map +1 -0
- package/crud/model.d.ts +2 -0
- package/crud/model.js +127 -0
- package/crud/model.js.map +1 -0
- package/graphql/schema.d.ts +7 -0
- package/graphql/schema.js +280 -0
- package/graphql/schema.js.map +1 -0
- package/index.d.ts +3 -0
- package/index.js +38 -0
- package/index.js.map +1 -0
- package/package.json +64 -0
- package/types.d.ts +172 -0
- package/types.js +30 -0
- package/types.js.map +1 -0
- package/useCases/GetLockRecord/GetLockRecordUseCase.d.ts +10 -0
- package/useCases/GetLockRecord/GetLockRecordUseCase.js +35 -0
- package/useCases/GetLockRecord/GetLockRecordUseCase.js.map +1 -0
- package/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase.d.ts +16 -0
- package/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase.js +27 -0
- package/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase.js.map +1 -0
- package/useCases/IsEntryLocked/IsEntryLockedUseCase.d.ts +16 -0
- package/useCases/IsEntryLocked/IsEntryLockedUseCase.js +35 -0
- package/useCases/IsEntryLocked/IsEntryLockedUseCase.js.map +1 -0
- package/useCases/KickOutCurrentUser/KickOutCurrentUserUseCase.d.ts +12 -0
- package/useCases/KickOutCurrentUser/KickOutCurrentUserUseCase.js +46 -0
- package/useCases/KickOutCurrentUser/KickOutCurrentUserUseCase.js.map +1 -0
- package/useCases/ListAllLockRecordsUseCase/ListAllLockRecordsUseCase.d.ts +10 -0
- package/useCases/ListAllLockRecordsUseCase/ListAllLockRecordsUseCase.js +32 -0
- package/useCases/ListAllLockRecordsUseCase/ListAllLockRecordsUseCase.js.map +1 -0
- package/useCases/ListLockRecordsUseCase/ListLockRecordsUseCase.d.ts +14 -0
- package/useCases/ListLockRecordsUseCase/ListLockRecordsUseCase.js +27 -0
- package/useCases/ListLockRecordsUseCase/ListLockRecordsUseCase.js.map +1 -0
- package/useCases/LockEntryUseCase/LockEntryUseCase.d.ts +13 -0
- package/useCases/LockEntryUseCase/LockEntryUseCase.js +51 -0
- package/useCases/LockEntryUseCase/LockEntryUseCase.js.map +1 -0
- package/useCases/UnlockEntryUseCase/UnlockEntryUseCase.d.ts +20 -0
- package/useCases/UnlockEntryUseCase/UnlockEntryUseCase.js +67 -0
- package/useCases/UnlockEntryUseCase/UnlockEntryUseCase.js.map +1 -0
- package/useCases/UnlockRequestUseCase/UnlockEntryRequestUseCase.d.ts +15 -0
- package/useCases/UnlockRequestUseCase/UnlockEntryRequestUseCase.js +78 -0
- package/useCases/UnlockRequestUseCase/UnlockEntryRequestUseCase.js.map +1 -0
- package/useCases/UpdateEntryLock/UpdateEntryLockUseCase.d.ts +18 -0
- package/useCases/UpdateEntryLock/UpdateEntryLockUseCase.js +48 -0
- package/useCases/UpdateEntryLock/UpdateEntryLockUseCase.js.map +1 -0
- package/useCases/index.d.ts +28 -0
- package/useCases/index.js +83 -0
- package/useCases/index.js.map +1 -0
- package/utils/calculateExpiresOn.d.ts +2 -0
- package/utils/calculateExpiresOn.js +15 -0
- package/utils/calculateExpiresOn.js.map +1 -0
- package/utils/checkPermissions.d.ts +7 -0
- package/utils/checkPermissions.js +21 -0
- package/utils/checkPermissions.js.map +1 -0
- package/utils/convertEntryToLockRecord.d.ts +28 -0
- package/utils/convertEntryToLockRecord.js +88 -0
- package/utils/convertEntryToLockRecord.js.map +1 -0
- package/utils/convertWhereCondition.d.ts +4 -0
- package/utils/convertWhereCondition.js +41 -0
- package/utils/convertWhereCondition.js.map +1 -0
- package/utils/getTimeout.d.ts +4 -0
- package/utils/getTimeout.js +20 -0
- package/utils/getTimeout.js.map +1 -0
- package/utils/isLockedFactory.d.ts +5 -0
- package/utils/isLockedFactory.js +20 -0
- package/utils/isLockedFactory.js.map +1 -0
- package/utils/lockRecordDatabaseId.d.ts +2 -0
- package/utils/lockRecordDatabaseId.js +24 -0
- package/utils/lockRecordDatabaseId.js.map +1 -0
- package/utils/resolve.d.ts +8 -0
- package/utils/resolve.js +30 -0
- package/utils/resolve.js.map +1 -0
- package/utils/validateSameIdentity.d.ts +6 -0
- package/utils/validateSameIdentity.js +24 -0
- 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
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
|