@webiny/api-record-locking 0.0.0-unstable.a4f3e4ea8b → 0.0.0-unstable.a85ef555b2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/RecordLockingAppFeature.d.ts +11 -0
  2. package/RecordLockingAppFeature.js +20 -0
  3. package/RecordLockingAppFeature.js.map +1 -0
  4. package/domain/RecordLockingModel.js +2 -1
  5. package/domain/RecordLockingModel.js.map +1 -1
  6. package/domain/abstractions.d.ts +9 -3
  7. package/domain/abstractions.js +2 -2
  8. package/domain/abstractions.js.map +1 -1
  9. package/features/GetLockRecord/GetLockRecordRepository.d.ts +4 -3
  10. package/features/GetLockRecord/GetLockRecordRepository.js +20 -15
  11. package/features/GetLockRecord/GetLockRecordRepository.js.map +1 -1
  12. package/features/ListAllLockRecords/ListAllLockRecordsRepository.d.ts +3 -3
  13. package/features/ListAllLockRecords/ListAllLockRecordsRepository.js +7 -6
  14. package/features/ListAllLockRecords/ListAllLockRecordsRepository.js.map +1 -1
  15. package/features/ListLockRecords/ListLockRecordsRepository.d.ts +4 -3
  16. package/features/ListLockRecords/ListLockRecordsRepository.js +7 -6
  17. package/features/ListLockRecords/ListLockRecordsRepository.js.map +1 -1
  18. package/features/LockEntry/LockEntryRepository.d.ts +4 -3
  19. package/features/LockEntry/LockEntryRepository.js +6 -5
  20. package/features/LockEntry/LockEntryRepository.js.map +1 -1
  21. package/features/RecordLockingFeature.d.ts +0 -5
  22. package/features/RecordLockingFeature.js +3 -2
  23. package/features/RecordLockingFeature.js.map +1 -1
  24. package/features/RecordLockingModelProvider.d.ts +18 -0
  25. package/features/RecordLockingModelProvider.js +22 -0
  26. package/features/RecordLockingModelProvider.js.map +1 -0
  27. package/features/UnlockEntry/UnlockEntryRepository.d.ts +3 -3
  28. package/features/UnlockEntry/UnlockEntryRepository.js +6 -5
  29. package/features/UnlockEntry/UnlockEntryRepository.js.map +1 -1
  30. package/features/UnlockEntryRequest/UnlockEntryRequestRepository.d.ts +3 -3
  31. package/features/UnlockEntryRequest/UnlockEntryRequestRepository.js +6 -5
  32. package/features/UnlockEntryRequest/UnlockEntryRequestRepository.js.map +1 -1
  33. package/features/UpdateEntryLock/UpdateEntryLockRepository.d.ts +4 -3
  34. package/features/UpdateEntryLock/UpdateEntryLockRepository.js +7 -6
  35. package/features/UpdateEntryLock/UpdateEntryLockRepository.js.map +1 -1
  36. package/graphql/RecordLockingGraphQLSchema.d.ts +25 -0
  37. package/graphql/RecordLockingGraphQLSchema.js +390 -0
  38. package/graphql/RecordLockingGraphQLSchema.js.map +1 -0
  39. package/graphql/checkPermissions.d.ts +3 -3
  40. package/graphql/checkPermissions.js +1 -3
  41. package/graphql/checkPermissions.js.map +1 -1
  42. package/graphql/resolve.d.ts +1 -1
  43. package/graphql/resolve.js +1 -1
  44. package/graphql/resolve.js.map +1 -1
  45. package/index.d.ts +2 -9
  46. package/index.js +1 -60
  47. package/package.json +15 -15
  48. package/graphql/schema.d.ts +0 -11
  49. package/graphql/schema.js +0 -297
  50. package/graphql/schema.js.map +0 -1
  51. package/index.js.map +0 -1
@@ -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 { RecordLockingModel } from "../../domain/abstractions.js";
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(model, deleteEntry){
10
- this.model = model;
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(this.model, id, {
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
- RecordLockingModel,
37
+ RecordLockingModelProvider,
37
38
  DeleteEntryUseCase
38
39
  ]
39
40
  });
