@webiny/api-record-locking 6.6.0-alpha.6 → 6.6.0-alpha.8
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.js +4 -4
- package/RecordLockingAppFeature.js.map +1 -1
- package/domain/abstractions.d.ts +9 -3
- package/domain/abstractions.js +2 -2
- package/domain/abstractions.js.map +1 -1
- package/features/GetLockRecord/GetLockRecordRepository.d.ts +4 -3
- package/features/GetLockRecord/GetLockRecordRepository.js +20 -15
- package/features/GetLockRecord/GetLockRecordRepository.js.map +1 -1
- package/features/ListAllLockRecords/ListAllLockRecordsRepository.d.ts +3 -3
- package/features/ListAllLockRecords/ListAllLockRecordsRepository.js +7 -6
- package/features/ListAllLockRecords/ListAllLockRecordsRepository.js.map +1 -1
- package/features/ListLockRecords/ListLockRecordsRepository.d.ts +4 -3
- package/features/ListLockRecords/ListLockRecordsRepository.js +7 -6
- package/features/ListLockRecords/ListLockRecordsRepository.js.map +1 -1
- package/features/LockEntry/LockEntryRepository.d.ts +4 -3
- package/features/LockEntry/LockEntryRepository.js +6 -5
- package/features/LockEntry/LockEntryRepository.js.map +1 -1
- package/features/RecordLockingFeature.d.ts +0 -5
- package/features/RecordLockingFeature.js +3 -2
- package/features/RecordLockingFeature.js.map +1 -1
- package/features/RecordLockingModelProvider.d.ts +18 -0
- package/features/RecordLockingModelProvider.js +22 -0
- package/features/RecordLockingModelProvider.js.map +1 -0
- package/features/UnlockEntry/UnlockEntryRepository.d.ts +3 -3
- package/features/UnlockEntry/UnlockEntryRepository.js +6 -5
- package/features/UnlockEntry/UnlockEntryRepository.js.map +1 -1
- package/features/UnlockEntryRequest/UnlockEntryRequestRepository.d.ts +3 -3
- package/features/UnlockEntryRequest/UnlockEntryRequestRepository.js +6 -5
- package/features/UnlockEntryRequest/UnlockEntryRequestRepository.js.map +1 -1
- package/features/UpdateEntryLock/UpdateEntryLockRepository.d.ts +4 -3
- package/features/UpdateEntryLock/UpdateEntryLockRepository.js +7 -6
- package/features/UpdateEntryLock/UpdateEntryLockRepository.js.map +1 -1
- package/graphql/RecordLockingGraphQLSchema.d.ts +23 -0
- package/graphql/RecordLockingGraphQLSchema.js +372 -0
- package/graphql/RecordLockingGraphQLSchema.js.map +1 -0
- package/graphql/checkPermissions.d.ts +3 -3
- package/graphql/checkPermissions.js +1 -3
- package/graphql/checkPermissions.js.map +1 -1
- package/package.json +13 -15
- package/domain/RecordLockingAppConfig.d.ts +0 -4
- package/domain/RecordLockingAppConfig.js +0 -5
- package/domain/RecordLockingAppConfig.js.map +0 -1
- package/graphql/RecordLockingContextualSchema.d.ts +0 -16
- package/graphql/RecordLockingContextualSchema.js +0 -74
- package/graphql/RecordLockingContextualSchema.js.map +0 -1
- package/graphql/schema.d.ts +0 -11
- package/graphql/schema.js +0 -297
- package/graphql/schema.js.map +0 -1
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
2
|
import { FeatureFlags } from "@webiny/api-core/features/featureFlags/abstractions.js";
|
|
3
3
|
import { RecordLockingModel } from "./domain/RecordLockingModel.js";
|
|
4
|
-
import {
|
|
4
|
+
import { RecordLockingFeature } from "./features/RecordLockingFeature.js";
|
|
5
|
+
import { RecordLockingGraphQLSchema } from "./graphql/RecordLockingGraphQLSchema.js";
|
|
5
6
|
import { getTimeout } from "./utils/getTimeout.js";
|
|
6
|
-
import { RecordLockingContextualSchema } from "./graphql/RecordLockingContextualSchema.js";
|
|
7
7
|
const RecordLockingAppFeature = createFeature({
|
|
8
8
|
name: "RecordLockingApp",
|
|
9
9
|
register (container, params) {
|
|
10
10
|
if (!container.resolve(FeatureFlags).get().isEnabled("recordLocking")) return;
|
|
11
11
|
container.register(RecordLockingModel);
|
|
12
|
-
|
|
12
|
+
RecordLockingFeature.register(container, {
|
|
13
13
|
timeout: getTimeout(params?.timeout)
|
|
14
14
|
});
|
|
15
|
-
container.register(
|
|
15
|
+
container.register(RecordLockingGraphQLSchema);
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
18
|
export { RecordLockingAppFeature };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecordLockingAppFeature.js","sources":["../src/RecordLockingAppFeature.ts"],"sourcesContent":["import { type Container, createFeature } from \"@webiny/feature/api\";\nimport { FeatureFlags } from \"@webiny/api-core/features/featureFlags/abstractions.js\";\nimport { RecordLockingModel } from \"~/domain/RecordLockingModel.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"RecordLockingAppFeature.js","sources":["../src/RecordLockingAppFeature.ts"],"sourcesContent":["import { type Container, createFeature } from \"@webiny/feature/api\";\nimport { FeatureFlags } from \"@webiny/api-core/features/featureFlags/abstractions.js\";\nimport { RecordLockingModel } from \"~/domain/RecordLockingModel.js\";\nimport { RecordLockingFeature } from \"~/features/RecordLockingFeature.js\";\nimport { RecordLockingGraphQLSchema } from \"~/graphql/RecordLockingGraphQLSchema.js\";\nimport { getTimeout } from \"~/utils/getTimeout.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 // Record locking is license-gated — check at register time (license is fresh pre-register)\n // so nothing wires up without the entitlement.\n if (!container.resolve(FeatureFlags).get().isEnabled(\"recordLocking\")) {\n return;\n }\n\n container.register(RecordLockingModel);\n RecordLockingFeature.register(container, {\n timeout: getTimeout(params?.timeout)\n });\n container.register(RecordLockingGraphQLSchema);\n }\n});\n"],"names":["RecordLockingAppFeature","createFeature","container","params","FeatureFlags","RecordLockingModel","RecordLockingFeature","getTimeout","RecordLockingGraphQLSchema"],"mappings":";;;;;;AAcO,MAAMA,0BAA0BC,cAA8C;IACjF,MAAM;IACN,UAASC,SAAoB,EAAEC,MAAsC;QAGjE,IAAI,CAACD,UAAU,OAAO,CAACE,cAAc,GAAG,GAAG,SAAS,CAAC,kBACjD;QAGJF,UAAU,QAAQ,CAACG;QACnBC,qBAAqB,QAAQ,CAACJ,WAAW;YACrC,SAASK,WAAWJ,QAAQ;QAChC;QACAD,UAAU,QAAQ,CAACM;IACvB;AACJ"}
|
package/domain/abstractions.d.ts
CHANGED
|
@@ -12,7 +12,13 @@ export declare const RecordLockingConfig: import("@webiny/di").Abstraction<IReco
|
|
|
12
12
|
export declare namespace RecordLockingConfig {
|
|
13
13
|
type Interface = IRecordLockingConfig;
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
/**
|
|
16
|
+
* RecordLockingModelProvider - Fetches the private CMS model that stores lock records.
|
|
17
|
+
*/
|
|
18
|
+
export interface IRecordLockingModelProvider {
|
|
19
|
+
get(): Promise<CmsModel>;
|
|
20
|
+
}
|
|
21
|
+
export declare const RecordLockingModelProvider: import("@webiny/di").Abstraction<IRecordLockingModelProvider>;
|
|
22
|
+
export declare namespace RecordLockingModelProvider {
|
|
23
|
+
type Interface = IRecordLockingModelProvider;
|
|
18
24
|
}
|
package/domain/abstractions.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createAbstraction } from "@webiny/feature/api";
|
|
2
2
|
const RecordLockingConfig = createAbstraction("RecordLockingConfig");
|
|
3
|
-
const
|
|
4
|
-
export { RecordLockingConfig,
|
|
3
|
+
const RecordLockingModelProvider = createAbstraction("RecordLockingModelProvider");
|
|
4
|
+
export { RecordLockingConfig, RecordLockingModelProvider };
|
|
5
5
|
|
|
6
6
|
//# sourceMappingURL=abstractions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain/abstractions.js","sources":["../../src/domain/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\n\n/**\n * RecordLockingConfig - Configuration for record locking timeout\n */\nexport interface IRecordLockingConfig {\n /**\n * Timeout in milliseconds after which a lock expires\n */\n timeout: number;\n}\n\nexport const RecordLockingConfig = createAbstraction<IRecordLockingConfig>(\"RecordLockingConfig\");\n\nexport namespace RecordLockingConfig {\n export type Interface = IRecordLockingConfig;\n}\n\nexport const
|
|
1
|
+
{"version":3,"file":"domain/abstractions.js","sources":["../../src/domain/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\n\n/**\n * RecordLockingConfig - Configuration for record locking timeout\n */\nexport interface IRecordLockingConfig {\n /**\n * Timeout in milliseconds after which a lock expires\n */\n timeout: number;\n}\n\nexport const RecordLockingConfig = createAbstraction<IRecordLockingConfig>(\"RecordLockingConfig\");\n\nexport namespace RecordLockingConfig {\n export type Interface = IRecordLockingConfig;\n}\n\n/**\n * RecordLockingModelProvider - Fetches the private CMS model that stores lock records.\n */\nexport interface IRecordLockingModelProvider {\n get(): Promise<CmsModel>;\n}\n\nexport const RecordLockingModelProvider = createAbstraction<IRecordLockingModelProvider>(\n \"RecordLockingModelProvider\"\n);\n\nexport namespace RecordLockingModelProvider {\n export type Interface = IRecordLockingModelProvider;\n}\n"],"names":["RecordLockingConfig","createAbstraction","RecordLockingModelProvider"],"mappings":";AAaO,MAAMA,sBAAsBC,kBAAwC;AAapE,MAAMC,6BAA6BD,kBACtC"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
|
|
3
3
|
import { GetLockRecordRepository as RepositoryAbstraction } from "./abstractions.js";
|
|
4
|
-
import { RecordLockingConfig
|
|
4
|
+
import { RecordLockingConfig } from "../../domain/abstractions.js";
|
|
5
|
+
import { RecordLockingModelProvider } from "../../domain/abstractions.js";
|
|
5
6
|
import type { ILockRecord } from "../../domain/LockRecord.js";
|
|
6
7
|
declare class GetLockRecordRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
7
|
-
private
|
|
8
|
+
private modelProvider;
|
|
8
9
|
private config;
|
|
9
10
|
private getEntryById;
|
|
10
|
-
constructor(
|
|
11
|
+
constructor(modelProvider: RecordLockingModelProvider.Interface, config: RecordLockingConfig.Interface, getEntryById: GetEntryByIdUseCase.Interface);
|
|
11
12
|
get(id: string): Promise<Result<ILockRecord, RepositoryAbstraction.Error>>;
|
|
12
13
|
}
|
|
13
14
|
export declare const GetLockRecordRepository: typeof GetLockRecordRepositoryImpl & {
|
|
@@ -2,35 +2,40 @@ import { Result } from "@webiny/feature/api";
|
|
|
2
2
|
import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
|
|
3
3
|
import { createIdentifier } from "@webiny/utils";
|
|
4
4
|
import { GetLockRecordRepository } from "./abstractions.js";
|
|
5
|
-
import { RecordLockingConfig,
|
|
5
|
+
import { RecordLockingConfig, RecordLockingModelProvider } from "../../domain/abstractions.js";
|
|
6
6
|
import { LockRecord } from "../../domain/LockRecord.js";
|
|
7
7
|
import { LockRecordNotFoundError, LockRecordPersistenceError } from "../../domain/errors.js";
|
|
8
8
|
import { createLockRecordDatabaseId } from "../../utils/lockRecordDatabaseId.js";
|
|
9
9
|
class GetLockRecordRepositoryImpl {
|
|
10
|
-
constructor(
|
|
11
|
-
this.
|
|
10
|
+
constructor(modelProvider, config, getEntryById){
|
|
11
|
+
this.modelProvider = modelProvider;
|
|
12
12
|
this.config = config;
|
|
13
13
|
this.getEntryById = getEntryById;
|
|
14
14
|
}
|
|
15
15
|
async get(id) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
try {
|
|
17
|
+
const model = await this.modelProvider.get();
|
|
18
|
+
const recordId = createLockRecordDatabaseId(id);
|
|
19
|
+
const entryId = createIdentifier({
|
|
20
|
+
id: recordId,
|
|
21
|
+
version: 1
|
|
22
|
+
});
|
|
23
|
+
const result = await this.getEntryById.execute(model, entryId);
|
|
24
|
+
if (result.isFail()) {
|
|
25
|
+
if ("Cms/Entry/NotFound" === result.error.code) return Result.fail(new LockRecordNotFoundError());
|
|
26
|
+
return Result.fail(new LockRecordPersistenceError(result.error));
|
|
27
|
+
}
|
|
28
|
+
const entry = result.value;
|
|
29
|
+
return Result.ok(new LockRecord(entry, this.config.timeout));
|
|
30
|
+
} catch (error) {
|
|
31
|
+
return Result.fail(new LockRecordPersistenceError(error));
|
|
25
32
|
}
|
|
26
|
-
const entry = result.value;
|
|
27
|
-
return Result.ok(new LockRecord(entry, this.config.timeout));
|
|
28
33
|
}
|
|
29
34
|
}
|
|
30
35
|
const GetLockRecordRepository_GetLockRecordRepository = GetLockRecordRepository.createImplementation({
|
|
31
36
|
implementation: GetLockRecordRepositoryImpl,
|
|
32
37
|
dependencies: [
|
|
33
|
-
|
|
38
|
+
RecordLockingModelProvider,
|
|
34
39
|
RecordLockingConfig,
|
|
35
40
|
GetEntryByIdUseCase
|
|
36
41
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/GetLockRecord/GetLockRecordRepository.js","sources":["../../../src/features/GetLockRecord/GetLockRecordRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport { GetLockRecordRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { RecordLockingConfig
|
|
1
|
+
{"version":3,"file":"features/GetLockRecord/GetLockRecordRepository.js","sources":["../../../src/features/GetLockRecord/GetLockRecordRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport { GetLockRecordRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { RecordLockingConfig } from \"~/domain/abstractions.js\";\nimport { RecordLockingModelProvider } from \"~/domain/abstractions.js\";\nimport type { ILockRecord } from \"~/domain/LockRecord.js\";\nimport { LockRecord } from \"~/domain/LockRecord.js\";\nimport type { LockRecordValues } from \"~/domain/types.js\";\nimport { LockRecordNotFoundError, LockRecordPersistenceError } from \"~/domain/errors.js\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId.js\";\n\nclass GetLockRecordRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private modelProvider: RecordLockingModelProvider.Interface,\n private config: RecordLockingConfig.Interface,\n private getEntryById: GetEntryByIdUseCase.Interface\n ) {}\n\n async get(id: string): Promise<Result<ILockRecord, RepositoryAbstraction.Error>> {\n try {\n const model = await this.modelProvider.get();\n\n const recordId = createLockRecordDatabaseId(id);\n const entryId = createIdentifier({\n id: recordId,\n version: 1\n });\n\n const result = await this.getEntryById.execute<LockRecordValues>(model, entryId);\n\n if (result.isFail()) {\n if (result.error.code === \"Cms/Entry/NotFound\") {\n return Result.fail(new LockRecordNotFoundError());\n }\n\n return Result.fail(new LockRecordPersistenceError(result.error));\n }\n\n const entry = result.value;\n\n return Result.ok(new LockRecord(entry, this.config.timeout));\n } catch (error) {\n return Result.fail(new LockRecordPersistenceError(error as Error));\n }\n }\n}\n\nexport const GetLockRecordRepository = RepositoryAbstraction.createImplementation({\n implementation: GetLockRecordRepositoryImpl,\n dependencies: [RecordLockingModelProvider, RecordLockingConfig, GetEntryByIdUseCase]\n});\n"],"names":["GetLockRecordRepositoryImpl","modelProvider","config","getEntryById","id","model","recordId","createLockRecordDatabaseId","entryId","createIdentifier","result","Result","LockRecordNotFoundError","LockRecordPersistenceError","entry","LockRecord","error","GetLockRecordRepository","RepositoryAbstraction","RecordLockingModelProvider","RecordLockingConfig","GetEntryByIdUseCase"],"mappings":";;;;;;;;AAYA,MAAMA;IACF,YACYC,aAAmD,EACnDC,MAAqC,EACrCC,YAA2C,CACrD;aAHUF,aAAa,GAAbA;aACAC,MAAM,GAANA;aACAC,YAAY,GAAZA;IACT;IAEH,MAAM,IAAIC,EAAU,EAA6D;QAC7E,IAAI;YACA,MAAMC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG;YAE1C,MAAMC,WAAWC,2BAA2BH;YAC5C,MAAMI,UAAUC,iBAAiB;gBAC7B,IAAIH;gBACJ,SAAS;YACb;YAEA,MAAMI,SAAS,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAmBL,OAAOG;YAExE,IAAIE,OAAO,MAAM,IAAI;gBACjB,IAAIA,AAAsB,yBAAtBA,OAAO,KAAK,CAAC,IAAI,EACjB,OAAOC,OAAO,IAAI,CAAC,IAAIC;gBAG3B,OAAOD,OAAO,IAAI,CAAC,IAAIE,2BAA2BH,OAAO,KAAK;YAClE;YAEA,MAAMI,QAAQJ,OAAO,KAAK;YAE1B,OAAOC,OAAO,EAAE,CAAC,IAAII,WAAWD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;QAC9D,EAAE,OAAOE,OAAO;YACZ,OAAOL,OAAO,IAAI,CAAC,IAAIE,2BAA2BG;QACtD;IACJ;AACJ;AAEO,MAAMC,kDAA0BC,wBAAAA,oBAA0C,CAAC;IAC9E,gBAAgBlB;IAChB,cAAc;QAACmB;QAA4BC;QAAqBC;KAAoB;AACxF"}
|
|
@@ -1,15 +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 type { CmsModel } from "@webiny/api-headless-cms/types";
|
|
5
4
|
import { CmsWhereMapper } from "@webiny/api-headless-cms";
|
|
6
5
|
import { RecordLockingConfig } from "../../domain/abstractions.js";
|
|
6
|
+
import { RecordLockingModelProvider } from "../../domain/abstractions.js";
|
|
7
7
|
declare class ListAllLockRecordsRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
8
8
|
private config;
|
|
9
9
|
private listEntries;
|
|
10
|
-
private
|
|
10
|
+
private modelProvider;
|
|
11
11
|
private cmsWhereMapper;
|
|
12
|
-
constructor(config: RecordLockingConfig.Interface, listEntries: ListLatestEntriesUseCase.Interface,
|
|
12
|
+
constructor(config: RecordLockingConfig.Interface, listEntries: ListLatestEntriesUseCase.Interface, modelProvider: RecordLockingModelProvider.Interface, cmsWhereMapper: CmsWhereMapper.Interface);
|
|
13
13
|
execute(input?: ListAllLockRecordsInput): Promise<Result<ListAllLockRecordsOutput, RepositoryAbstraction.Error>>;
|
|
14
14
|
}
|
|
15
15
|
export declare const ListAllLockRecordsRepository: typeof ListAllLockRecordsRepositoryImpl & {
|
|
@@ -2,27 +2,28 @@ 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
4
|
import { CmsWhereMapper } from "@webiny/api-headless-cms";
|
|
5
|
-
import { RecordLockingConfig,
|
|
5
|
+
import { RecordLockingConfig, RecordLockingModelProvider } from "../../domain/abstractions.js";
|
|
6
6
|
import { LockRecordPersistenceError } from "../../domain/errors.js";
|
|
7
7
|
import { convertWhereCondition } from "../../utils/convertWhereCondition.js";
|
|
8
8
|
import { LockRecord } from "../../domain/LockRecord.js";
|
|
9
9
|
class ListAllLockRecordsRepositoryImpl {
|
|
10
|
-
constructor(config, listEntries,
|
|
10
|
+
constructor(config, listEntries, modelProvider, cmsWhereMapper){
|
|
11
11
|
this.config = config;
|
|
12
12
|
this.listEntries = listEntries;
|
|
13
|
-
this.
|
|
13
|
+
this.modelProvider = modelProvider;
|
|
14
14
|
this.cmsWhereMapper = cmsWhereMapper;
|
|
15
15
|
}
|
|
16
16
|
async execute(input) {
|
|
17
17
|
try {
|
|
18
|
+
const model = await this.modelProvider.get();
|
|
18
19
|
const params = {
|
|
19
20
|
...input,
|
|
20
21
|
where: this.cmsWhereMapper.map({
|
|
21
22
|
input: convertWhereCondition(input?.where),
|
|
22
|
-
fields:
|
|
23
|
+
fields: model.fields
|
|
23
24
|
})
|
|
24
25
|
};
|
|
25
|
-
const result = await this.listEntries.execute(
|
|
26
|
+
const result = await this.listEntries.execute(model, params);
|
|
26
27
|
if (result.isFail()) return Result.fail(new LockRecordPersistenceError(result.error));
|
|
27
28
|
const { entries, meta } = result.value;
|
|
28
29
|
const items = entries.map((entry)=>new LockRecord(entry, this.config.timeout));
|
|
@@ -40,7 +41,7 @@ const ListAllLockRecordsRepository_ListAllLockRecordsRepository = ListAllLockRec
|
|
|
40
41
|
dependencies: [
|
|
41
42
|
RecordLockingConfig,
|
|
42
43
|
ListLatestEntriesUseCase,
|
|
43
|
-
|
|
44
|
+
RecordLockingModelProvider,
|
|
44
45
|
CmsWhereMapper
|
|
45
46
|
]
|
|
46
47
|
});
|
|
@@ -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 { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { RecordLockingConfig } from \"~/domain/abstractions.js\";\nimport { RecordLockingModelProvider } 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 modelProvider: RecordLockingModelProvider.Interface,\n private cmsWhereMapper: CmsWhereMapper.Interface\n ) {}\n\n async execute(\n input?: ListAllLockRecordsInput\n ): Promise<Result<ListAllLockRecordsOutput, RepositoryAbstraction.Error>> {\n try {\n const model = await this.modelProvider.get();\n\n const params = {\n ...input,\n where: this.cmsWhereMapper.map({\n input: convertWhereCondition(input?.where),\n fields: model.fields\n })\n };\n\n const result = await this.listEntries.execute<LockRecordValues>(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 RecordLockingModelProvider,\n CmsWhereMapper\n ]\n});\n"],"names":["ListAllLockRecordsRepositoryImpl","config","listEntries","modelProvider","cmsWhereMapper","input","model","params","convertWhereCondition","result","Result","LockRecordPersistenceError","entries","meta","items","entry","LockRecord","error","ListAllLockRecordsRepository","RepositoryAbstraction","RecordLockingConfig","ListLatestEntriesUseCase","RecordLockingModelProvider","CmsWhereMapper"],"mappings":";;;;;;;;AAeA,MAAMA;IACF,YACYC,MAAqC,EACrCC,WAA+C,EAC/CC,aAAmD,EACnDC,cAAwC,CAClD;aAJUH,MAAM,GAANA;aACAC,WAAW,GAAXA;aACAC,aAAa,GAAbA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QACFC,KAA+B,EACuC;QACtE,IAAI;YACA,MAAMC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG;YAE1C,MAAMC,SAAS;gBACX,GAAGF,KAAK;gBACR,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;oBAC3B,OAAOG,sBAAsBH,OAAO;oBACpC,QAAQC,MAAM,MAAM;gBACxB;YACJ;YAEA,MAAMG,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAmBH,OAAOC;YAEvE,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,gBAAgBnB;IAChB,cAAc;QACVoB;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
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
|
-
import { RecordLockingConfig
|
|
4
|
+
import { RecordLockingConfig } from "../../domain/abstractions.js";
|
|
5
|
+
import { RecordLockingModelProvider } from "../../domain/abstractions.js";
|
|
5
6
|
import { CmsWhereMapper } from "@webiny/api-headless-cms";
|
|
6
7
|
declare class ListLockRecordsRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
7
|
-
private
|
|
8
|
+
private modelProvider;
|
|
8
9
|
private config;
|
|
9
10
|
private listEntries;
|
|
10
11
|
private cmsWhereMapper;
|
|
11
|
-
constructor(
|
|
12
|
+
constructor(modelProvider: RecordLockingModelProvider.Interface, config: RecordLockingConfig.Interface, listEntries: ListLatestEntriesUseCase.Interface, cmsWhereMapper: CmsWhereMapper.Interface);
|
|
12
13
|
execute(input?: ListLockRecordsInput): Promise<Result<ListLockRecordsOutput, RepositoryAbstraction.Error>>;
|
|
13
14
|
}
|
|
14
15
|
export declare const ListLockRecordsRepository: typeof ListLockRecordsRepositoryImpl & {
|
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries";
|
|
3
3
|
import { ListLockRecordsRepository } from "./abstractions.js";
|
|
4
|
-
import { RecordLockingConfig,
|
|
4
|
+
import { RecordLockingConfig, RecordLockingModelProvider } from "../../domain/abstractions.js";
|
|
5
5
|
import { LockRecord } from "../../domain/LockRecord.js";
|
|
6
6
|
import { LockRecordPersistenceError } from "../../domain/errors.js";
|
|
7
7
|
import { CmsWhereMapper } from "@webiny/api-headless-cms";
|
|
8
8
|
import { convertWhereCondition } from "../../utils/convertWhereCondition.js";
|
|
9
9
|
class ListLockRecordsRepositoryImpl {
|
|
10
|
-
constructor(
|
|
11
|
-
this.
|
|
10
|
+
constructor(modelProvider, config, listEntries, cmsWhereMapper){
|
|
11
|
+
this.modelProvider = modelProvider;
|
|
12
12
|
this.config = config;
|
|
13
13
|
this.listEntries = listEntries;
|
|
14
14
|
this.cmsWhereMapper = cmsWhereMapper;
|
|
15
15
|
}
|
|
16
16
|
async execute(input) {
|
|
17
17
|
try {
|
|
18
|
+
const model = await this.modelProvider.get();
|
|
18
19
|
const params = {
|
|
19
20
|
...input,
|
|
20
21
|
where: this.cmsWhereMapper.map({
|
|
21
22
|
input: convertWhereCondition(input?.where),
|
|
22
|
-
fields:
|
|
23
|
+
fields: model.fields
|
|
23
24
|
})
|
|
24
25
|
};
|
|
25
|
-
const result = await this.listEntries.execute(
|
|
26
|
+
const result = await this.listEntries.execute(model, params);
|
|
26
27
|
if (result.isFail()) return Result.fail(new LockRecordPersistenceError(result.error));
|
|
27
28
|
const { entries, meta } = result.value;
|
|
28
29
|
const items = entries.map((entry)=>new LockRecord(entry, this.config.timeout));
|
|
@@ -38,7 +39,7 @@ class ListLockRecordsRepositoryImpl {
|
|
|
38
39
|
const ListLockRecordsRepository_ListLockRecordsRepository = ListLockRecordsRepository.createImplementation({
|
|
39
40
|
implementation: ListLockRecordsRepositoryImpl,
|
|
40
41
|
dependencies: [
|
|
41
|
-
|
|
42
|
+
RecordLockingModelProvider,
|
|
42
43
|
RecordLockingConfig,
|
|
43
44
|
ListLatestEntriesUseCase,
|
|
44
45
|
CmsWhereMapper
|
|
@@ -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
|
|
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 } from \"~/domain/abstractions.js\";\nimport { RecordLockingModelProvider } 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 modelProvider: RecordLockingModelProvider.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 model = await this.modelProvider.get();\n\n const params = {\n ...input,\n where: this.cmsWhereMapper.map({\n input: convertWhereCondition(input?.where),\n fields: model.fields\n })\n };\n\n const result = await this.listEntries.execute<LockRecordValues>(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 RecordLockingModelProvider,\n RecordLockingConfig,\n ListLatestEntriesUseCase,\n CmsWhereMapper\n ]\n});\n"],"names":["ListLockRecordsRepositoryImpl","modelProvider","config","listEntries","cmsWhereMapper","input","model","params","convertWhereCondition","result","Result","LockRecordPersistenceError","entries","meta","items","entry","LockRecord","error","ListLockRecordsRepository","RepositoryAbstraction","RecordLockingModelProvider","RecordLockingConfig","ListLatestEntriesUseCase","CmsWhereMapper"],"mappings":";;;;;;;;AAeA,MAAMA;IACF,YACYC,aAAmD,EACnDC,MAAqC,EACrCC,WAA+C,EAC/CC,cAAwC,CAClD;aAJUH,aAAa,GAAbA;aACAC,MAAM,GAANA;aACAC,WAAW,GAAXA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QACFC,KAA4B,EACuC;QACnE,IAAI;YACA,MAAMC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG;YAE1C,MAAMC,SAAS;gBACX,GAAGF,KAAK;gBACR,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;oBAC3B,OAAOG,sBAAsBH,OAAO;oBACpC,QAAQC,MAAM,MAAM;gBACxB;YACJ;YAEA,MAAMG,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAmBH,OAAOC;YAEvE,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,gBAAgBnB;IAChB,cAAc;QACVoB;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { CreateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/CreateEntry";
|
|
3
3
|
import { LockEntryInput, LockEntryRepository as RepositoryAbstraction } from "./abstractions.js";
|
|
4
|
-
import { RecordLockingConfig
|
|
4
|
+
import { RecordLockingConfig } from "../../domain/abstractions.js";
|
|
5
|
+
import { RecordLockingModelProvider } from "../../domain/abstractions.js";
|
|
5
6
|
import type { ILockRecord } from "../../domain/LockRecord.js";
|
|
6
7
|
declare class LockEntryRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
7
|
-
private
|
|
8
|
+
private modelProvider;
|
|
8
9
|
private config;
|
|
9
10
|
private createEntry;
|
|
10
|
-
constructor(
|
|
11
|
+
constructor(modelProvider: RecordLockingModelProvider.Interface, config: RecordLockingConfig.Interface, createEntry: CreateEntryUseCase.Interface);
|
|
11
12
|
create(input: LockEntryInput): Promise<Result<ILockRecord, RepositoryAbstraction.Error>>;
|
|
12
13
|
}
|
|
13
14
|
export declare const LockEntryRepository: typeof LockEntryRepositoryImpl & {
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { CreateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/CreateEntry";
|
|
3
3
|
import { LockEntryRepository } from "./abstractions.js";
|
|
4
|
-
import { RecordLockingConfig,
|
|
4
|
+
import { RecordLockingConfig, RecordLockingModelProvider } from "../../domain/abstractions.js";
|
|
5
5
|
import { LockRecord } from "../../domain/LockRecord.js";
|
|
6
6
|
import { LockRecordPersistenceError } from "../../domain/errors.js";
|
|
7
7
|
import { createLockRecordDatabaseId } from "../../utils/lockRecordDatabaseId.js";
|
|
8
8
|
class LockEntryRepositoryImpl {
|
|
9
|
-
constructor(
|
|
10
|
-
this.
|
|
9
|
+
constructor(modelProvider, config, createEntry){
|
|
10
|
+
this.modelProvider = modelProvider;
|
|
11
11
|
this.config = config;
|
|
12
12
|
this.createEntry = createEntry;
|
|
13
13
|
}
|
|
14
14
|
async create(input) {
|
|
15
15
|
try {
|
|
16
|
+
const model = await this.modelProvider.get();
|
|
16
17
|
const id = createLockRecordDatabaseId(input.id);
|
|
17
18
|
const values = {
|
|
18
19
|
targetId: input.id,
|
|
19
20
|
type: input.type,
|
|
20
21
|
actions: []
|
|
21
22
|
};
|
|
22
|
-
const result = await this.createEntry.execute(
|
|
23
|
+
const result = await this.createEntry.execute(model, {
|
|
23
24
|
id,
|
|
24
25
|
values
|
|
25
26
|
});
|
|
@@ -35,7 +36,7 @@ class LockEntryRepositoryImpl {
|
|
|
35
36
|
const LockEntryRepository_LockEntryRepository = LockEntryRepository.createImplementation({
|
|
36
37
|
implementation: LockEntryRepositoryImpl,
|
|
37
38
|
dependencies: [
|
|
38
|
-
|
|
39
|
+
RecordLockingModelProvider,
|
|
39
40
|
RecordLockingConfig,
|
|
40
41
|
CreateEntryUseCase
|
|
41
42
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/LockEntry/LockEntryRepository.js","sources":["../../../src/features/LockEntry/LockEntryRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { CreateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry\";\nimport type { CmsEntry } from \"@webiny/api-headless-cms/types/index.js\";\nimport { LockEntryInput, LockEntryRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { RecordLockingConfig
|
|
1
|
+
{"version":3,"file":"features/LockEntry/LockEntryRepository.js","sources":["../../../src/features/LockEntry/LockEntryRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { CreateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry\";\nimport type { CmsEntry } from \"@webiny/api-headless-cms/types/index.js\";\nimport { LockEntryInput, LockEntryRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { RecordLockingConfig } from \"~/domain/abstractions.js\";\nimport { RecordLockingModelProvider } from \"~/domain/abstractions.js\";\nimport type { ILockRecord } from \"~/domain/LockRecord.js\";\nimport { LockRecord } from \"~/domain/LockRecord.js\";\nimport type { LockRecordValues } from \"~/domain/types.js\";\nimport { LockRecordPersistenceError } from \"~/domain/errors.js\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId.js\";\n\nclass LockEntryRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private modelProvider: RecordLockingModelProvider.Interface,\n private config: RecordLockingConfig.Interface,\n private createEntry: CreateEntryUseCase.Interface\n ) {}\n\n async create(input: LockEntryInput): Promise<Result<ILockRecord, RepositoryAbstraction.Error>> {\n try {\n const model = await this.modelProvider.get();\n\n const id = createLockRecordDatabaseId(input.id);\n\n const values: LockRecordValues = {\n targetId: input.id,\n type: input.type,\n actions: []\n };\n\n const result = await this.createEntry.execute(model, {\n id,\n values\n });\n\n if (result.isFail()) {\n return Result.fail(new LockRecordPersistenceError(result.error));\n }\n\n const entry = result.value as CmsEntry<LockRecordValues>;\n const lockRecord = new LockRecord(entry, this.config.timeout);\n\n return Result.ok(lockRecord);\n } catch (error) {\n return Result.fail(new LockRecordPersistenceError(error as Error));\n }\n }\n}\n\nexport const LockEntryRepository = RepositoryAbstraction.createImplementation({\n implementation: LockEntryRepositoryImpl,\n dependencies: [RecordLockingModelProvider, RecordLockingConfig, CreateEntryUseCase]\n});\n"],"names":["LockEntryRepositoryImpl","modelProvider","config","createEntry","input","model","id","createLockRecordDatabaseId","values","result","Result","LockRecordPersistenceError","entry","lockRecord","LockRecord","error","LockEntryRepository","RepositoryAbstraction","RecordLockingModelProvider","RecordLockingConfig","CreateEntryUseCase"],"mappings":";;;;;;;AAYA,MAAMA;IACF,YACYC,aAAmD,EACnDC,MAAqC,EACrCC,WAAyC,CACnD;aAHUF,aAAa,GAAbA;aACAC,MAAM,GAANA;aACAC,WAAW,GAAXA;IACT;IAEH,MAAM,OAAOC,KAAqB,EAA6D;QAC3F,IAAI;YACA,MAAMC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG;YAE1C,MAAMC,KAAKC,2BAA2BH,MAAM,EAAE;YAE9C,MAAMI,SAA2B;gBAC7B,UAAUJ,MAAM,EAAE;gBAClB,MAAMA,MAAM,IAAI;gBAChB,SAAS,EAAE;YACf;YAEA,MAAMK,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAACJ,OAAO;gBACjDC;gBACAE;YACJ;YAEA,IAAIC,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAAC,IAAIC,2BAA2BF,OAAO,KAAK;YAGlE,MAAMG,QAAQH,OAAO,KAAK;YAC1B,MAAMI,aAAa,IAAIC,WAAWF,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;YAE5D,OAAOF,OAAO,EAAE,CAACG;QACrB,EAAE,OAAOE,OAAO;YACZ,OAAOL,OAAO,IAAI,CAAC,IAAIC,2BAA2BI;QACtD;IACJ;AACJ;AAEO,MAAMC,0CAAsBC,oBAAAA,oBAA0C,CAAC;IAC1E,gBAAgBjB;IAChB,cAAc;QAACkB;QAA4BC;QAAqBC;KAAmB;AACvF"}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import type { CmsModel } from "@webiny/api-headless-cms/types";
|
|
2
1
|
export interface RecordLockingParams {
|
|
3
2
|
/**
|
|
4
3
|
* Timeout in milliseconds after which a lock expires
|
|
5
4
|
*/
|
|
6
5
|
timeout: number;
|
|
7
|
-
/**
|
|
8
|
-
* The CMS model for storing lock records
|
|
9
|
-
*/
|
|
10
|
-
model: CmsModel;
|
|
11
6
|
}
|
|
12
7
|
export declare const RecordLockingFeature: {
|
|
13
8
|
name: string;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
|
-
import { RecordLockingConfig
|
|
2
|
+
import { RecordLockingConfig } from "../domain/abstractions.js";
|
|
3
|
+
import { RecordLockingModelProvider } from "./RecordLockingModelProvider.js";
|
|
3
4
|
import { GetLockRecordFeature } from "./GetLockRecord/feature.js";
|
|
4
5
|
import { GetLockedEntryLockRecordFeature } from "./GetLockedEntryLockRecord/feature.js";
|
|
5
6
|
import { KickOutCurrentUserFeature } from "./KickOutCurrentUser/feature.js";
|
|
@@ -16,7 +17,7 @@ const RecordLockingFeature = createFeature({
|
|
|
16
17
|
container.registerInstance(RecordLockingConfig, {
|
|
17
18
|
timeout: params.timeout
|
|
18
19
|
});
|
|
19
|
-
container.
|
|
20
|
+
container.register(RecordLockingModelProvider);
|
|
20
21
|
GetLockRecordFeature.register(container);
|
|
21
22
|
GetLockedEntryLockRecordFeature.register(container);
|
|
22
23
|
KickOutCurrentUserFeature.register(container);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/RecordLockingFeature.js","sources":["../../src/features/RecordLockingFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport
|
|
1
|
+
{"version":3,"file":"features/RecordLockingFeature.js","sources":["../../src/features/RecordLockingFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { RecordLockingConfig } from \"~/domain/abstractions.js\";\nimport { RecordLockingModelProvider } from \"./RecordLockingModelProvider.js\";\nimport { GetLockRecordFeature } from \"./GetLockRecord/feature.js\";\nimport { GetLockedEntryLockRecordFeature } from \"./GetLockedEntryLockRecord/feature.js\";\nimport { KickOutCurrentUserFeature } from \"./KickOutCurrentUser/feature.js\";\nimport { ListLockRecordsFeature } from \"./ListLockRecords/feature.js\";\nimport { ListAllLockRecordsFeature } from \"./ListAllLockRecords/feature.js\";\nimport { IsEntryLockedFeature } from \"./IsEntryLocked/feature.js\";\nimport { LockEntryFeature } from \"./LockEntry/feature.js\";\nimport { UpdateEntryLockFeature } from \"./UpdateEntryLock/feature.js\";\nimport { UnlockEntryFeature } from \"./UnlockEntry/feature.js\";\nimport { UnlockEntryRequestFeature } from \"./UnlockEntryRequest/feature.js\";\n\nexport interface RecordLockingParams {\n /**\n * Timeout in milliseconds after which a lock expires\n */\n timeout: number;\n}\n\nexport const RecordLockingFeature = createFeature<RecordLockingParams>({\n name: \"RecordLockingManagement\",\n register(container, params) {\n // Register domain abstractions\n container.registerInstance(RecordLockingConfig, { timeout: params.timeout });\n container.register(RecordLockingModelProvider);\n\n // Register all sub-features\n GetLockRecordFeature.register(container);\n GetLockedEntryLockRecordFeature.register(container);\n KickOutCurrentUserFeature.register(container);\n ListLockRecordsFeature.register(container);\n ListAllLockRecordsFeature.register(container);\n IsEntryLockedFeature.register(container);\n LockEntryFeature.register(container);\n UpdateEntryLockFeature.register(container);\n UnlockEntryFeature.register(container);\n UnlockEntryRequestFeature.register(container);\n }\n});\n"],"names":["RecordLockingFeature","createFeature","container","params","RecordLockingConfig","RecordLockingModelProvider","GetLockRecordFeature","GetLockedEntryLockRecordFeature","KickOutCurrentUserFeature","ListLockRecordsFeature","ListAllLockRecordsFeature","IsEntryLockedFeature","LockEntryFeature","UpdateEntryLockFeature","UnlockEntryFeature","UnlockEntryRequestFeature"],"mappings":";;;;;;;;;;;;;AAqBO,MAAMA,uBAAuBC,cAAmC;IACnE,MAAM;IACN,UAASC,SAAS,EAAEC,MAAM;QAEtBD,UAAU,gBAAgB,CAACE,qBAAqB;YAAE,SAASD,OAAO,OAAO;QAAC;QAC1ED,UAAU,QAAQ,CAACG;QAGnBC,qBAAqB,QAAQ,CAACJ;QAC9BK,gCAAgC,QAAQ,CAACL;QACzCM,0BAA0B,QAAQ,CAACN;QACnCO,uBAAuB,QAAQ,CAACP;QAChCQ,0BAA0B,QAAQ,CAACR;QACnCS,qBAAqB,QAAQ,CAACT;QAC9BU,iBAAiB,QAAQ,CAACV;QAC1BW,uBAAuB,QAAQ,CAACX;QAChCY,mBAAmB,QAAQ,CAACZ;QAC5Ba,0BAA0B,QAAQ,CAACb;IACvC;AACJ"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CmsModel } from "@webiny/api-headless-cms/types";
|
|
2
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
|
|
3
|
+
import { RecordLockingModelProvider as Abstraction } from "../domain/abstractions.js";
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the lock record model on demand.
|
|
6
|
+
*
|
|
7
|
+
* No memoization: `ModelsFetcher` already caches the model list per request. No
|
|
8
|
+
* `withoutAuthorization` either: the model is private, so access control lets every identity read it.
|
|
9
|
+
*/
|
|
10
|
+
declare class RecordLockingModelProviderImpl implements Abstraction.Interface {
|
|
11
|
+
private getModel;
|
|
12
|
+
constructor(getModel: GetModelUseCase.Interface);
|
|
13
|
+
get(): Promise<CmsModel>;
|
|
14
|
+
}
|
|
15
|
+
export declare const RecordLockingModelProvider: typeof RecordLockingModelProviderImpl & {
|
|
16
|
+
__abstraction: import("@webiny/di").Abstraction<import("~/domain/abstractions.js").IRecordLockingModelProvider>;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
|
|
2
|
+
import { RecordLockingModelProvider } from "../domain/abstractions.js";
|
|
3
|
+
import { RECORD_LOCKING_MODEL_ID } from "../domain/RecordLockingModel.js";
|
|
4
|
+
class RecordLockingModelProviderImpl {
|
|
5
|
+
constructor(getModel){
|
|
6
|
+
this.getModel = getModel;
|
|
7
|
+
}
|
|
8
|
+
async get() {
|
|
9
|
+
const result = await this.getModel.execute(RECORD_LOCKING_MODEL_ID);
|
|
10
|
+
if (result.isFail()) throw result.error;
|
|
11
|
+
return result.value;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const RecordLockingModelProvider_RecordLockingModelProvider = RecordLockingModelProvider.createImplementation({
|
|
15
|
+
implementation: RecordLockingModelProviderImpl,
|
|
16
|
+
dependencies: [
|
|
17
|
+
GetModelUseCase
|
|
18
|
+
]
|
|
19
|
+
});
|
|
20
|
+
export { RecordLockingModelProvider_RecordLockingModelProvider as RecordLockingModelProvider };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=RecordLockingModelProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/RecordLockingModelProvider.js","sources":["../../src/features/RecordLockingModelProvider.ts"],"sourcesContent":["import type { CmsModel } from \"@webiny/api-headless-cms/types\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { RecordLockingModelProvider as Abstraction } from \"~/domain/abstractions.js\";\nimport { RECORD_LOCKING_MODEL_ID } from \"~/domain/RecordLockingModel.js\";\n\n/**\n * Resolves the lock record model on demand.\n *\n * No memoization: `ModelsFetcher` already caches the model list per request. No\n * `withoutAuthorization` either: the model is private, so access control lets every identity read it.\n */\nclass RecordLockingModelProviderImpl implements Abstraction.Interface {\n constructor(private getModel: GetModelUseCase.Interface) {}\n\n async get(): Promise<CmsModel> {\n const result = await this.getModel.execute(RECORD_LOCKING_MODEL_ID);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n }\n}\n\nexport const RecordLockingModelProvider = Abstraction.createImplementation({\n implementation: RecordLockingModelProviderImpl,\n dependencies: [GetModelUseCase]\n});\n"],"names":["RecordLockingModelProviderImpl","getModel","result","RECORD_LOCKING_MODEL_ID","RecordLockingModelProvider","Abstraction","GetModelUseCase"],"mappings":";;;AAWA,MAAMA;IACF,YAAoBC,QAAmC,CAAE;aAArCA,QAAQ,GAARA;IAAsC;IAE1D,MAAM,MAAyB;QAC3B,MAAMC,SAAS,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACC;QAC3C,IAAID,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAEtB,OAAOA,OAAO,KAAK;IACvB;AACJ;AAEO,MAAME,wDAA6BC,2BAAAA,oBAAgC,CAAC;IACvE,gBAAgBL;IAChB,cAAc;QAACM;KAAgB;AACnC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry";
|
|
3
3
|
import { UnlockEntryRepository as RepositoryAbstraction } from "./abstractions.js";
|
|
4
|
-
import {
|
|
4
|
+
import { RecordLockingModelProvider } from "../../domain/abstractions.js";
|
|
5
5
|
declare class UnlockEntryRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
6
|
-
private
|
|
6
|
+
private modelProvider;
|
|
7
7
|
private deleteEntry;
|
|
8
|
-
constructor(
|
|
8
|
+
constructor(modelProvider: RecordLockingModelProvider.Interface, deleteEntry: DeleteEntryUseCase.Interface);
|
|
9
9
|
delete(lockRecordId: string): Promise<Result<void, RepositoryAbstraction.Error>>;
|
|
10
10
|
}
|
|
11
11
|
export declare const UnlockEntryRepository: typeof UnlockEntryRepositoryImpl & {
|
|
@@ -2,22 +2,23 @@ import { Result } from "@webiny/feature/api";
|
|
|
2
2
|
import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry";
|
|
3
3
|
import { createIdentifier } from "@webiny/utils";
|
|
4
4
|
import { UnlockEntryRepository } from "./abstractions.js";
|
|
5
|
-
import {
|
|
5
|
+
import { RecordLockingModelProvider } from "../../domain/abstractions.js";
|
|
6
6
|
import { LockRecordNotFoundError, UnlockEntryError } from "../../domain/errors.js";
|
|
7
7
|
import { createLockRecordDatabaseId } from "../../utils/lockRecordDatabaseId.js";
|
|
8
8
|
class UnlockEntryRepositoryImpl {
|
|
9
|
-
constructor(
|
|
10
|
-
this.
|
|
9
|
+
constructor(modelProvider, deleteEntry){
|
|
10
|
+
this.modelProvider = modelProvider;
|
|
11
11
|
this.deleteEntry = deleteEntry;
|
|
12
12
|
}
|
|
13
13
|
async delete(lockRecordId) {
|
|
14
14
|
try {
|
|
15
|
+
const model = await this.modelProvider.get();
|
|
15
16
|
const entryId = createLockRecordDatabaseId(lockRecordId);
|
|
16
17
|
const id = createIdentifier({
|
|
17
18
|
id: entryId,
|
|
18
19
|
version: 1
|
|
19
20
|
});
|
|
20
|
-
const result = await this.deleteEntry.execute(
|
|
21
|
+
const result = await this.deleteEntry.execute(model, id, {
|
|
21
22
|
permanently: true
|
|
22
23
|
});
|
|
23
24
|
if (result.isFail()) {
|
|
@@ -33,7 +34,7 @@ class UnlockEntryRepositoryImpl {
|
|
|
33
34
|
const UnlockEntryRepository_UnlockEntryRepository = UnlockEntryRepository.createImplementation({
|
|
34
35
|
implementation: UnlockEntryRepositoryImpl,
|
|
35
36
|
dependencies: [
|
|
36
|
-
|
|
37
|
+
RecordLockingModelProvider,
|
|
37
38
|
DeleteEntryUseCase
|
|
38
39
|
]
|
|
39
40
|
});
|