@webiny/api-record-locking 6.4.5-beta.0 → 6.6.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RecordLockingAppFeature.d.ts +11 -0
- package/RecordLockingAppFeature.js +18 -0
- package/RecordLockingAppFeature.js.map +1 -0
- package/domain/RecordLockingAppConfig.d.ts +4 -0
- package/domain/RecordLockingAppConfig.js +5 -0
- package/domain/RecordLockingAppConfig.js.map +1 -0
- package/features/KickOutCurrentUser/KickOutCurrentUserUseCase.d.ts +3 -3
- package/features/KickOutCurrentUser/KickOutCurrentUserUseCase.js +5 -11
- package/features/KickOutCurrentUser/KickOutCurrentUserUseCase.js.map +1 -1
- package/features/ListAllLockRecords/ListAllLockRecordsRepository.d.ts +4 -2
- package/features/ListAllLockRecords/ListAllLockRecordsRepository.js +9 -3
- package/features/ListAllLockRecords/ListAllLockRecordsRepository.js.map +1 -1
- package/features/ListLockRecords/ListLockRecordsRepository.d.ts +3 -1
- package/features/ListLockRecords/ListLockRecordsRepository.js +9 -3
- package/features/ListLockRecords/ListLockRecordsRepository.js.map +1 -1
- package/graphql/RecordLockingContextualSchema.d.ts +18 -0
- package/graphql/RecordLockingContextualSchema.js +77 -0
- package/graphql/RecordLockingContextualSchema.js.map +1 -0
- package/graphql/resolve.d.ts +1 -1
- package/graphql/resolve.js +1 -1
- package/graphql/resolve.js.map +1 -1
- package/graphql/schema.d.ts +1 -1
- package/graphql/schema.js +1 -1
- package/graphql/schema.js.map +1 -1
- package/index.d.ts +2 -9
- package/index.js +1 -60
- package/package.json +18 -15
- package/index.js.map +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Container } from "@webiny/feature/api";
|
|
2
|
+
export interface IRecordLockingAppFeatureParams {
|
|
3
|
+
/**
|
|
4
|
+
* A number of seconds after the last activity to wait before the record is automatically unlocked.
|
|
5
|
+
*/
|
|
6
|
+
timeout?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const RecordLockingAppFeature: {
|
|
9
|
+
name: string;
|
|
10
|
+
register(container: Container, context: IRecordLockingAppFeatureParams): void;
|
|
11
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { RecordLockingModel } from "./domain/RecordLockingModel.js";
|
|
3
|
+
import { RecordLockingAppConfig } from "./domain/RecordLockingAppConfig.js";
|
|
4
|
+
import { getTimeout } from "./utils/getTimeout.js";
|
|
5
|
+
import { RecordLockingContextualSchema } from "./graphql/RecordLockingContextualSchema.js";
|
|
6
|
+
const RecordLockingAppFeature = createFeature({
|
|
7
|
+
name: "RecordLockingApp",
|
|
8
|
+
register (container, params) {
|
|
9
|
+
container.register(RecordLockingModel);
|
|
10
|
+
container.registerInstance(RecordLockingAppConfig, {
|
|
11
|
+
timeout: getTimeout(params?.timeout)
|
|
12
|
+
});
|
|
13
|
+
container.register(RecordLockingContextualSchema);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
export { RecordLockingAppFeature };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=RecordLockingAppFeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordLockingAppFeature.js","sources":["../src/RecordLockingAppFeature.ts"],"sourcesContent":["import { type Container, createFeature } from \"@webiny/feature/api\";\nimport { RecordLockingModel } from \"~/domain/RecordLockingModel.js\";\nimport { RecordLockingAppConfig } from \"~/domain/RecordLockingAppConfig.js\";\nimport { getTimeout } from \"~/utils/getTimeout.js\";\nimport { RecordLockingContextualSchema } from \"~/graphql/RecordLockingContextualSchema.js\";\n\nexport interface IRecordLockingAppFeatureParams {\n /**\n * A number of seconds after the last activity to wait before the record is automatically unlocked.\n */\n timeout?: number;\n}\n\nexport const RecordLockingAppFeature = createFeature<IRecordLockingAppFeatureParams>({\n name: \"RecordLockingApp\",\n register(container: Container, params: IRecordLockingAppFeatureParams) {\n container.register(RecordLockingModel);\n container.registerInstance(RecordLockingAppConfig, {\n timeout: getTimeout(params?.timeout)\n });\n container.register(RecordLockingContextualSchema);\n }\n});\n"],"names":["RecordLockingAppFeature","createFeature","container","params","RecordLockingModel","RecordLockingAppConfig","getTimeout","RecordLockingContextualSchema"],"mappings":";;;;;AAaO,MAAMA,0BAA0BC,cAA8C;IACjF,MAAM;IACN,UAASC,SAAoB,EAAEC,MAAsC;QACjED,UAAU,QAAQ,CAACE;QACnBF,UAAU,gBAAgB,CAACG,wBAAwB;YAC/C,SAASC,WAAWH,QAAQ;QAChC;QACAD,UAAU,QAAQ,CAACK;IACvB;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain/RecordLockingAppConfig.js","sources":["../../src/domain/RecordLockingAppConfig.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\n\nexport interface IRecordLockingAppConfig {\n timeout: number;\n}\n\nexport const RecordLockingAppConfig =\n createAbstraction<IRecordLockingAppConfig>(\"RecordLockingAppConfig\");\n"],"names":["RecordLockingAppConfig","createAbstraction"],"mappings":";AAMO,MAAMA,yBACTC,kBAA2C"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
3
|
-
import {
|
|
3
|
+
import { WebsocketsSendToIdentityUseCase } from "@webiny/api-websockets/features/SendToIdentity/abstractions.js";
|
|
4
4
|
import { KickOutCurrentUserUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
5
5
|
import type { ILockRecord } from "../../domain/index.js";
|
|
6
6
|
declare class KickOutCurrentUserUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
7
7
|
private identityContext;
|
|
8
|
-
private
|
|
9
|
-
constructor(identityContext: IdentityContext.Interface,
|
|
8
|
+
private sendToIdentity;
|
|
9
|
+
constructor(identityContext: IdentityContext.Interface, sendToIdentity: WebsocketsSendToIdentityUseCase.Interface);
|
|
10
10
|
execute(record: ILockRecord): Promise<Result<void, UseCaseAbstraction.Error>>;
|
|
11
11
|
}
|
|
12
12
|
export declare const KickOutCurrentUserUseCase: typeof KickOutCurrentUserUseCaseImpl & {
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
3
|
-
import {
|
|
3
|
+
import { WebsocketsSendToIdentityUseCase } from "@webiny/api-websockets/features/SendToIdentity/abstractions.js";
|
|
4
4
|
import { parseIdentifier } from "@webiny/utils";
|
|
5
5
|
import { KickOutCurrentUserUseCase } from "./abstractions.js";
|
|
6
6
|
class KickOutCurrentUserUseCaseImpl {
|
|
7
|
-
constructor(identityContext,
|
|
7
|
+
constructor(identityContext, sendToIdentity){
|
|
8
8
|
this.identityContext = identityContext;
|
|
9
|
-
this.
|
|
9
|
+
this.sendToIdentity = sendToIdentity;
|
|
10
10
|
}
|
|
11
11
|
async execute(record) {
|
|
12
|
-
if (!this.websocketService) return Result.ok();
|
|
13
12
|
const { lockedBy, id } = record;
|
|
14
13
|
const { id: entryId } = parseIdentifier(id);
|
|
15
14
|
const identity = this.identityContext.getIdentity();
|
|
16
|
-
await this.
|
|
15
|
+
await this.sendToIdentity.execute({
|
|
17
16
|
id: lockedBy.id
|
|
18
17
|
}, {
|
|
19
18
|
action: `recordLocking.entry.kickOut.${entryId}`,
|
|
@@ -29,12 +28,7 @@ const KickOutCurrentUserUseCase_KickOutCurrentUserUseCase = KickOutCurrentUserUs
|
|
|
29
28
|
implementation: KickOutCurrentUserUseCaseImpl,
|
|
30
29
|
dependencies: [
|
|
31
30
|
IdentityContext,
|
|
32
|
-
|
|
33
|
-
WebsocketService,
|
|
34
|
-
{
|
|
35
|
-
optional: true
|
|
36
|
-
}
|
|
37
|
-
]
|
|
31
|
+
WebsocketsSendToIdentityUseCase
|
|
38
32
|
]
|
|
39
33
|
});
|
|
40
34
|
export { KickOutCurrentUserUseCase_KickOutCurrentUserUseCase as KickOutCurrentUserUseCase };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/KickOutCurrentUser/KickOutCurrentUserUseCase.js","sources":["../../../src/features/KickOutCurrentUser/KickOutCurrentUserUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"features/KickOutCurrentUser/KickOutCurrentUserUseCase.js","sources":["../../../src/features/KickOutCurrentUser/KickOutCurrentUserUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { WebsocketsSendToIdentityUseCase } from \"@webiny/api-websockets/features/SendToIdentity/abstractions.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { KickOutCurrentUserUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport type { ILockRecord } from \"~/domain/index.js\";\n\nclass KickOutCurrentUserUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n private sendToIdentity: WebsocketsSendToIdentityUseCase.Interface\n ) {}\n\n async execute(record: ILockRecord): Promise<Result<void, UseCaseAbstraction.Error>> {\n const { lockedBy, id } = record;\n\n const { id: entryId } = parseIdentifier(id);\n const identity = this.identityContext.getIdentity();\n\n await this.sendToIdentity.execute(\n { id: lockedBy.id },\n {\n action: `recordLocking.entry.kickOut.${entryId}`,\n data: {\n record: record.toObject(),\n user: identity\n }\n }\n );\n\n return Result.ok();\n }\n}\n\nexport const KickOutCurrentUserUseCase = UseCaseAbstraction.createImplementation({\n implementation: KickOutCurrentUserUseCaseImpl,\n dependencies: [IdentityContext, WebsocketsSendToIdentityUseCase]\n});\n"],"names":["KickOutCurrentUserUseCaseImpl","identityContext","sendToIdentity","record","lockedBy","id","entryId","parseIdentifier","identity","Result","KickOutCurrentUserUseCase","UseCaseAbstraction","IdentityContext","WebsocketsSendToIdentityUseCase"],"mappings":";;;;;AAOA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,cAAyD,CACnE;aAFUD,eAAe,GAAfA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QAAQC,MAAmB,EAAmD;QAChF,MAAM,EAAEC,QAAQ,EAAEC,EAAE,EAAE,GAAGF;QAEzB,MAAM,EAAE,IAAIG,OAAO,EAAE,GAAGC,gBAAgBF;QACxC,MAAMG,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;QAEjD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B;YAAE,IAAIJ,SAAS,EAAE;QAAC,GAClB;YACI,QAAQ,CAAC,4BAA4B,EAAEE,SAAS;YAChD,MAAM;gBACF,QAAQH,OAAO,QAAQ;gBACvB,MAAMK;YACV;QACJ;QAGJ,OAAOC,OAAO,EAAE;IACpB;AACJ;AAEO,MAAMC,sDAA4BC,0BAAAA,oBAAuC,CAAC;IAC7E,gBAAgBX;IAChB,cAAc;QAACY;QAAiBC;KAAgC;AACpE"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { ListAllLockRecordsRepository as RepositoryAbstraction, ListAllLockRecordsInput, ListAllLockRecordsOutput } from "./abstractions.js";
|
|
3
3
|
import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries";
|
|
4
|
-
import { RecordLockingConfig } from "../../domain/abstractions.js";
|
|
5
4
|
import type { CmsModel } from "@webiny/api-headless-cms/types";
|
|
5
|
+
import { CmsWhereMapper } from "@webiny/api-headless-cms";
|
|
6
|
+
import { RecordLockingConfig } from "../../domain/abstractions.js";
|
|
6
7
|
declare class ListAllLockRecordsRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
7
8
|
private config;
|
|
8
9
|
private listEntries;
|
|
9
10
|
private model;
|
|
10
|
-
|
|
11
|
+
private cmsWhereMapper;
|
|
12
|
+
constructor(config: RecordLockingConfig.Interface, listEntries: ListLatestEntriesUseCase.Interface, model: CmsModel, cmsWhereMapper: CmsWhereMapper.Interface);
|
|
11
13
|
execute(input?: ListAllLockRecordsInput): Promise<Result<ListAllLockRecordsOutput, RepositoryAbstraction.Error>>;
|
|
12
14
|
}
|
|
13
15
|
export declare const ListAllLockRecordsRepository: typeof ListAllLockRecordsRepositoryImpl & {
|
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { ListAllLockRecordsRepository } from "./abstractions.js";
|
|
3
3
|
import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries";
|
|
4
|
+
import { CmsWhereMapper } from "@webiny/api-headless-cms";
|
|
4
5
|
import { RecordLockingConfig, RecordLockingModel } from "../../domain/abstractions.js";
|
|
5
6
|
import { LockRecordPersistenceError } from "../../domain/errors.js";
|
|
6
7
|
import { convertWhereCondition } from "../../utils/convertWhereCondition.js";
|
|
7
8
|
import { LockRecord } from "../../domain/LockRecord.js";
|
|
8
9
|
class ListAllLockRecordsRepositoryImpl {
|
|
9
|
-
constructor(config, listEntries, model){
|
|
10
|
+
constructor(config, listEntries, model, cmsWhereMapper){
|
|
10
11
|
this.config = config;
|
|
11
12
|
this.listEntries = listEntries;
|
|
12
13
|
this.model = model;
|
|
14
|
+
this.cmsWhereMapper = cmsWhereMapper;
|
|
13
15
|
}
|
|
14
16
|
async execute(input) {
|
|
15
17
|
try {
|
|
16
18
|
const params = {
|
|
17
19
|
...input,
|
|
18
|
-
where:
|
|
20
|
+
where: this.cmsWhereMapper.map({
|
|
21
|
+
input: convertWhereCondition(input?.where),
|
|
22
|
+
fields: this.model.fields
|
|
23
|
+
})
|
|
19
24
|
};
|
|
20
25
|
const result = await this.listEntries.execute(this.model, params);
|
|
21
26
|
if (result.isFail()) return Result.fail(new LockRecordPersistenceError(result.error));
|
|
@@ -35,7 +40,8 @@ const ListAllLockRecordsRepository_ListAllLockRecordsRepository = ListAllLockRec
|
|
|
35
40
|
dependencies: [
|
|
36
41
|
RecordLockingConfig,
|
|
37
42
|
ListLatestEntriesUseCase,
|
|
38
|
-
RecordLockingModel
|
|
43
|
+
RecordLockingModel,
|
|
44
|
+
CmsWhereMapper
|
|
39
45
|
]
|
|
40
46
|
});
|
|
41
47
|
export { ListAllLockRecordsRepository_ListAllLockRecordsRepository as ListAllLockRecordsRepository };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/ListAllLockRecords/ListAllLockRecordsRepository.js","sources":["../../../src/features/ListAllLockRecords/ListAllLockRecordsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n ListAllLockRecordsRepository as RepositoryAbstraction,\n ListAllLockRecordsInput,\n ListAllLockRecordsOutput\n} from \"./abstractions.js\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport {
|
|
1
|
+
{"version":3,"file":"features/ListAllLockRecords/ListAllLockRecordsRepository.js","sources":["../../../src/features/ListAllLockRecords/ListAllLockRecordsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n ListAllLockRecordsRepository as RepositoryAbstraction,\n ListAllLockRecordsInput,\n ListAllLockRecordsOutput\n} from \"./abstractions.js\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { RecordLockingConfig, RecordLockingModel } from \"~/domain/abstractions.js\";\nimport { LockRecordPersistenceError } from \"~/domain/errors.js\";\nimport { convertWhereCondition } from \"~/utils/convertWhereCondition.js\";\nimport { LockRecord } from \"~/domain/LockRecord.js\";\nimport type { LockRecordValues } from \"~/domain/index.js\";\n\nclass ListAllLockRecordsRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private config: RecordLockingConfig.Interface,\n private listEntries: ListLatestEntriesUseCase.Interface,\n private model: CmsModel,\n private cmsWhereMapper: CmsWhereMapper.Interface\n ) {}\n\n async execute(\n input?: ListAllLockRecordsInput\n ): Promise<Result<ListAllLockRecordsOutput, RepositoryAbstraction.Error>> {\n try {\n const params = {\n ...input,\n where: this.cmsWhereMapper.map({\n input: convertWhereCondition(input?.where),\n fields: this.model.fields\n })\n };\n\n const result = await this.listEntries.execute<LockRecordValues>(this.model, params);\n\n if (result.isFail()) {\n return Result.fail(new LockRecordPersistenceError(result.error));\n }\n\n const { entries, meta } = result.value;\n\n const items = entries.map(entry => new LockRecord(entry, this.config.timeout));\n\n return Result.ok({\n items,\n meta\n });\n } catch (error) {\n return Result.fail(new LockRecordPersistenceError(error as Error));\n }\n }\n}\n\nexport const ListAllLockRecordsRepository = RepositoryAbstraction.createImplementation({\n implementation: ListAllLockRecordsRepositoryImpl,\n dependencies: [\n RecordLockingConfig,\n ListLatestEntriesUseCase,\n RecordLockingModel,\n CmsWhereMapper\n ]\n});\n"],"names":["ListAllLockRecordsRepositoryImpl","config","listEntries","model","cmsWhereMapper","input","params","convertWhereCondition","result","Result","LockRecordPersistenceError","entries","meta","items","entry","LockRecord","error","ListAllLockRecordsRepository","RepositoryAbstraction","RecordLockingConfig","ListLatestEntriesUseCase","RecordLockingModel","CmsWhereMapper"],"mappings":";;;;;;;;AAeA,MAAMA;IACF,YACYC,MAAqC,EACrCC,WAA+C,EAC/CC,KAAe,EACfC,cAAwC,CAClD;aAJUH,MAAM,GAANA;aACAC,WAAW,GAAXA;aACAC,KAAK,GAALA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QACFC,KAA+B,EACuC;QACtE,IAAI;YACA,MAAMC,SAAS;gBACX,GAAGD,KAAK;gBACR,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;oBAC3B,OAAOE,sBAAsBF,OAAO;oBACpC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM;gBAC7B;YACJ;YAEA,MAAMG,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAmB,IAAI,CAAC,KAAK,EAAEF;YAE5E,IAAIE,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAAC,IAAIC,2BAA2BF,OAAO,KAAK;YAGlE,MAAM,EAAEG,OAAO,EAAEC,IAAI,EAAE,GAAGJ,OAAO,KAAK;YAEtC,MAAMK,QAAQF,QAAQ,GAAG,CAACG,CAAAA,QAAS,IAAIC,WAAWD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;YAE5E,OAAOL,OAAO,EAAE,CAAC;gBACbI;gBACAD;YACJ;QACJ,EAAE,OAAOI,OAAO;YACZ,OAAOP,OAAO,IAAI,CAAC,IAAIC,2BAA2BM;QACtD;IACJ;AACJ;AAEO,MAAMC,4DAA+BC,6BAAAA,oBAA0C,CAAC;IACnF,gBAAgBlB;IAChB,cAAc;QACVmB;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -2,11 +2,13 @@ import { Result } from "@webiny/feature/api";
|
|
|
2
2
|
import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries";
|
|
3
3
|
import { ListLockRecordsRepository as RepositoryAbstraction, ListLockRecordsInput, ListLockRecordsOutput } from "./abstractions.js";
|
|
4
4
|
import { RecordLockingConfig, RecordLockingModel } from "../../domain/abstractions.js";
|
|
5
|
+
import { CmsWhereMapper } from "@webiny/api-headless-cms";
|
|
5
6
|
declare class ListLockRecordsRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
6
7
|
private model;
|
|
7
8
|
private config;
|
|
8
9
|
private listEntries;
|
|
9
|
-
|
|
10
|
+
private cmsWhereMapper;
|
|
11
|
+
constructor(model: RecordLockingModel.Interface, config: RecordLockingConfig.Interface, listEntries: ListLatestEntriesUseCase.Interface, cmsWhereMapper: CmsWhereMapper.Interface);
|
|
10
12
|
execute(input?: ListLockRecordsInput): Promise<Result<ListLockRecordsOutput, RepositoryAbstraction.Error>>;
|
|
11
13
|
}
|
|
12
14
|
export declare const ListLockRecordsRepository: typeof ListLockRecordsRepositoryImpl & {
|
|
@@ -4,18 +4,23 @@ import { ListLockRecordsRepository } from "./abstractions.js";
|
|
|
4
4
|
import { RecordLockingConfig, RecordLockingModel } from "../../domain/abstractions.js";
|
|
5
5
|
import { LockRecord } from "../../domain/LockRecord.js";
|
|
6
6
|
import { LockRecordPersistenceError } from "../../domain/errors.js";
|
|
7
|
+
import { CmsWhereMapper } from "@webiny/api-headless-cms";
|
|
7
8
|
import { convertWhereCondition } from "../../utils/convertWhereCondition.js";
|
|
8
9
|
class ListLockRecordsRepositoryImpl {
|
|
9
|
-
constructor(model, config, listEntries){
|
|
10
|
+
constructor(model, config, listEntries, cmsWhereMapper){
|
|
10
11
|
this.model = model;
|
|
11
12
|
this.config = config;
|
|
12
13
|
this.listEntries = listEntries;
|
|
14
|
+
this.cmsWhereMapper = cmsWhereMapper;
|
|
13
15
|
}
|
|
14
16
|
async execute(input) {
|
|
15
17
|
try {
|
|
16
18
|
const params = {
|
|
17
19
|
...input,
|
|
18
|
-
where:
|
|
20
|
+
where: this.cmsWhereMapper.map({
|
|
21
|
+
input: convertWhereCondition(input?.where),
|
|
22
|
+
fields: this.model.fields
|
|
23
|
+
})
|
|
19
24
|
};
|
|
20
25
|
const result = await this.listEntries.execute(this.model, params);
|
|
21
26
|
if (result.isFail()) return Result.fail(new LockRecordPersistenceError(result.error));
|
|
@@ -35,7 +40,8 @@ const ListLockRecordsRepository_ListLockRecordsRepository = ListLockRecordsRepos
|
|
|
35
40
|
dependencies: [
|
|
36
41
|
RecordLockingModel,
|
|
37
42
|
RecordLockingConfig,
|
|
38
|
-
ListLatestEntriesUseCase
|
|
43
|
+
ListLatestEntriesUseCase,
|
|
44
|
+
CmsWhereMapper
|
|
39
45
|
]
|
|
40
46
|
});
|
|
41
47
|
export { ListLockRecordsRepository_ListLockRecordsRepository as ListLockRecordsRepository };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/ListLockRecords/ListLockRecordsRepository.js","sources":["../../../src/features/ListLockRecords/ListLockRecordsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport {\n ListLockRecordsRepository as RepositoryAbstraction,\n ListLockRecordsInput,\n ListLockRecordsOutput\n} from \"./abstractions.js\";\nimport { RecordLockingConfig, RecordLockingModel } from \"~/domain/abstractions.js\";\nimport { LockRecord } from \"~/domain/LockRecord.js\";\nimport type { LockRecordValues } from \"~/domain/types.js\";\nimport { LockRecordPersistenceError } from \"~/domain/errors.js\";\nimport { convertWhereCondition } from \"~/utils/convertWhereCondition.js\";\n\nclass ListLockRecordsRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private model: RecordLockingModel.Interface,\n private config: RecordLockingConfig.Interface,\n private listEntries: ListLatestEntriesUseCase.Interface\n ) {}\n\n async execute(\n input?: ListLockRecordsInput\n ): Promise<Result<ListLockRecordsOutput, RepositoryAbstraction.Error>> {\n try {\n const params = {\n ...input,\n where: convertWhereCondition(input?.where
|
|
1
|
+
{"version":3,"file":"features/ListLockRecords/ListLockRecordsRepository.js","sources":["../../../src/features/ListLockRecords/ListLockRecordsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport {\n ListLockRecordsRepository as RepositoryAbstraction,\n ListLockRecordsInput,\n ListLockRecordsOutput\n} from \"./abstractions.js\";\nimport { RecordLockingConfig, RecordLockingModel } from \"~/domain/abstractions.js\";\nimport { LockRecord } from \"~/domain/LockRecord.js\";\nimport type { LockRecordValues } from \"~/domain/types.js\";\nimport { LockRecordPersistenceError } from \"~/domain/errors.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { convertWhereCondition } from \"~/utils/convertWhereCondition.js\";\n\nclass ListLockRecordsRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private model: RecordLockingModel.Interface,\n private config: RecordLockingConfig.Interface,\n private listEntries: ListLatestEntriesUseCase.Interface,\n private cmsWhereMapper: CmsWhereMapper.Interface\n ) {}\n\n async execute(\n input?: ListLockRecordsInput\n ): Promise<Result<ListLockRecordsOutput, RepositoryAbstraction.Error>> {\n try {\n const params = {\n ...input,\n where: this.cmsWhereMapper.map({\n input: convertWhereCondition(input?.where),\n fields: this.model.fields\n })\n };\n\n const result = await this.listEntries.execute<LockRecordValues>(this.model, params);\n\n if (result.isFail()) {\n return Result.fail(new LockRecordPersistenceError(result.error));\n }\n\n const { entries, meta } = result.value;\n\n const items = entries.map(entry => new LockRecord(entry, this.config.timeout));\n\n return Result.ok({\n items,\n meta\n });\n } catch (error) {\n return Result.fail(new LockRecordPersistenceError(error as Error));\n }\n }\n}\n\nexport const ListLockRecordsRepository = RepositoryAbstraction.createImplementation({\n implementation: ListLockRecordsRepositoryImpl,\n dependencies: [\n RecordLockingModel,\n RecordLockingConfig,\n ListLatestEntriesUseCase,\n CmsWhereMapper\n ]\n});\n"],"names":["ListLockRecordsRepositoryImpl","model","config","listEntries","cmsWhereMapper","input","params","convertWhereCondition","result","Result","LockRecordPersistenceError","entries","meta","items","entry","LockRecord","error","ListLockRecordsRepository","RepositoryAbstraction","RecordLockingModel","RecordLockingConfig","ListLatestEntriesUseCase","CmsWhereMapper"],"mappings":";;;;;;;;AAcA,MAAMA;IACF,YACYC,KAAmC,EACnCC,MAAqC,EACrCC,WAA+C,EAC/CC,cAAwC,CAClD;aAJUH,KAAK,GAALA;aACAC,MAAM,GAANA;aACAC,WAAW,GAAXA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QACFC,KAA4B,EACuC;QACnE,IAAI;YACA,MAAMC,SAAS;gBACX,GAAGD,KAAK;gBACR,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;oBAC3B,OAAOE,sBAAsBF,OAAO;oBACpC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM;gBAC7B;YACJ;YAEA,MAAMG,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAmB,IAAI,CAAC,KAAK,EAAEF;YAE5E,IAAIE,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAAC,IAAIC,2BAA2BF,OAAO,KAAK;YAGlE,MAAM,EAAEG,OAAO,EAAEC,IAAI,EAAE,GAAGJ,OAAO,KAAK;YAEtC,MAAMK,QAAQF,QAAQ,GAAG,CAACG,CAAAA,QAAS,IAAIC,WAAWD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;YAE5E,OAAOL,OAAO,EAAE,CAAC;gBACbI;gBACAD;YACJ;QACJ,EAAE,OAAOI,OAAO;YACZ,OAAOP,OAAO,IAAI,CAAC,IAAIC,2BAA2BM;QACtD;IACJ;AACJ;AAEO,MAAMC,sDAA4BC,0BAAAA,oBAA0C,CAAC;IAChF,gBAAgBlB;IAChB,cAAc;QACVmB;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { GraphQLSchema } from "graphql";
|
|
2
|
+
import type { IGraphQLContextualSchema } from "@webiny/api-graphql";
|
|
3
|
+
import { WcpContext } from "@webiny/api-core/features/wcp/WcpContext/index.js";
|
|
4
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
5
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
6
|
+
import { type IRecordLockingAppConfig } from "../domain/RecordLockingAppConfig.js";
|
|
7
|
+
declare class RecordLockingContextualSchemaImpl implements IGraphQLContextualSchema {
|
|
8
|
+
private wcp;
|
|
9
|
+
private tenantCtx;
|
|
10
|
+
private identityCtx;
|
|
11
|
+
private config;
|
|
12
|
+
constructor(wcp: WcpContext.Interface, tenantCtx: TenantContext.Interface, identityCtx: IdentityContext.Interface, config: IRecordLockingAppConfig);
|
|
13
|
+
build(ctx: Record<string, any>): Promise<GraphQLSchema>;
|
|
14
|
+
}
|
|
15
|
+
export declare const RecordLockingContextualSchema: typeof RecordLockingContextualSchemaImpl & {
|
|
16
|
+
__abstraction: import("@webiny/di").Abstraction<IGraphQLContextualSchema>;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
2
|
+
import { mergeResolvers } from "@graphql-tools/merge";
|
|
3
|
+
import { GraphQLContextualSchema } from "@webiny/api-graphql";
|
|
4
|
+
import { WcpContext } from "@webiny/api-core/features/wcp/WcpContext/index.js";
|
|
5
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
6
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
7
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel";
|
|
8
|
+
import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels";
|
|
9
|
+
import { CmsModelFieldToGraphQLRegistry } from "@webiny/api-headless-cms/exports/api/cms/graphql.js";
|
|
10
|
+
import { createBaseContentSchema } from "@webiny/api-headless-cms/graphql/schema/baseContentSchema.js";
|
|
11
|
+
import { RECORD_LOCKING_MODEL_ID } from "../domain/RecordLockingModel.js";
|
|
12
|
+
import { RecordLockingAppConfig } from "../domain/RecordLockingAppConfig.js";
|
|
13
|
+
import { RecordLockingFeature } from "../features/RecordLockingFeature.js";
|
|
14
|
+
import { createGraphQLSchema } from "./schema.js";
|
|
15
|
+
class RecordLockingContextualSchemaImpl {
|
|
16
|
+
constructor(wcp, tenantCtx, identityCtx, config){
|
|
17
|
+
this.wcp = wcp;
|
|
18
|
+
this.tenantCtx = tenantCtx;
|
|
19
|
+
this.identityCtx = identityCtx;
|
|
20
|
+
this.config = config;
|
|
21
|
+
}
|
|
22
|
+
async build(ctx) {
|
|
23
|
+
if (!this.wcp.canUseRecordLocking() || !this.tenantCtx.getTenant()) return makeExecutableSchema({
|
|
24
|
+
typeDefs: "type Query\ntype Mutation",
|
|
25
|
+
assumeValidSDL: true
|
|
26
|
+
});
|
|
27
|
+
const container = ctx.container;
|
|
28
|
+
const getModel = container.resolve(GetModelUseCase);
|
|
29
|
+
const listModels = container.resolve(ListModelsUseCase);
|
|
30
|
+
const fieldRegistry = container.resolve(CmsModelFieldToGraphQLRegistry);
|
|
31
|
+
const [model, publicModels] = await this.identityCtx.withoutAuthorization(async ()=>{
|
|
32
|
+
const [modelResult, publicModelsResult] = await Promise.all([
|
|
33
|
+
getModel.execute(RECORD_LOCKING_MODEL_ID),
|
|
34
|
+
listModels.execute({
|
|
35
|
+
includePrivate: false
|
|
36
|
+
})
|
|
37
|
+
]);
|
|
38
|
+
return [
|
|
39
|
+
modelResult.value,
|
|
40
|
+
publicModelsResult.value
|
|
41
|
+
];
|
|
42
|
+
});
|
|
43
|
+
RecordLockingFeature.register(container, {
|
|
44
|
+
timeout: this.config.timeout,
|
|
45
|
+
model
|
|
46
|
+
});
|
|
47
|
+
const plugin = await createGraphQLSchema({
|
|
48
|
+
model,
|
|
49
|
+
models: publicModels,
|
|
50
|
+
fieldRegistry
|
|
51
|
+
});
|
|
52
|
+
const baseContent = createBaseContentSchema();
|
|
53
|
+
return makeExecutableSchema({
|
|
54
|
+
typeDefs: [
|
|
55
|
+
baseContent.schema.typeDefs,
|
|
56
|
+
plugin.schema.typeDefs
|
|
57
|
+
],
|
|
58
|
+
resolvers: mergeResolvers([
|
|
59
|
+
baseContent.schema.resolvers,
|
|
60
|
+
plugin.schema.resolvers
|
|
61
|
+
]),
|
|
62
|
+
inheritResolversFromInterfaces: true
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const RecordLockingContextualSchema = GraphQLContextualSchema.createImplementation({
|
|
67
|
+
implementation: RecordLockingContextualSchemaImpl,
|
|
68
|
+
dependencies: [
|
|
69
|
+
WcpContext,
|
|
70
|
+
TenantContext,
|
|
71
|
+
IdentityContext,
|
|
72
|
+
RecordLockingAppConfig
|
|
73
|
+
]
|
|
74
|
+
});
|
|
75
|
+
export { RecordLockingContextualSchema };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=RecordLockingContextualSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql/RecordLockingContextualSchema.js","sources":["../../src/graphql/RecordLockingContextualSchema.ts"],"sourcesContent":["import type { Container } from \"@webiny/di\";\nimport type { GraphQLSchema } from \"graphql\";\nimport { makeExecutableSchema } from \"@graphql-tools/schema\";\nimport { mergeResolvers } from \"@graphql-tools/merge\";\nimport { GraphQLContextualSchema } from \"@webiny/api-graphql\";\nimport type { IGraphQLContextualSchema } from \"@webiny/api-graphql\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels\";\nimport { CmsModelFieldToGraphQLRegistry } from \"@webiny/api-headless-cms/exports/api/cms/graphql.js\";\nimport { createBaseContentSchema } from \"@webiny/api-headless-cms/graphql/schema/baseContentSchema.js\";\nimport { RECORD_LOCKING_MODEL_ID } from \"~/domain/RecordLockingModel.js\";\nimport {\n RecordLockingAppConfig,\n type IRecordLockingAppConfig\n} from \"~/domain/RecordLockingAppConfig.js\";\nimport { RecordLockingFeature } from \"~/features/RecordLockingFeature.js\";\nimport { createGraphQLSchema } from \"~/graphql/schema.js\";\n\nclass RecordLockingContextualSchemaImpl implements IGraphQLContextualSchema {\n constructor(\n private wcp: WcpContext.Interface,\n private tenantCtx: TenantContext.Interface,\n private identityCtx: IdentityContext.Interface,\n private config: IRecordLockingAppConfig\n ) {}\n\n async build(ctx: Record<string, any>): Promise<GraphQLSchema> {\n if (!this.wcp.canUseRecordLocking() || !this.tenantCtx.getTenant()) {\n return makeExecutableSchema({\n typeDefs: \"type Query\\ntype Mutation\",\n assumeValidSDL: true\n });\n }\n\n const container = ctx.container as Container;\n\n // Resolve the CMS use-cases lazily here (at build/request time) rather than as\n // constructor dependencies. They depend on AccessControl/CmsContext, which the CMS\n // initializer only registers during its own build() — so injecting them eagerly would\n // fail when the engine constructs all contextual schemas before any build() has run.\n const getModel = container.resolve(GetModelUseCase);\n const listModels = container.resolve(ListModelsUseCase);\n const fieldRegistry = container.resolve(CmsModelFieldToGraphQLRegistry);\n\n const [model, publicModels] = await this.identityCtx.withoutAuthorization(async () => {\n const [modelResult, publicModelsResult] = await Promise.all([\n getModel.execute(RECORD_LOCKING_MODEL_ID),\n listModels.execute({ includePrivate: false })\n ]);\n\n return [modelResult.value, publicModelsResult.value];\n });\n\n RecordLockingFeature.register(container, {\n timeout: this.config.timeout,\n model\n });\n\n const plugin = await createGraphQLSchema({\n model,\n models: publicModels,\n fieldRegistry\n });\n\n // The generated record-locking model schema references CMS base scalars (DateTime, JSON,\n // etc.). Include createBaseContentSchema() — which declares those scalars and their\n // resolvers — exactly as the normal CMS schema build (buildSchemaPlugins) does, so this\n // standalone schema is self-contained and valid before it is merged by the engine.\n const baseContent = createBaseContentSchema();\n\n return makeExecutableSchema({\n typeDefs: [baseContent.schema.typeDefs as string, plugin.schema.typeDefs as string],\n resolvers: mergeResolvers([\n baseContent.schema.resolvers as any,\n plugin.schema.resolvers as any\n ]),\n inheritResolversFromInterfaces: true\n });\n }\n}\n\nexport const RecordLockingContextualSchema = GraphQLContextualSchema.createImplementation({\n implementation: RecordLockingContextualSchemaImpl,\n dependencies: [WcpContext, TenantContext, IdentityContext, RecordLockingAppConfig]\n});\n"],"names":["RecordLockingContextualSchemaImpl","wcp","tenantCtx","identityCtx","config","ctx","makeExecutableSchema","container","getModel","GetModelUseCase","listModels","ListModelsUseCase","fieldRegistry","CmsModelFieldToGraphQLRegistry","model","publicModels","modelResult","publicModelsResult","Promise","RECORD_LOCKING_MODEL_ID","RecordLockingFeature","plugin","createGraphQLSchema","baseContent","createBaseContentSchema","mergeResolvers","RecordLockingContextualSchema","GraphQLContextualSchema","WcpContext","TenantContext","IdentityContext","RecordLockingAppConfig"],"mappings":";;;;;;;;;;;;;;AAqBA,MAAMA;IACF,YACYC,GAAyB,EACzBC,SAAkC,EAClCC,WAAsC,EACtCC,MAA+B,CACzC;aAJUH,GAAG,GAAHA;aACAC,SAAS,GAATA;aACAC,WAAW,GAAXA;aACAC,MAAM,GAANA;IACT;IAEH,MAAM,MAAMC,GAAwB,EAA0B;QAC1D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,IAC5D,OAAOC,qBAAqB;YACxB,UAAU;YACV,gBAAgB;QACpB;QAGJ,MAAMC,YAAYF,IAAI,SAAS;QAM/B,MAAMG,WAAWD,UAAU,OAAO,CAACE;QACnC,MAAMC,aAAaH,UAAU,OAAO,CAACI;QACrC,MAAMC,gBAAgBL,UAAU,OAAO,CAACM;QAExC,MAAM,CAACC,OAAOC,aAAa,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC;YACtE,MAAM,CAACC,aAAaC,mBAAmB,GAAG,MAAMC,QAAQ,GAAG,CAAC;gBACxDV,SAAS,OAAO,CAACW;gBACjBT,WAAW,OAAO,CAAC;oBAAE,gBAAgB;gBAAM;aAC9C;YAED,OAAO;gBAACM,YAAY,KAAK;gBAAEC,mBAAmB,KAAK;aAAC;QACxD;QAEAG,qBAAqB,QAAQ,CAACb,WAAW;YACrC,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5BO;QACJ;QAEA,MAAMO,SAAS,MAAMC,oBAAoB;YACrCR;YACA,QAAQC;YACRH;QACJ;QAMA,MAAMW,cAAcC;QAEpB,OAAOlB,qBAAqB;YACxB,UAAU;gBAACiB,YAAY,MAAM,CAAC,QAAQ;gBAAYF,OAAO,MAAM,CAAC,QAAQ;aAAW;YACnF,WAAWI,eAAe;gBACtBF,YAAY,MAAM,CAAC,SAAS;gBAC5BF,OAAO,MAAM,CAAC,SAAS;aAC1B;YACD,gCAAgC;QACpC;IACJ;AACJ;AAEO,MAAMK,gCAAgCC,wBAAwB,oBAAoB,CAAC;IACtF,gBAAgB3B;IAChB,cAAc;QAAC4B;QAAYC;QAAeC;QAAiBC;KAAuB;AACtF"}
|
package/graphql/resolve.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ErrorResponse, Response } from "@webiny/
|
|
1
|
+
import { ErrorResponse, Response } from "@webiny/api-graphql";
|
|
2
2
|
import type { IRecordLockingMeta } from "../types.js";
|
|
3
3
|
export declare const resolve: <T>(cb: () => Promise<T>) => Promise<Response<T> | ErrorResponse>;
|
|
4
4
|
export interface IListResponse<T> {
|
package/graphql/resolve.js
CHANGED
package/graphql/resolve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql/resolve.js","sources":["../../src/graphql/resolve.ts"],"sourcesContent":["import { ErrorResponse, ListErrorResponse, ListResponse, Response } from \"@webiny/
|
|
1
|
+
{"version":3,"file":"graphql/resolve.js","sources":["../../src/graphql/resolve.ts"],"sourcesContent":["import { ErrorResponse, ListErrorResponse, ListResponse, Response } from \"@webiny/api-graphql\";\nimport type { IRecordLockingMeta } from \"~/types.js\";\n\nexport const resolve = async <T>(cb: () => Promise<T>): Promise<Response<T> | ErrorResponse> => {\n try {\n const result = await cb();\n return new Response<T>(result);\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n};\n\nexport interface IListResponse<T> {\n items: T[];\n meta: IRecordLockingMeta;\n}\n\nexport const resolveList = async <T>(\n cb: () => Promise<IListResponse<T>>\n): Promise<Response<T[]> | ErrorResponse> => {\n try {\n const { items, meta } = await cb();\n return new ListResponse(items, meta);\n } catch (ex) {\n return new ListErrorResponse(ex);\n }\n};\n"],"names":["resolve","cb","result","Response","ex","ErrorResponse","resolveList","items","meta","ListResponse","ListErrorResponse"],"mappings":";AAGO,MAAMA,UAAU,OAAUC;IAC7B,IAAI;QACA,MAAMC,SAAS,MAAMD;QACrB,OAAO,IAAIE,SAAYD;IAC3B,EAAE,OAAOE,IAAI;QACT,OAAO,IAAIC,cAAcD;IAC7B;AACJ;AAOO,MAAME,cAAc,OACvBL;IAEA,IAAI;QACA,MAAM,EAAEM,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMP;QAC9B,OAAO,IAAIQ,aAAaF,OAAOC;IACnC,EAAE,OAAOJ,IAAI;QACT,OAAO,IAAIM,kBAAkBN;IACjC;AACJ"}
|
package/graphql/schema.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IGraphQLSchemaPlugin } from "@webiny/
|
|
1
|
+
import type { IGraphQLSchemaPlugin } from "@webiny/api-graphql";
|
|
2
2
|
import type { ApiCoreContext } from "@webiny/api-core/types/core.js";
|
|
3
3
|
import { CmsModel } from "@webiny/api-headless-cms/types/model.js";
|
|
4
4
|
import type { CmsModelFieldToGraphQLRegistry } from "@webiny/api-headless-cms/exports/api/cms/graphql.js";
|
package/graphql/schema.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolve, resolveList } from "./resolve.js";
|
|
2
|
-
import { createGraphQLSchemaPlugin } from "@webiny/
|
|
2
|
+
import { createGraphQLSchemaPlugin } from "@webiny/api-graphql";
|
|
3
3
|
import { renderFields } from "@webiny/api-headless-cms/utils/renderFields.js";
|
|
4
4
|
import { renderListFilterFields } from "@webiny/api-headless-cms/utils/renderListFilterFields.js";
|
|
5
5
|
import { renderSortEnum } from "@webiny/api-headless-cms/utils/renderSortEnum.js";
|
package/graphql/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql/schema.js","sources":["../../src/graphql/schema.ts"],"sourcesContent":["import { resolve, resolveList } from \"./resolve.js\";\nimport type { IGraphQLSchemaPlugin } from \"@webiny/handler-graphql\";\nimport { createGraphQLSchemaPlugin } from \"@webiny/handler-graphql\";\nimport { renderFields } from \"@webiny/api-headless-cms/utils/renderFields.js\";\nimport { renderListFilterFields } from \"@webiny/api-headless-cms/utils/renderListFilterFields.js\";\nimport { renderSortEnum } from \"@webiny/api-headless-cms/utils/renderSortEnum.js\";\nimport { checkPermissions } from \"./checkPermissions.js\";\nimport { IsEntryLockedUseCase } from \"~/features/IsEntryLocked/abstractions.js\";\nimport { GetLockRecordUseCase } from \"~/features/GetLockRecord/abstractions.js\";\nimport { GetLockedEntryLockRecordUseCase } from \"~/features/GetLockedEntryLockRecord/abstractions.js\";\nimport { ListLockRecordsUseCase } from \"~/features/ListLockRecords/abstractions.js\";\nimport { ListAllLockRecordsUseCase } from \"~/features/ListAllLockRecords/abstractions.js\";\nimport { LockEntryUseCase } from \"~/features/LockEntry/abstractions.js\";\nimport { UpdateEntryLockUseCase } from \"~/features/UpdateEntryLock/abstractions.js\";\nimport { UnlockEntryUseCase } from \"~/features/UnlockEntry/abstractions.js\";\nimport { UnlockEntryRequestUseCase } from \"~/features/UnlockEntryRequest/abstractions.js\";\nimport type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { CmsModel } from \"@webiny/api-headless-cms/types/model.js\";\nimport type { CmsModelFieldToGraphQLRegistry } from \"@webiny/api-headless-cms/exports/api/cms/graphql.js\";\n\ninterface Params {\n model: CmsModel;\n models: CmsModel[];\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n}\nexport const createGraphQLSchema = async (\n params: Params\n): Promise<IGraphQLSchemaPlugin<ApiCoreContext>> => {\n const model = params.model;\n\n const models = params.models.filter(model => {\n return model.fields.length > 0;\n });\n\n const fieldRegistry = params.fieldRegistry;\n\n const recordLockingFields = renderFields({\n models,\n model,\n fields: model.fields,\n type: \"manage\",\n fieldRegistry\n });\n\n const listFilterFieldsRender = renderListFilterFields({\n model,\n fields: model.fields,\n type: \"manage\",\n fieldRegistry,\n excludeFields: [\"entryId\"]\n });\n\n const sortEnumRender = renderSortEnum({\n model,\n fields: model.fields,\n fieldRegistry,\n sorters: []\n });\n\n const plugin = createGraphQLSchemaPlugin<ApiCoreContext>({\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.allFiltersAsString()}\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 const useCase = context.container.resolve(IsEntryLockedUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n async getLockRecord(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(GetLockRecordUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n async getLockedEntryLockRecord(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(GetLockedEntryLockRecordUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n // Returns null if not found/expired/locked by current user\n if (result.isFail()) {\n return null;\n }\n return result.value;\n });\n },\n\n async listLockRecords(_, args, context) {\n return resolveList(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(ListLockRecordsUseCase);\n const result = await useCase.execute(args);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n listAllLockRecords(_, args, context) {\n return resolveList(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(ListAllLockRecordsUseCase);\n const result = await useCase.execute(args);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n }\n },\n RecordLockingMutation: {\n async lockEntry(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(LockEntryUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n async updateEntryLock(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(UpdateEntryLockUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n async unlockEntry(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(UnlockEntryUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type,\n force: args.force\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n async unlockEntryRequest(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(UnlockEntryRequestUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n }\n }\n }\n });\n\n plugin.name = \"recordLocking.graphql.schema.locking\";\n\n return plugin;\n};\n"],"names":["createGraphQLSchema","params","model","models","fieldRegistry","recordLockingFields","renderFields","listFilterFieldsRender","renderListFilterFields","sortEnumRender","renderSortEnum","plugin","createGraphQLSchemaPlugin","f","_","args","context","resolve","checkPermissions","useCase","IsEntryLockedUseCase","result","GetLockRecordUseCase","GetLockedEntryLockRecordUseCase","resolveList","ListLockRecordsUseCase","ListAllLockRecordsUseCase","LockEntryUseCase","UpdateEntryLockUseCase","UnlockEntryUseCase","UnlockEntryRequestUseCase"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"graphql/schema.js","sources":["../../src/graphql/schema.ts"],"sourcesContent":["import { resolve, resolveList } from \"./resolve.js\";\nimport type { IGraphQLSchemaPlugin } from \"@webiny/api-graphql\";\nimport { createGraphQLSchemaPlugin } from \"@webiny/api-graphql\";\nimport { renderFields } from \"@webiny/api-headless-cms/utils/renderFields.js\";\nimport { renderListFilterFields } from \"@webiny/api-headless-cms/utils/renderListFilterFields.js\";\nimport { renderSortEnum } from \"@webiny/api-headless-cms/utils/renderSortEnum.js\";\nimport { checkPermissions } from \"./checkPermissions.js\";\nimport { IsEntryLockedUseCase } from \"~/features/IsEntryLocked/abstractions.js\";\nimport { GetLockRecordUseCase } from \"~/features/GetLockRecord/abstractions.js\";\nimport { GetLockedEntryLockRecordUseCase } from \"~/features/GetLockedEntryLockRecord/abstractions.js\";\nimport { ListLockRecordsUseCase } from \"~/features/ListLockRecords/abstractions.js\";\nimport { ListAllLockRecordsUseCase } from \"~/features/ListAllLockRecords/abstractions.js\";\nimport { LockEntryUseCase } from \"~/features/LockEntry/abstractions.js\";\nimport { UpdateEntryLockUseCase } from \"~/features/UpdateEntryLock/abstractions.js\";\nimport { UnlockEntryUseCase } from \"~/features/UnlockEntry/abstractions.js\";\nimport { UnlockEntryRequestUseCase } from \"~/features/UnlockEntryRequest/abstractions.js\";\nimport type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { CmsModel } from \"@webiny/api-headless-cms/types/model.js\";\nimport type { CmsModelFieldToGraphQLRegistry } from \"@webiny/api-headless-cms/exports/api/cms/graphql.js\";\n\ninterface Params {\n model: CmsModel;\n models: CmsModel[];\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n}\nexport const createGraphQLSchema = async (\n params: Params\n): Promise<IGraphQLSchemaPlugin<ApiCoreContext>> => {\n const model = params.model;\n\n const models = params.models.filter(model => {\n return model.fields.length > 0;\n });\n\n const fieldRegistry = params.fieldRegistry;\n\n const recordLockingFields = renderFields({\n models,\n model,\n fields: model.fields,\n type: \"manage\",\n fieldRegistry\n });\n\n const listFilterFieldsRender = renderListFilterFields({\n model,\n fields: model.fields,\n type: \"manage\",\n fieldRegistry,\n excludeFields: [\"entryId\"]\n });\n\n const sortEnumRender = renderSortEnum({\n model,\n fields: model.fields,\n fieldRegistry,\n sorters: []\n });\n\n const plugin = createGraphQLSchemaPlugin<ApiCoreContext>({\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.allFiltersAsString()}\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 const useCase = context.container.resolve(IsEntryLockedUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n async getLockRecord(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(GetLockRecordUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n async getLockedEntryLockRecord(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(GetLockedEntryLockRecordUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n // Returns null if not found/expired/locked by current user\n if (result.isFail()) {\n return null;\n }\n return result.value;\n });\n },\n\n async listLockRecords(_, args, context) {\n return resolveList(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(ListLockRecordsUseCase);\n const result = await useCase.execute(args);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n listAllLockRecords(_, args, context) {\n return resolveList(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(ListAllLockRecordsUseCase);\n const result = await useCase.execute(args);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n }\n },\n RecordLockingMutation: {\n async lockEntry(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(LockEntryUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n async updateEntryLock(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(UpdateEntryLockUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n async unlockEntry(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(UnlockEntryUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type,\n force: args.force\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n },\n async unlockEntryRequest(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const useCase = context.container.resolve(UnlockEntryRequestUseCase);\n const result = await useCase.execute({\n id: args.id,\n type: args.type\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n }\n }\n }\n });\n\n plugin.name = \"recordLocking.graphql.schema.locking\";\n\n return plugin;\n};\n"],"names":["createGraphQLSchema","params","model","models","fieldRegistry","recordLockingFields","renderFields","listFilterFieldsRender","renderListFilterFields","sortEnumRender","renderSortEnum","plugin","createGraphQLSchemaPlugin","f","_","args","context","resolve","checkPermissions","useCase","IsEntryLockedUseCase","result","GetLockRecordUseCase","GetLockedEntryLockRecordUseCase","resolveList","ListLockRecordsUseCase","ListAllLockRecordsUseCase","LockEntryUseCase","UpdateEntryLockUseCase","UnlockEntryUseCase","UnlockEntryRequestUseCase"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export interface ICreateContextPluginParams {
|
|
4
|
-
/**
|
|
5
|
-
* A number of seconds after the last activity to wait before the record is automatically unlocked.
|
|
6
|
-
*/
|
|
7
|
-
timeout?: number;
|
|
8
|
-
}
|
|
9
|
-
export declare const createRecordLocking: (params?: ICreateContextPluginParams) => (ContextPlugin<ApiCoreContext> | import("@webiny/handler").RegisterExtensionPlugin<import("@webiny/handler/types").Context>)[];
|
|
1
|
+
export { RecordLockingAppFeature } from "./RecordLockingAppFeature.js";
|
|
2
|
+
export type { IRecordLockingAppFeatureParams } from "./RecordLockingAppFeature.js";
|
package/index.js
CHANGED
|
@@ -1,60 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { createRegisterExtensionPlugin } from "@webiny/handler";
|
|
3
|
-
import { WcpContext } from "@webiny/api-core/features/wcp/WcpContext/index.js";
|
|
4
|
-
import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels";
|
|
5
|
-
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel";
|
|
6
|
-
import { RECORD_LOCKING_MODEL_ID, RecordLockingModel } from "./domain/RecordLockingModel.js";
|
|
7
|
-
import { getTimeout } from "./utils/getTimeout.js";
|
|
8
|
-
import { RecordLockingFeature } from "./features/RecordLockingFeature.js";
|
|
9
|
-
import { createGraphQLSchema } from "./graphql/schema.js";
|
|
10
|
-
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
11
|
-
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
12
|
-
import { CmsModelFieldToGraphQLRegistry } from "@webiny/api-headless-cms/exports/api/cms/graphql.js";
|
|
13
|
-
const createContextPlugin = (params)=>{
|
|
14
|
-
const recordLockingContextPlugin = new ContextPlugin(async (context)=>{
|
|
15
|
-
const tenantContext = context.container.resolve(TenantContext);
|
|
16
|
-
const identityContext = context.container.resolve(IdentityContext);
|
|
17
|
-
const wcp = context.container.resolve(WcpContext);
|
|
18
|
-
const getModel = context.container.resolve(GetModelUseCase);
|
|
19
|
-
const listModels = context.container.resolve(ListModelsUseCase);
|
|
20
|
-
if (!wcp.canUseRecordLocking() || !tenantContext.getTenant()) return;
|
|
21
|
-
const timeout = getTimeout(params?.timeout);
|
|
22
|
-
const [model, publicModels] = await identityContext.withoutAuthorization(async ()=>{
|
|
23
|
-
const [model, publicModels] = await Promise.all([
|
|
24
|
-
getModel.execute(RECORD_LOCKING_MODEL_ID),
|
|
25
|
-
listModels.execute({
|
|
26
|
-
includePrivate: false
|
|
27
|
-
})
|
|
28
|
-
]);
|
|
29
|
-
return [
|
|
30
|
-
model.value,
|
|
31
|
-
publicModels.value
|
|
32
|
-
];
|
|
33
|
-
});
|
|
34
|
-
const fieldRegistry = context.container.resolve(CmsModelFieldToGraphQLRegistry);
|
|
35
|
-
const graphQlPlugin = await createGraphQLSchema({
|
|
36
|
-
model,
|
|
37
|
-
models: publicModels,
|
|
38
|
-
fieldRegistry
|
|
39
|
-
});
|
|
40
|
-
context.plugins.register(graphQlPlugin);
|
|
41
|
-
RecordLockingFeature.register(context.container, {
|
|
42
|
-
timeout,
|
|
43
|
-
model
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
recordLockingContextPlugin.name = "context.recordLocking";
|
|
47
|
-
return recordLockingContextPlugin;
|
|
48
|
-
};
|
|
49
|
-
const createRecordLocking = (params)=>{
|
|
50
|
-
const modelsPlugin = createRegisterExtensionPlugin((context)=>{
|
|
51
|
-
context.container.register(RecordLockingModel);
|
|
52
|
-
});
|
|
53
|
-
return [
|
|
54
|
-
createContextPlugin(params),
|
|
55
|
-
modelsPlugin
|
|
56
|
-
];
|
|
57
|
-
};
|
|
58
|
-
export { createRecordLocking };
|
|
59
|
-
|
|
60
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export { RecordLockingAppFeature } from "./RecordLockingAppFeature.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-record-locking",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.6.0-alpha.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -16,25 +16,28 @@
|
|
|
16
16
|
],
|
|
17
17
|
"license": "MIT",
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@
|
|
20
|
-
"@
|
|
21
|
-
"@webiny/api
|
|
22
|
-
"@webiny/
|
|
23
|
-
"@webiny/
|
|
24
|
-
"@webiny/
|
|
25
|
-
"@webiny/
|
|
26
|
-
"@webiny/
|
|
27
|
-
"@webiny/utils": "6.
|
|
19
|
+
"@graphql-tools/merge": "9.2.2",
|
|
20
|
+
"@graphql-tools/schema": "10.0.38",
|
|
21
|
+
"@webiny/api": "6.6.0-alpha.0",
|
|
22
|
+
"@webiny/api-graphql": "6.6.0-alpha.0",
|
|
23
|
+
"@webiny/api-headless-cms": "6.6.0-alpha.0",
|
|
24
|
+
"@webiny/api-websockets": "6.6.0-alpha.0",
|
|
25
|
+
"@webiny/feature": "6.6.0-alpha.0",
|
|
26
|
+
"@webiny/handler": "6.6.0-alpha.0",
|
|
27
|
+
"@webiny/utils": "6.6.0-alpha.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@webiny/api-core": "6.
|
|
31
|
-
"@webiny/
|
|
32
|
-
"@webiny/
|
|
33
|
-
"@webiny/
|
|
30
|
+
"@webiny/api-core": "6.6.0-alpha.0",
|
|
31
|
+
"@webiny/api-core-testing": "6.6.0-alpha.0",
|
|
32
|
+
"@webiny/build-tools": "6.6.0-alpha.0",
|
|
33
|
+
"@webiny/di": "1.0.2",
|
|
34
|
+
"@webiny/event-handler-core": "6.6.0-alpha.0",
|
|
35
|
+
"@webiny/project-utils": "6.6.0-alpha.0",
|
|
36
|
+
"@webiny/wcp": "6.6.0-alpha.0",
|
|
34
37
|
"graphql": "16.14.2",
|
|
35
38
|
"rimraf": "6.1.3",
|
|
36
39
|
"type-fest": "5.8.0",
|
|
37
|
-
"typescript": "
|
|
40
|
+
"typescript": "7.0.2",
|
|
38
41
|
"vitest": "4.1.10"
|
|
39
42
|
},
|
|
40
43
|
"publishConfig": {
|
package/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { createRegisterExtensionPlugin } from \"@webiny/handler\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel\";\nimport { RecordLockingModel, RECORD_LOCKING_MODEL_ID } from \"~/domain/RecordLockingModel.js\";\nimport { getTimeout } from \"~/utils/getTimeout.js\";\nimport { RecordLockingFeature } from \"~/features/RecordLockingFeature.js\";\nimport { createGraphQLSchema } from \"~/graphql/schema.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { CmsModelFieldToGraphQLRegistry } from \"@webiny/api-headless-cms/exports/api/cms/graphql.js\";\n\nexport interface ICreateContextPluginParams {\n /**\n * A number of seconds after the last activity to wait before the record is automatically unlocked.\n */\n timeout?: number;\n}\n\nconst createContextPlugin = (params?: ICreateContextPluginParams) => {\n const recordLockingContextPlugin = new ContextPlugin<ApiCoreContext>(async context => {\n const tenantContext = context.container.resolve(TenantContext);\n const identityContext = context.container.resolve(IdentityContext);\n const wcp = context.container.resolve(WcpContext);\n const getModel = context.container.resolve(GetModelUseCase);\n const listModels = context.container.resolve(ListModelsUseCase);\n\n if (!wcp.canUseRecordLocking() || !tenantContext.getTenant()) {\n return;\n }\n\n // Determine timeout value\n const timeout = getTimeout(params?.timeout);\n\n // Fetch CMS model to use for storing record locking data\n const [model, publicModels] = await identityContext.withoutAuthorization(async () => {\n const [model, publicModels] = await Promise.all([\n // Get a record locking model\n getModel.execute(RECORD_LOCKING_MODEL_ID),\n // Get all models\n listModels.execute({ includePrivate: false })\n ]);\n\n return [model.value, publicModels.value];\n });\n\n const fieldRegistry = context.container.resolve(CmsModelFieldToGraphQLRegistry);\n\n // Register GraphQL schema plugin\n const graphQlPlugin = await createGraphQLSchema({\n model,\n models: publicModels,\n fieldRegistry\n });\n\n context.plugins.register(graphQlPlugin);\n\n // Register features\n RecordLockingFeature.register(context.container, {\n timeout,\n model\n });\n });\n recordLockingContextPlugin.name = \"context.recordLocking\";\n\n return recordLockingContextPlugin;\n};\n\nexport const createRecordLocking = (params?: ICreateContextPluginParams) => {\n const modelsPlugin = createRegisterExtensionPlugin(context => {\n context.container.register(RecordLockingModel);\n });\n\n return [createContextPlugin(params), modelsPlugin];\n};\n"],"names":["createContextPlugin","params","recordLockingContextPlugin","ContextPlugin","context","tenantContext","TenantContext","identityContext","IdentityContext","wcp","WcpContext","getModel","GetModelUseCase","listModels","ListModelsUseCase","timeout","getTimeout","model","publicModels","Promise","RECORD_LOCKING_MODEL_ID","fieldRegistry","CmsModelFieldToGraphQLRegistry","graphQlPlugin","createGraphQLSchema","RecordLockingFeature","createRecordLocking","modelsPlugin","createRegisterExtensionPlugin","RecordLockingModel"],"mappings":";;;;;;;;;;;;AAqBA,MAAMA,sBAAsB,CAACC;IACzB,MAAMC,6BAA6B,IAAIC,cAA8B,OAAMC;QACvE,MAAMC,gBAAgBD,QAAQ,SAAS,CAAC,OAAO,CAACE;QAChD,MAAMC,kBAAkBH,QAAQ,SAAS,CAAC,OAAO,CAACI;QAClD,MAAMC,MAAML,QAAQ,SAAS,CAAC,OAAO,CAACM;QACtC,MAAMC,WAAWP,QAAQ,SAAS,CAAC,OAAO,CAACQ;QAC3C,MAAMC,aAAaT,QAAQ,SAAS,CAAC,OAAO,CAACU;QAE7C,IAAI,CAACL,IAAI,mBAAmB,MAAM,CAACJ,cAAc,SAAS,IACtD;QAIJ,MAAMU,UAAUC,WAAWf,QAAQ;QAGnC,MAAM,CAACgB,OAAOC,aAAa,GAAG,MAAMX,gBAAgB,oBAAoB,CAAC;YACrE,MAAM,CAACU,OAAOC,aAAa,GAAG,MAAMC,QAAQ,GAAG,CAAC;gBAE5CR,SAAS,OAAO,CAACS;gBAEjBP,WAAW,OAAO,CAAC;oBAAE,gBAAgB;gBAAM;aAC9C;YAED,OAAO;gBAACI,MAAM,KAAK;gBAAEC,aAAa,KAAK;aAAC;QAC5C;QAEA,MAAMG,gBAAgBjB,QAAQ,SAAS,CAAC,OAAO,CAACkB;QAGhD,MAAMC,gBAAgB,MAAMC,oBAAoB;YAC5CP;YACA,QAAQC;YACRG;QACJ;QAEAjB,QAAQ,OAAO,CAAC,QAAQ,CAACmB;QAGzBE,qBAAqB,QAAQ,CAACrB,QAAQ,SAAS,EAAE;YAC7CW;YACAE;QACJ;IACJ;IACAf,2BAA2B,IAAI,GAAG;IAElC,OAAOA;AACX;AAEO,MAAMwB,sBAAsB,CAACzB;IAChC,MAAM0B,eAAeC,8BAA8BxB,CAAAA;QAC/CA,QAAQ,SAAS,CAAC,QAAQ,CAACyB;IAC/B;IAEA,OAAO;QAAC7B,oBAAoBC;QAAS0B;KAAa;AACtD"}
|