@@ -1 +1 @@
1
- {"version":3,"file":"features/UnlockEntry/UnlockEntryRepository.js","sources":["../../../src/features/UnlockEntry/UnlockEntryRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport { UnlockEntryRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { RecordLockingModel } from \"~/domain/abstractions.js\";\nimport { LockRecordNotFoundError, UnlockEntryError } from \"~/domain/errors.js\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId.js\";\n\nclass UnlockEntryRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private model: RecordLockingModel.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async delete(lockRecordId: string): Promise<Result<void, RepositoryAbstraction.Error>> {\n try {\n const entryId = createLockRecordDatabaseId(lockRecordId);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n\n const result = await this.deleteEntry.execute(this.model, id, {\n permanently: true\n });\n\n if (result.isFail()) {\n if (result.error.code === \"Cms/Entry/NotFound\") {\n return Result.fail(new LockRecordNotFoundError());\n }\n return Result.fail(new UnlockEntryError(result.error));\n }\n\n return Result.ok();\n } catch (error) {\n return Result.fail(new UnlockEntryError(error as Error));\n }\n }\n}\n\nexport const UnlockEntryRepository = RepositoryAbstraction.createImplementation({\n implementation: UnlockEntryRepositoryImpl,\n dependencies: [RecordLockingModel, DeleteEntryUseCase]\n});\n"],"names":["UnlockEntryRepositoryImpl","model","deleteEntry","lockRecordId","entryId","createLockRecordDatabaseId","id","createIdentifier","result","Result","LockRecordNotFoundError","UnlockEntryError","error","UnlockEntryRepository","RepositoryAbstraction","RecordLockingModel","DeleteEntryUseCase"],"mappings":";;;;;;;AAQA,MAAMA;IACF,YACYC,KAAmC,EACnCC,WAAyC,CACnD;aAFUD,KAAK,GAALA;aACAC,WAAW,GAAXA;IACT;IAEH,MAAM,OAAOC,YAAoB,EAAsD;QACnF,IAAI;YACA,MAAMC,UAAUC,2BAA2BF;YAC3C,MAAMG,KAAKC,iBAAiB;gBACxB,IAAIH;gBACJ,SAAS;YACb;YAEA,MAAMI,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAEF,IAAI;gBAC1D,aAAa;YACjB;YAEA,IAAIE,OAAO,MAAM,IAAI;gBACjB,IAAIA,AAAsB,yBAAtBA,OAAO,KAAK,CAAC,IAAI,EACjB,OAAOC,OAAO,IAAI,CAAC,IAAIC;gBAE3B,OAAOD,OAAO,IAAI,CAAC,IAAIE,iBAAiBH,OAAO,KAAK;YACxD;YAEA,OAAOC,OAAO,EAAE;QACpB,EAAE,OAAOG,OAAO;YACZ,OAAOH,OAAO,IAAI,CAAC,IAAIE,iBAAiBC;QAC5C;IACJ;AACJ;AAEO,MAAMC,8CAAwBC,sBAAAA,oBAA0C,CAAC;IAC5E,gBAAgBd;IAChB,cAAc;QAACe;QAAoBC;KAAmB;AAC1D"}
1
+ {"version":3,"file":"features/UnlockEntry/UnlockEntryRepository.js","sources":["../../../src/features/UnlockEntry/UnlockEntryRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport { UnlockEntryRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { RecordLockingModelProvider } from \"~/domain/abstractions.js\";\nimport { LockRecordNotFoundError, UnlockEntryError } from \"~/domain/errors.js\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId.js\";\n\nclass UnlockEntryRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private modelProvider: RecordLockingModelProvider.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async delete(lockRecordId: string): Promise<Result<void, RepositoryAbstraction.Error>> {\n try {\n const model = await this.modelProvider.get();\n\n const entryId = createLockRecordDatabaseId(lockRecordId);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n\n const result = await this.deleteEntry.execute(model, id, {\n permanently: true\n });\n\n if (result.isFail()) {\n if (result.error.code === \"Cms/Entry/NotFound\") {\n return Result.fail(new LockRecordNotFoundError());\n }\n return Result.fail(new UnlockEntryError(result.error));\n }\n\n return Result.ok();\n } catch (error) {\n return Result.fail(new UnlockEntryError(error as Error));\n }\n }\n}\n\nexport const UnlockEntryRepository = RepositoryAbstraction.createImplementation({\n implementation: UnlockEntryRepositoryImpl,\n dependencies: [RecordLockingModelProvider, DeleteEntryUseCase]\n});\n"],"names":["UnlockEntryRepositoryImpl","modelProvider","deleteEntry","lockRecordId","model","entryId","createLockRecordDatabaseId","id","createIdentifier","result","Result","LockRecordNotFoundError","UnlockEntryError","error","UnlockEntryRepository","RepositoryAbstraction","RecordLockingModelProvider","DeleteEntryUseCase"],"mappings":";;;;;;;AAQA,MAAMA;IACF,YACYC,aAAmD,EACnDC,WAAyC,CACnD;aAFUD,aAAa,GAAbA;aACAC,WAAW,GAAXA;IACT;IAEH,MAAM,OAAOC,YAAoB,EAAsD;QACnF,IAAI;YACA,MAAMC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG;YAE1C,MAAMC,UAAUC,2BAA2BH;YAC3C,MAAMI,KAAKC,iBAAiB;gBACxB,IAAIH;gBACJ,SAAS;YACb;YAEA,MAAMI,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAACL,OAAOG,IAAI;gBACrD,aAAa;YACjB;YAEA,IAAIE,OAAO,MAAM,IAAI;gBACjB,IAAIA,AAAsB,yBAAtBA,OAAO,KAAK,CAAC,IAAI,EACjB,OAAOC,OAAO,IAAI,CAAC,IAAIC;gBAE3B,OAAOD,OAAO,IAAI,CAAC,IAAIE,iBAAiBH,OAAO,KAAK;YACxD;YAEA,OAAOC,OAAO,EAAE;QACpB,EAAE,OAAOG,OAAO;YACZ,OAAOH,OAAO,IAAI,CAAC,IAAIE,iBAAiBC;QAC5C;IACJ;AACJ;AAEO,MAAMC,8CAAwBC,sBAAAA,oBAA0C,CAAC;IAC5E,gBAAgBf;IAChB,cAAc;QAACgB;QAA4BC;KAAmB;AAClE"}
@@ -2,13 +2,13 @@ import { Result } from "@webiny/feature/api";
2
2
  import { UnlockEntryRequestRepository as RepositoryAbstraction } from "./abstractions.js";
3
3
  import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry";
4
4
  import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
5
+ import { RecordLockingModelProvider } from "../../domain/abstractions.js";
5
6
  import type { ILockRecord } from "../../domain/LockRecord.js";
6
- import type { CmsModel } from "@webiny/api-headless-cms/types";
7
7
  declare class UnlockEntryRequestRepositoryImpl implements RepositoryAbstraction.Interface {
8
8
  private updateEntry;
9
9
  private identityContext;
10
- private model;
11
- constructor(updateEntry: UpdateEntryUseCase.Interface, identityContext: IdentityContext.Interface, model: CmsModel);
10
+ private modelProvider;
11
+ constructor(updateEntry: UpdateEntryUseCase.Interface, identityContext: IdentityContext.Interface, modelProvider: RecordLockingModelProvider.Interface);
12
12
  update(record: ILockRecord): Promise<Result<ILockRecord, RepositoryAbstraction.Error>>;
13
13
  }
14
14
  export declare const UnlockEntryRequestRepository: typeof UnlockEntryRequestRepositoryImpl & {
@@ -2,25 +2,26 @@ import { Result } from "@webiny/feature/api";
2
2
  import { UnlockEntryRequestRepository } from "./abstractions.js";
3
3
  import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry";
4
4
  import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
5
- import { RecordLockingModel } from "../../domain/abstractions.js";
5
+ import { RecordLockingModelProvider } from "../../domain/abstractions.js";
6
6
  import { UnlockEntryRequestError } from "../../domain/errors.js";
7
7
  import { createLockRecordDatabaseId } from "../../utils/lockRecordDatabaseId.js";
8
8
  import { createIdentifier } from "@webiny/utils";
9
9
  class UnlockEntryRequestRepositoryImpl {
10
- constructor(updateEntry, identityContext, model){
10
+ constructor(updateEntry, identityContext, modelProvider){
11
11
  this.updateEntry = updateEntry;
12
12
  this.identityContext = identityContext;
13
- this.model = model;
13
+ this.modelProvider = modelProvider;
14
14
  }
15
15
  async update(record) {
16
16
  try {
17
+ const model = await this.modelProvider.get();
17
18
  const entryId = createLockRecordDatabaseId(record.id);
18
19
  const id = createIdentifier({
19
20
  id: entryId,
20
21
  version: 1
21
22
  });
22
23
  const recordValues = record.toObject();
23
- const result = await this.identityContext.withoutAuthorization(async ()=>await this.updateEntry.execute(this.model, id, {
24
+ const result = await this.identityContext.withoutAuthorization(async ()=>await this.updateEntry.execute(model, id, {
24
25
  ...recordValues,
25
26
  values: recordValues
26
27
  }));
@@ -36,7 +37,7 @@ const UnlockEntryRequestRepository_UnlockEntryRequestRepository = UnlockEntryReq
36
37
  dependencies: [
37
38
  UpdateEntryUseCase,
38
39
  IdentityContext,
39
- RecordLockingModel
40
+ RecordLockingModelProvider
40
41
  ]
41
42
  });
42
43
  export { UnlockEntryRequestRepository_UnlockEntryRequestRepository as UnlockEntryRequestRepository };
@@ -1 +1 @@
1
- {"version":3,"file":"features/UnlockEntryRequest/UnlockEntryRequestRepository.js","sources":["../../../src/features/UnlockEntryRequest/UnlockEntryRequestRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { UnlockEntryRequestRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { RecordLockingModel } from \"~/domain/abstractions.js\";\nimport type { ILockRecord } from \"~/domain/LockRecord.js\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types\";\nimport { UnlockEntryRequestError } from \"~/domain/errors.js\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId.js\";\nimport { createIdentifier } from \"@webiny/utils\";\n\nclass UnlockEntryRequestRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private updateEntry: UpdateEntryUseCase.Interface,\n private identityContext: IdentityContext.Interface,\n private model: CmsModel\n ) {}\n\n async update(record: ILockRecord): Promise<Result<ILockRecord, RepositoryAbstraction.Error>> {\n try {\n const entryId = createLockRecordDatabaseId(record.id);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n\n const recordValues = record.toObject();\n const result = await this.identityContext.withoutAuthorization(async () => {\n return await this.updateEntry.execute(this.model, id, {\n ...recordValues,\n values: recordValues\n });\n });\n\n if (result.isFail()) {\n return Result.fail(new UnlockEntryRequestError(result.error));\n }\n\n return Result.ok(record);\n } catch (error) {\n return Result.fail(new UnlockEntryRequestError(error as Error));\n }\n }\n}\n\nexport const UnlockEntryRequestRepository = RepositoryAbstraction.createImplementation({\n implementation: UnlockEntryRequestRepositoryImpl,\n dependencies: [UpdateEntryUseCase, IdentityContext, RecordLockingModel]\n});\n"],"names":["UnlockEntryRequestRepositoryImpl","updateEntry","identityContext","model","record","entryId","createLockRecordDatabaseId","id","createIdentifier","recordValues","result","Result","UnlockEntryRequestError","error","UnlockEntryRequestRepository","RepositoryAbstraction","UpdateEntryUseCase","IdentityContext","RecordLockingModel"],"mappings":";;;;;;;;AAWA,MAAMA;IACF,YACYC,WAAyC,EACzCC,eAA0C,EAC1CC,KAAe,CACzB;aAHUF,WAAW,GAAXA;aACAC,eAAe,GAAfA;aACAC,KAAK,GAALA;IACT;IAEH,MAAM,OAAOC,MAAmB,EAA6D;QACzF,IAAI;YACA,MAAMC,UAAUC,2BAA2BF,OAAO,EAAE;YACpD,MAAMG,KAAKC,iBAAiB;gBACxB,IAAIH;gBACJ,SAAS;YACb;YAEA,MAAMI,eAAeL,OAAO,QAAQ;YACpC,MAAMM,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,UACpD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAEH,IAAI;oBAClD,GAAGE,YAAY;oBACf,QAAQA;gBACZ;YAGJ,IAAIC,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAAC,IAAIC,wBAAwBF,OAAO,KAAK;YAG/D,OAAOC,OAAO,EAAE,CAACP;QACrB,EAAE,OAAOS,OAAO;YACZ,OAAOF,OAAO,IAAI,CAAC,IAAIC,wBAAwBC;QACnD;IACJ;AACJ;AAEO,MAAMC,4DAA+BC,6BAAAA,oBAA0C,CAAC;IACnF,gBAAgBf;IAChB,cAAc;QAACgB;QAAoBC;QAAiBC;KAAmB;AAC3E"}
1
+ {"version":3,"file":"features/UnlockEntryRequest/UnlockEntryRequestRepository.js","sources":["../../../src/features/UnlockEntryRequest/UnlockEntryRequestRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { UnlockEntryRequestRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { RecordLockingModelProvider } from \"~/domain/abstractions.js\";\nimport type { ILockRecord } from \"~/domain/LockRecord.js\";\nimport { UnlockEntryRequestError } from \"~/domain/errors.js\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId.js\";\nimport { createIdentifier } from \"@webiny/utils\";\n\nclass UnlockEntryRequestRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private updateEntry: UpdateEntryUseCase.Interface,\n private identityContext: IdentityContext.Interface,\n private modelProvider: RecordLockingModelProvider.Interface\n ) {}\n\n async update(record: ILockRecord): Promise<Result<ILockRecord, RepositoryAbstraction.Error>> {\n try {\n const model = await this.modelProvider.get();\n\n const entryId = createLockRecordDatabaseId(record.id);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n\n const recordValues = record.toObject();\n const result = await this.identityContext.withoutAuthorization(async () => {\n return await this.updateEntry.execute(model, id, {\n ...recordValues,\n values: recordValues\n });\n });\n\n if (result.isFail()) {\n return Result.fail(new UnlockEntryRequestError(result.error));\n }\n\n return Result.ok(record);\n } catch (error) {\n return Result.fail(new UnlockEntryRequestError(error as Error));\n }\n }\n}\n\nexport const UnlockEntryRequestRepository = RepositoryAbstraction.createImplementation({\n implementation: UnlockEntryRequestRepositoryImpl,\n dependencies: [UpdateEntryUseCase, IdentityContext, RecordLockingModelProvider]\n});\n"],"names":["UnlockEntryRequestRepositoryImpl","updateEntry","identityContext","modelProvider","record","model","entryId","createLockRecordDatabaseId","id","createIdentifier","recordValues","result","Result","UnlockEntryRequestError","error","UnlockEntryRequestRepository","RepositoryAbstraction","UpdateEntryUseCase","IdentityContext","RecordLockingModelProvider"],"mappings":";;;;;;;;AAUA,MAAMA;IACF,YACYC,WAAyC,EACzCC,eAA0C,EAC1CC,aAAmD,CAC7D;aAHUF,WAAW,GAAXA;aACAC,eAAe,GAAfA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,OAAOC,MAAmB,EAA6D;QACzF,IAAI;YACA,MAAMC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG;YAE1C,MAAMC,UAAUC,2BAA2BH,OAAO,EAAE;YACpD,MAAMI,KAAKC,iBAAiB;gBACxB,IAAIH;gBACJ,SAAS;YACb;YAEA,MAAMI,eAAeN,OAAO,QAAQ;YACpC,MAAMO,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,UACpD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAACN,OAAOG,IAAI;oBAC7C,GAAGE,YAAY;oBACf,QAAQA;gBACZ;YAGJ,IAAIC,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAAC,IAAIC,wBAAwBF,OAAO,KAAK;YAG/D,OAAOC,OAAO,EAAE,CAACR;QACrB,EAAE,OAAOU,OAAO;YACZ,OAAOF,OAAO,IAAI,CAAC,IAAIC,wBAAwBC;QACnD;IACJ;AACJ;AAEO,MAAMC,4DAA+BC,6BAAAA,oBAA0C,CAAC;IACnF,gBAAgBhB;IAChB,cAAc;QAACiB;QAAoBC;QAAiBC;KAA2B;AACnF"}
@@ -3,15 +3,16 @@ import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEnt
3
3
  import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
4
4
  import { Result } from "@webiny/feature/api";
5
5
  import { UpdateEntryLockRepository as RepositoryAbstraction } from "./abstractions.js";
6
- import { RecordLockingConfig, RecordLockingModel } from "../../domain/abstractions.js";
6
+ import { RecordLockingConfig } from "../../domain/abstractions.js";
7
+ import { RecordLockingModelProvider } from "../../domain/abstractions.js";
7
8
  import type { ILockRecord } from "../../domain/LockRecord.js";
8
9
  declare class UpdateEntryLockRepositoryImpl implements RepositoryAbstraction.Interface {
9
- private model;
10
+ private modelProvider;
10
11
  private config;
11
12
  private identityContext;
12
13
  private updateEntry;
13
14
  private getEntryById;
14
- constructor(model: RecordLockingModel.Interface, config: RecordLockingConfig.Interface, identityContext: IdentityContext.Interface, updateEntry: UpdateEntryUseCase.Interface, getEntryById: GetEntryByIdUseCase.Interface);
15
+ constructor(modelProvider: RecordLockingModelProvider.Interface, config: RecordLockingConfig.Interface, identityContext: IdentityContext.Interface, updateEntry: UpdateEntryUseCase.Interface, getEntryById: GetEntryByIdUseCase.Interface);
15
16
  update(lockRecordId: string, updateOwner: boolean): Promise<Result<ILockRecord, RepositoryAbstraction.Error>>;
16
17
  }
17
18
  export declare const UpdateEntryLockRepository: typeof UpdateEntryLockRepositoryImpl & {
@@ -4,13 +4,13 @@ import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEn
4
4
  import { Result } from "@webiny/feature/api";
5
5
  import { createIdentifier } from "@webiny/utils";
6
6
  import { UpdateEntryLockRepository } from "./abstractions.js";
7
- import { RecordLockingConfig, RecordLockingModel } from "../../domain/abstractions.js";
7
+ import { RecordLockingConfig, RecordLockingModelProvider } from "../../domain/abstractions.js";
8
8
  import { LockRecord } from "../../domain/LockRecord.js";
9
9
  import { LockRecordPersistenceError } from "../../domain/errors.js";
10
10
  import { createLockRecordDatabaseId } from "../../utils/lockRecordDatabaseId.js";
11
11
  class UpdateEntryLockRepositoryImpl {
12
- constructor(model, config, identityContext, updateEntry, getEntryById){
13
- this.model = model;
12
+ constructor(modelProvider, config, identityContext, updateEntry, getEntryById){
13
+ this.modelProvider = modelProvider;
14
14
  this.config = config;
15
15
  this.identityContext = identityContext;
16
16
  this.updateEntry = updateEntry;
@@ -18,6 +18,7 @@ class UpdateEntryLockRepositoryImpl {
18
18
  }
19
19
  async update(lockRecordId, updateOwner) {
20
20
  try {
21
+ const model = await this.modelProvider.get();
21
22
  const entryId = createLockRecordDatabaseId(lockRecordId);
22
23
  const id = createIdentifier({
23
24
  id: entryId,
@@ -33,9 +34,9 @@ class UpdateEntryLockRepositoryImpl {
33
34
  updateData.createdBy = identity;
34
35
  updateData.savedBy = identity;
35
36
  }
36
- const result = await this.updateEntry.execute(this.model, id, updateData);
37
+ const result = await this.updateEntry.execute(model, id, updateData);
37
38
  if (result.isFail()) return Result.fail(new LockRecordPersistenceError(result.error));
38
- const getResult = await this.getEntryById.execute(this.model, id);
39
+ const getResult = await this.getEntryById.execute(model, id);
39
40
  if (getResult.isFail()) return Result.fail(new LockRecordPersistenceError(getResult.error));
40
41
  const entry = getResult.value;
41
42
  const lockRecord = new LockRecord(entry, this.config.timeout);
@@ -48,7 +49,7 @@ class UpdateEntryLockRepositoryImpl {
48
49
  const UpdateEntryLockRepository_UpdateEntryLockRepository = UpdateEntryLockRepository.createImplementation({
49
50
  implementation: UpdateEntryLockRepositoryImpl,
50
51
  dependencies: [
51
- RecordLockingModel,
52
+ RecordLockingModelProvider,
52
53
  RecordLockingConfig,
53
54
  IdentityContext,
54
55
  UpdateEntryUseCase,
@@ -1 +1 @@
1
- {"version":3,"file":"features/UpdateEntryLock/UpdateEntryLockRepository.js","sources":["../../../src/features/UpdateEntryLock/UpdateEntryLockRepository.ts"],"sourcesContent":["import { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { Result } from \"@webiny/feature/api\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport { UpdateEntryLockRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { RecordLockingConfig, RecordLockingModel } 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 UpdateEntryLockRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private model: RecordLockingModel.Interface,\n private config: RecordLockingConfig.Interface,\n private identityContext: IdentityContext.Interface,\n private updateEntry: UpdateEntryUseCase.Interface,\n private getEntryById: GetEntryByIdUseCase.Interface\n ) {}\n\n async update(\n lockRecordId: string,\n updateOwner: boolean\n ): Promise<Result<ILockRecord, RepositoryAbstraction.Error>> {\n try {\n const entryId = createLockRecordDatabaseId(lockRecordId);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n\n const identity = this.identityContext.getIdentity();\n const now = new Date().toISOString();\n\n // Build update data\n const updateData: any = {\n savedOn: now\n };\n\n // If updating owner (expired lock), also update created fields\n if (updateOwner) {\n updateData.createdOn = now;\n updateData.createdBy = identity;\n updateData.savedBy = identity;\n }\n\n const result = await this.updateEntry.execute(this.model, id, updateData);\n\n if (result.isFail()) {\n return Result.fail(new LockRecordPersistenceError(result.error));\n }\n\n // Fetch the updated entry to return full lock record\n const getResult = await this.getEntryById.execute<LockRecordValues>(this.model, id);\n\n if (getResult.isFail()) {\n return Result.fail(new LockRecordPersistenceError(getResult.error));\n }\n\n const entry = getResult.value;\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 UpdateEntryLockRepository = RepositoryAbstraction.createImplementation({\n implementation: UpdateEntryLockRepositoryImpl,\n dependencies: [\n RecordLockingModel,\n RecordLockingConfig,\n IdentityContext,\n UpdateEntryUseCase,\n GetEntryByIdUseCase\n ]\n});\n"],"names":["UpdateEntryLockRepositoryImpl","model","config","identityContext","updateEntry","getEntryById","lockRecordId","updateOwner","entryId","createLockRecordDatabaseId","id","createIdentifier","identity","now","Date","updateData","result","Result","LockRecordPersistenceError","getResult","entry","lockRecord","LockRecord","error","UpdateEntryLockRepository","RepositoryAbstraction","RecordLockingModel","RecordLockingConfig","IdentityContext","UpdateEntryUseCase","GetEntryByIdUseCase"],"mappings":";;;;;;;;;;AAaA,MAAMA;IACF,YACYC,KAAmC,EACnCC,MAAqC,EACrCC,eAA0C,EAC1CC,WAAyC,EACzCC,YAA2C,CACrD;aALUJ,KAAK,GAALA;aACAC,MAAM,GAANA;aACAC,eAAe,GAAfA;aACAC,WAAW,GAAXA;aACAC,YAAY,GAAZA;IACT;IAEH,MAAM,OACFC,YAAoB,EACpBC,WAAoB,EACqC;QACzD,IAAI;YACA,MAAMC,UAAUC,2BAA2BH;YAC3C,MAAMI,KAAKC,iBAAiB;gBACxB,IAAIH;gBACJ,SAAS;YACb;YAEA,MAAMI,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;YACjD,MAAMC,MAAM,IAAIC,OAAO,WAAW;YAGlC,MAAMC,aAAkB;gBACpB,SAASF;YACb;YAGA,IAAIN,aAAa;gBACbQ,WAAW,SAAS,GAAGF;gBACvBE,WAAW,SAAS,GAAGH;gBACvBG,WAAW,OAAO,GAAGH;YACzB;YAEA,MAAMI,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAEN,IAAIK;YAE9D,IAAIC,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAAC,IAAIC,2BAA2BF,OAAO,KAAK;YAIlE,MAAMG,YAAY,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAmB,IAAI,CAAC,KAAK,EAAET;YAEhF,IAAIS,UAAU,MAAM,IAChB,OAAOF,OAAO,IAAI,CAAC,IAAIC,2BAA2BC,UAAU,KAAK;YAGrE,MAAMC,QAAQD,UAAU,KAAK;YAC7B,MAAME,aAAa,IAAIC,WAAWF,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;YAE5D,OAAOH,OAAO,EAAE,CAACI;QACrB,EAAE,OAAOE,OAAO;YACZ,OAAON,OAAO,IAAI,CAAC,IAAIC,2BAA2BK;QACtD;IACJ;AACJ;AAEO,MAAMC,sDAA4BC,0BAAAA,oBAA0C,CAAC;IAChF,gBAAgBzB;IAChB,cAAc;QACV0B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
1
+ {"version":3,"file":"features/UpdateEntryLock/UpdateEntryLockRepository.js","sources":["../../../src/features/UpdateEntryLock/UpdateEntryLockRepository.ts"],"sourcesContent":["import { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { Result } from \"@webiny/feature/api\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport { UpdateEntryLockRepository 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 UpdateEntryLockRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private modelProvider: RecordLockingModelProvider.Interface,\n private config: RecordLockingConfig.Interface,\n private identityContext: IdentityContext.Interface,\n private updateEntry: UpdateEntryUseCase.Interface,\n private getEntryById: GetEntryByIdUseCase.Interface\n ) {}\n\n async update(\n lockRecordId: string,\n updateOwner: boolean\n ): Promise<Result<ILockRecord, RepositoryAbstraction.Error>> {\n try {\n const model = await this.modelProvider.get();\n\n const entryId = createLockRecordDatabaseId(lockRecordId);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n\n const identity = this.identityContext.getIdentity();\n const now = new Date().toISOString();\n\n // Build update data\n const updateData: any = {\n savedOn: now\n };\n\n // If updating owner (expired lock), also update created fields\n if (updateOwner) {\n updateData.createdOn = now;\n updateData.createdBy = identity;\n updateData.savedBy = identity;\n }\n\n const result = await this.updateEntry.execute(model, id, updateData);\n\n if (result.isFail()) {\n return Result.fail(new LockRecordPersistenceError(result.error));\n }\n\n // Fetch the updated entry to return full lock record\n const getResult = await this.getEntryById.execute<LockRecordValues>(model, id);\n\n if (getResult.isFail()) {\n return Result.fail(new LockRecordPersistenceError(getResult.error));\n }\n\n const entry = getResult.value;\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 UpdateEntryLockRepository = RepositoryAbstraction.createImplementation({\n implementation: UpdateEntryLockRepositoryImpl,\n dependencies: [\n RecordLockingModelProvider,\n RecordLockingConfig,\n IdentityContext,\n UpdateEntryUseCase,\n GetEntryByIdUseCase\n ]\n});\n"],"names":["UpdateEntryLockRepositoryImpl","modelProvider","config","identityContext","updateEntry","getEntryById","lockRecordId","updateOwner","model","entryId","createLockRecordDatabaseId","id","createIdentifier","identity","now","Date","updateData","result","Result","LockRecordPersistenceError","getResult","entry","lockRecord","LockRecord","error","UpdateEntryLockRepository","RepositoryAbstraction","RecordLockingModelProvider","RecordLockingConfig","IdentityContext","UpdateEntryUseCase","GetEntryByIdUseCase"],"mappings":";;;;;;;;;;AAcA,MAAMA;IACF,YACYC,aAAmD,EACnDC,MAAqC,EACrCC,eAA0C,EAC1CC,WAAyC,EACzCC,YAA2C,CACrD;aALUJ,aAAa,GAAbA;aACAC,MAAM,GAANA;aACAC,eAAe,GAAfA;aACAC,WAAW,GAAXA;aACAC,YAAY,GAAZA;IACT;IAEH,MAAM,OACFC,YAAoB,EACpBC,WAAoB,EACqC;QACzD,IAAI;YACA,MAAMC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG;YAE1C,MAAMC,UAAUC,2BAA2BJ;YAC3C,MAAMK,KAAKC,iBAAiB;gBACxB,IAAIH;gBACJ,SAAS;YACb;YAEA,MAAMI,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;YACjD,MAAMC,MAAM,IAAIC,OAAO,WAAW;YAGlC,MAAMC,aAAkB;gBACpB,SAASF;YACb;YAGA,IAAIP,aAAa;gBACbS,WAAW,SAAS,GAAGF;gBACvBE,WAAW,SAAS,GAAGH;gBACvBG,WAAW,OAAO,GAAGH;YACzB;YAEA,MAAMI,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAACT,OAAOG,IAAIK;YAEzD,IAAIC,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAAC,IAAIC,2BAA2BF,OAAO,KAAK;YAIlE,MAAMG,YAAY,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAmBZ,OAAOG;YAE3E,IAAIS,UAAU,MAAM,IAChB,OAAOF,OAAO,IAAI,CAAC,IAAIC,2BAA2BC,UAAU,KAAK;YAGrE,MAAMC,QAAQD,UAAU,KAAK;YAC7B,MAAME,aAAa,IAAIC,WAAWF,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;YAE5D,OAAOH,OAAO,EAAE,CAACI;QACrB,EAAE,OAAOE,OAAO;YACZ,OAAON,OAAO,IAAI,CAAC,IAAIC,2BAA2BK;QACtD;IACJ;AACJ;AAEO,MAAMC,sDAA4BC,0BAAAA,oBAA0C,CAAC;IAChF,gBAAgB1B;IAChB,cAAc;QACV2B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -0,0 +1,25 @@
1
+ import { GraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.js";
2
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
3
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
4
+ import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels/index.js";
5
+ import { CmsModelFieldToGraphQLRegistry } from "@webiny/api-headless-cms/exports/api/cms/graphql.js";
6
+ import { RecordLockingModelProvider } from "../domain/abstractions.js";
7
+ /**
8
+ * The record locking GraphQL schema. The lock record type is rendered from the lock record model,
9
+ * which is loaded when the schema is composed.
10
+ */
11
+ declare class RecordLockingGraphQLSchemaImpl implements GraphQLSchemaFactory.Interface {
12
+ private readonly tenantContext;
13
+ private readonly identityContext;
14
+ private readonly modelProvider;
15
+ private readonly listModelsUseCase;
16
+ private readonly fieldRegistry;
17
+ constructor(tenantContext: TenantContext.Interface, identityContext: IdentityContext.Interface, modelProvider: RecordLockingModelProvider.Interface, listModelsUseCase: ListModelsUseCase.Interface, fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface);
18
+ getSchemaKey(): Promise<string>;
19
+ execute(builder: GraphQLSchemaFactory.SchemaBuilder): Promise<GraphQLSchemaFactory.SchemaBuilder>;
20
+ private loadInputs;
21
+ }
22
+ export declare const RecordLockingGraphQLSchema: typeof RecordLockingGraphQLSchemaImpl & {
23
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-graphql/graphql/abstractions.public.js").IGraphQLSchemaFactory>;
24
+ };
25
+ export {};
@@ -0,0 +1,390 @@
1
+ import { GraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.js";
2
+ import { createModelSchemaKey } from "@webiny/api-headless-cms/utils/createModelSchemaKey.js";
3
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
4
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
5
+ import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels/index.js";
6
+ import { CmsModelFieldToGraphQLRegistry } from "@webiny/api-headless-cms/exports/api/cms/graphql.js";
7
+ import { renderFields } from "@webiny/api-headless-cms/utils/renderFields.js";
8
+ import { renderListFilterFields } from "@webiny/api-headless-cms/utils/renderListFilterFields.js";
9
+ import { renderSortEnum } from "@webiny/api-headless-cms/utils/renderSortEnum.js";
10
+ import { RecordLockingModelProvider } from "../domain/abstractions.js";
11
+ import { IsEntryLockedUseCase } from "../features/IsEntryLocked/abstractions.js";
12
+ import { GetLockRecordUseCase } from "../features/GetLockRecord/abstractions.js";
13
+ import { GetLockedEntryLockRecordUseCase } from "../features/GetLockedEntryLockRecord/abstractions.js";
14
+ import { ListLockRecordsUseCase } from "../features/ListLockRecords/abstractions.js";
15
+ import { ListAllLockRecordsUseCase } from "../features/ListAllLockRecords/abstractions.js";
16
+ import { LockEntryUseCase } from "../features/LockEntry/abstractions.js";
17
+ import { UpdateEntryLockUseCase } from "../features/UpdateEntryLock/abstractions.js";
18
+ import { UnlockEntryUseCase } from "../features/UnlockEntry/abstractions.js";
19
+ import { UnlockEntryRequestUseCase } from "../features/UnlockEntryRequest/abstractions.js";
20
+ import { resolve, resolveList } from "./resolve.js";
21
+ import { checkPermissions } from "./checkPermissions.js";
22
+ function renderTypeDefs(params) {
23
+ const { model, fieldRegistry } = params;
24
+ const models = params.models.filter((model)=>model.fields.length > 0);
25
+ const recordLockingFields = renderFields({
26
+ models,
27
+ model,
28
+ fields: model.fields,
29
+ type: "manage",
30
+ fieldRegistry
31
+ });
32
+ const listFilterFieldsRender = renderListFilterFields({
33
+ model,
34
+ fields: model.fields,
35
+ type: "manage",
36
+ fieldRegistry,
37
+ excludeFields: [
38
+ "entryId"
39
+ ]
40
+ });
41
+ const sortEnumRender = renderSortEnum({
42
+ model,
43
+ fields: model.fields,
44
+ fieldRegistry,
45
+ sorters: []
46
+ });
47
+ return `
48
+ ${recordLockingFields.map((f)=>f.typeDefs).join("\n")}
49
+
50
+ type RecordLockingError {
51
+ message: String
52
+ code: String
53
+ data: JSON
54
+ stack: String
55
+ }
56
+
57
+ enum RecordLockingRecordActionType {
58
+ requested
59
+ approved
60
+ denied
61
+ }
62
+
63
+ type RecordLockingIdentity {
64
+ id: String!
65
+ displayName: String
66
+ type: String
67
+ }
68
+
69
+ type RecordLockingRecordAction {
70
+ id: ID!
71
+ type: RecordLockingRecordActionType!
72
+ message: String
73
+ createdBy: RecordLockingIdentity!
74
+ createdOn: DateTime!
75
+ }
76
+
77
+ type RecordLockingRecord {
78
+ id: ID!
79
+ lockedBy: RecordLockingIdentity!
80
+ lockedOn: DateTime!
81
+ updatedOn: DateTime!
82
+ expiresOn: DateTime!
83
+ ${recordLockingFields.map((f)=>f.fields).join("\n")}
84
+ }
85
+
86
+ type RecordLockingIsEntryLockedResponse {
87
+ data: Boolean
88
+ error: RecordLockingError
89
+ }
90
+
91
+ type RecordLockingGetLockRecordResponse {
92
+ data: RecordLockingRecord
93
+ error: RecordLockingError
94
+ }
95
+
96
+ type RecordLockingGetLockedEntryLockRecordResponse {
97
+ data: RecordLockingRecord
98
+ error: RecordLockingError
99
+ }
100
+
101
+ type RecordLockingListLockRecordsResponse {
102
+ data: [RecordLockingRecord!]
103
+ error: RecordLockingError
104
+ }
105
+
106
+ type RecordLockingLockEntryResponse {
107
+ data: RecordLockingRecord
108
+ error: RecordLockingError
109
+ }
110
+
111
+ type RecordLockingUpdateLockResponse {
112
+ data: RecordLockingRecord
113
+ error: RecordLockingError
114
+ }
115
+
116
+ type RecordLockingUnlockEntryResponse {
117
+ data: RecordLockingRecord
118
+ error: RecordLockingError
119
+ }
120
+
121
+ type RecordLockingUnlockEntryRequestResponse {
122
+ data: RecordLockingRecord
123
+ error: RecordLockingError
124
+ }
125
+
126
+ input RecordLockingListWhereInput {
127
+ ${listFilterFieldsRender.allFiltersAsString()}
128
+ }
129
+
130
+ enum RecordLockingListSorter {
131
+ ${sortEnumRender}
132
+ }
133
+
134
+ type RecordLockingQuery {
135
+ _empty: String
136
+ }
137
+
138
+ type RecordLockingMutation {
139
+ _empty: String
140
+ }
141
+
142
+ extend type RecordLockingQuery {
143
+ isEntryLocked(id: ID!, type: String!): RecordLockingIsEntryLockedResponse!
144
+ getLockRecord(id: ID!, type: String!): RecordLockingGetLockRecordResponse!
145
+ # 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
146
+ getLockedEntryLockRecord(id: ID!, type: String!): RecordLockingGetLockedEntryLockRecordResponse!
147
+ listAllLockRecords(
148
+ where: RecordLockingListWhereInput
149
+ sort: [RecordLockingListSorter!]
150
+ limit: Int
151
+ after: String
152
+ ): RecordLockingListLockRecordsResponse!
153
+ # Basically same as listAllLockRecords except this one will filter out records with expired lock.
154
+ listLockRecords(
155
+ where: RecordLockingListWhereInput
156
+ sort: [RecordLockingListSorter!]
157
+ limit: Int
158
+ after: String
159
+ ): RecordLockingListLockRecordsResponse!
160
+ }
161
+
162
+ extend type RecordLockingMutation {
163
+ lockEntry(id: ID!, type: String!): RecordLockingLockEntryResponse!
164
+ updateEntryLock(id: ID!, type: String!): RecordLockingUpdateLockResponse!
165
+ unlockEntry(id: ID!, type: String!, force: Boolean): RecordLockingUnlockEntryResponse!
166
+ unlockEntryRequest(
167
+ id: ID!
168
+ type: String!
169
+ ): RecordLockingUnlockEntryRequestResponse!
170
+ }
171
+
172
+ extend type Query {
173
+ recordLocking: RecordLockingQuery
174
+ }
175
+
176
+ extend type Mutation {
177
+ recordLocking: RecordLockingMutation
178
+ }
179
+ `;
180
+ }
181
+ function addQueryResolvers(builder) {
182
+ builder.addResolver({
183
+ path: "Query.recordLocking",
184
+ resolver: ()=>async ()=>({})
185
+ });
186
+ builder.addResolver({
187
+ path: "RecordLockingQuery.isEntryLocked",
188
+ dependencies: [
189
+ IdentityContext,
190
+ IsEntryLockedUseCase
191
+ ],
192
+ resolver: (identityContext, useCase)=>({ args })=>resolve(async ()=>{
193
+ checkPermissions(identityContext);
194
+ const result = await useCase.execute({
195
+ id: args.id,
196
+ type: args.type
197
+ });
198
+ if (result.isFail()) throw result.error;
199
+ return result.value;
200
+ })
201
+ });
202
+ builder.addResolver({
203
+ path: "RecordLockingQuery.getLockRecord",
204
+ dependencies: [
205
+ IdentityContext,
206
+ GetLockRecordUseCase
207
+ ],
208
+ resolver: (identityContext, useCase)=>({ args })=>resolve(async ()=>{
209
+ checkPermissions(identityContext);
210
+ const result = await useCase.execute({
211
+ id: args.id,
212
+ type: args.type
213
+ });
214
+ if (result.isFail()) throw result.error;
215
+ return result.value;
216
+ })
217
+ });
218
+ builder.addResolver({
219
+ path: "RecordLockingQuery.getLockedEntryLockRecord",
220
+ dependencies: [
221
+ IdentityContext,
222
+ GetLockedEntryLockRecordUseCase
223
+ ],
224
+ resolver: (identityContext, useCase)=>({ args })=>resolve(async ()=>{
225
+ checkPermissions(identityContext);
226
+ const result = await useCase.execute({
227
+ id: args.id,
228
+ type: args.type
229
+ });
230
+ if (result.isFail()) return null;
231
+ return result.value;
232
+ })
233
+ });
234
+ builder.addResolver({
235
+ path: "RecordLockingQuery.listLockRecords",
236
+ dependencies: [
237
+ IdentityContext,
238
+ ListLockRecordsUseCase
239
+ ],
240
+ resolver: (identityContext, useCase)=>({ args })=>resolveList(async ()=>{
241
+ checkPermissions(identityContext);
242
+ const result = await useCase.execute(args);
243
+ if (result.isFail()) throw result.error;
244
+ return result.value;
245
+ })
246
+ });
247
+ builder.addResolver({
248
+ path: "RecordLockingQuery.listAllLockRecords",
249
+ dependencies: [
250
+ IdentityContext,
251
+ ListAllLockRecordsUseCase
252
+ ],
253
+ resolver: (identityContext, useCase)=>({ args })=>resolveList(async ()=>{
254
+ checkPermissions(identityContext);
255
+ const result = await useCase.execute(args);
256
+ if (result.isFail()) throw result.error;
257
+ return result.value;
258
+ })
259
+ });
260
+ }
261
+ function addMutationResolvers(builder) {
262
+ builder.addResolver({
263
+ path: "Mutation.recordLocking",
264
+ resolver: ()=>async ()=>({})
265
+ });
266
+ builder.addResolver({
267
+ path: "RecordLockingMutation.lockEntry",
268
+ dependencies: [
269
+ IdentityContext,
270
+ LockEntryUseCase
271
+ ],
272
+ resolver: (identityContext, useCase)=>({ args })=>resolve(async ()=>{
273
+ checkPermissions(identityContext);
274
+ const result = await useCase.execute({
275
+ id: args.id,
276
+ type: args.type
277
+ });
278
+ if (result.isFail()) throw result.error;
279
+ return result.value;
280
+ })
281
+ });
282
+ builder.addResolver({
283
+ path: "RecordLockingMutation.updateEntryLock",
284
+ dependencies: [
285
+ IdentityContext,
286
+ UpdateEntryLockUseCase
287
+ ],
288
+ resolver: (identityContext, useCase)=>({ args })=>resolve(async ()=>{
289
+ checkPermissions(identityContext);
290
+ const result = await useCase.execute({
291
+ id: args.id,
292
+ type: args.type
293
+ });
294
+ if (result.isFail()) throw result.error;
295
+ return result.value;
296
+ })
297
+ });
298
+ builder.addResolver({
299
+ path: "RecordLockingMutation.unlockEntry",
300
+ dependencies: [
301
+ IdentityContext,
302
+ UnlockEntryUseCase
303
+ ],
304
+ resolver: (identityContext, useCase)=>({ args })=>resolve(async ()=>{
305
+ checkPermissions(identityContext);
306
+ const result = await useCase.execute({
307
+ id: args.id,
308
+ type: args.type,
309
+ force: args.force
310
+ });
311
+ if (result.isFail()) throw result.error;
312
+ return result.value;
313
+ })
314
+ });
315
+ builder.addResolver({
316
+ path: "RecordLockingMutation.unlockEntryRequest",
317
+ dependencies: [
318
+ IdentityContext,
319
+ UnlockEntryRequestUseCase
320
+ ],
321
+ resolver: (identityContext, useCase)=>({ args })=>resolve(async ()=>{
322
+ checkPermissions(identityContext);
323
+ const result = await useCase.execute({
324
+ id: args.id,
325
+ type: args.type
326
+ });
327
+ if (result.isFail()) throw result.error;
328
+ return result.value;
329
+ })
330
+ });
331
+ }
332
+ class RecordLockingGraphQLSchemaImpl {
333
+ constructor(tenantContext, identityContext, modelProvider, listModelsUseCase, fieldRegistry){
334
+ this.tenantContext = tenantContext;
335
+ this.identityContext = identityContext;
336
+ this.modelProvider = modelProvider;
337
+ this.listModelsUseCase = listModelsUseCase;
338
+ this.fieldRegistry = fieldRegistry;
339
+ }
340
+ async getSchemaKey() {
341
+ const inputs = await this.loadInputs();
342
+ if (!inputs) return "RecordLocking:no-tenant";
343
+ const modelKey = createModelSchemaKey([
344
+ inputs.model
345
+ ], inputs.models);
346
+ return `RecordLocking:${modelKey}`;
347
+ }
348
+ async execute(builder) {
349
+ const inputs = await this.loadInputs();
350
+ if (!inputs) return builder;
351
+ const { model, models } = inputs;
352
+ const typeDefs = renderTypeDefs({
353
+ model,
354
+ models,
355
+ fieldRegistry: this.fieldRegistry
356
+ });
357
+ builder.addTypeDefs(typeDefs);
358
+ addQueryResolvers(builder);
359
+ addMutationResolvers(builder);
360
+ return builder;
361
+ }
362
+ async loadInputs() {
363
+ if (!this.tenantContext.getTenant()) return null;
364
+ const model = await this.modelProvider.get();
365
+ const models = await this.identityContext.withoutAuthorization(async ()=>{
366
+ const result = await this.listModelsUseCase.execute({
367
+ includePrivate: false
368
+ });
369
+ if (result.isFail()) throw result.error;
370
+ return result.value;
371
+ });
372
+ return {
373
+ model,
374
+ models
375
+ };
376
+ }
377
+ }
378
+ const RecordLockingGraphQLSchema = GraphQLSchemaFactory.createImplementation({
379
+ implementation: RecordLockingGraphQLSchemaImpl,
380
+ dependencies: [
381
+ TenantContext,
382
+ IdentityContext,
383
+ RecordLockingModelProvider,
384
+ ListModelsUseCase,
385
+ CmsModelFieldToGraphQLRegistry
386
+ ]
387
+ });
388
+ export { RecordLockingGraphQLSchema };
389
+
390
+ //# sourceMappingURL=RecordLockingGraphQLSchema.js.map