@webiny/api-record-locking 5.43.0-beta.0 → 5.43.0-beta.2

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 (41) hide show
  1. package/crud/crud.js +4 -0
  2. package/crud/crud.js.map +1 -1
  3. package/index.d.ts +3 -0
  4. package/index.js.map +1 -1
  5. package/package.json +19 -20
  6. package/types.d.ts +1 -0
  7. package/types.js.map +1 -1
  8. package/useCases/GetLockRecord/GetLockRecordUseCase.d.ts +3 -0
  9. package/useCases/GetLockRecord/GetLockRecordUseCase.js +6 -2
  10. package/useCases/GetLockRecord/GetLockRecordUseCase.js.map +1 -1
  11. package/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase.d.ts +3 -3
  12. package/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase.js +5 -3
  13. package/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase.js.map +1 -1
  14. package/useCases/IsEntryLocked/IsEntryLockedUseCase.d.ts +0 -3
  15. package/useCases/IsEntryLocked/IsEntryLockedUseCase.js +2 -6
  16. package/useCases/IsEntryLocked/IsEntryLockedUseCase.js.map +1 -1
  17. package/useCases/LockEntryUseCase/LockEntryUseCase.d.ts +5 -0
  18. package/useCases/LockEntryUseCase/LockEntryUseCase.js +19 -6
  19. package/useCases/LockEntryUseCase/LockEntryUseCase.js.map +1 -1
  20. package/useCases/UnlockEntryUseCase/UnlockEntryUseCase.d.ts +3 -0
  21. package/useCases/UnlockEntryUseCase/UnlockEntryUseCase.js +19 -12
  22. package/useCases/UnlockEntryUseCase/UnlockEntryUseCase.js.map +1 -1
  23. package/useCases/UnlockRequestUseCase/UnlockEntryRequestUseCase.d.ts +4 -1
  24. package/useCases/UnlockRequestUseCase/UnlockEntryRequestUseCase.js +7 -3
  25. package/useCases/UnlockRequestUseCase/UnlockEntryRequestUseCase.js.map +1 -1
  26. package/useCases/UpdateEntryLock/UpdateEntryLockUseCase.d.ts +5 -0
  27. package/useCases/UpdateEntryLock/UpdateEntryLockUseCase.js +48 -3
  28. package/useCases/UpdateEntryLock/UpdateEntryLockUseCase.js.map +1 -1
  29. package/useCases/index.d.ts +2 -0
  30. package/useCases/index.js +6 -4
  31. package/useCases/index.js.map +1 -1
  32. package/utils/calculateExpiresOn.js +3 -0
  33. package/utils/calculateExpiresOn.js.map +1 -1
  34. package/utils/convertEntryToLockRecord.d.ts +1 -0
  35. package/utils/convertEntryToLockRecord.js +3 -0
  36. package/utils/convertEntryToLockRecord.js.map +1 -1
  37. package/utils/getTimeout.js +5 -1
  38. package/utils/getTimeout.js.map +1 -1
  39. package/utils/isLockedFactory.d.ts +0 -5
  40. package/utils/isLockedFactory.js +0 -19
  41. package/utils/isLockedFactory.js.map +0 -1
package/crud/crud.js CHANGED
@@ -28,6 +28,9 @@ const createRecordLockingCrud = async params => {
28
28
  const getManager = async () => {
29
29
  return await context.cms.getEntryManager(_model.RECORD_LOCKING_MODEL_ID);
30
30
  };
31
+ const getSecurity = () => {
32
+ return context.security;
33
+ };
31
34
  const getIdentity = () => {
32
35
  const identity = context.security.getIdentity();
33
36
  if (!identity) {
@@ -72,6 +75,7 @@ const createRecordLockingCrud = async params => {
72
75
  } = (0, _useCases.createUseCases)({
73
76
  getIdentity,
74
77
  getManager,
78
+ getSecurity,
75
79
  hasRecordLockingAccess,
76
80
  getWebsockets,
77
81
  getTimeout
package/crud/crud.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["_error","require","_model","_useCases","_pubsub","_getTimeout","createRecordLockingCrud","params","context","getTimeout","baseGetTimeout","timeout","getModel","model","cms","RECORD_LOCKING_MODEL_ID","WebinyError","modelId","getManager","getEntryManager","getIdentity","identity","security","id","displayName","type","hasRecordLockingAccess","hasFulLAccess","hasFullAccess","permission","getPermission","canForceUnlock","onEntryBeforeLock","createTopic","onEntryAfterLock","onEntryLockError","onEntryBeforeUnlock","onEntryAfterUnlock","onEntryUnlockError","onEntryBeforeUnlockRequest","onEntryAfterUnlockRequest","onEntryUnlockRequestError","getWebsockets","websockets","listLockRecordsUseCase","listAllLockRecordsUseCase","getLockRecordUseCase","isEntryLockedUseCase","getLockedEntryLockRecordUseCase","lockEntryUseCase","updateEntryLockUseCase","unlockEntryUseCase","unlockEntryRequestUseCase","createUseCases","listAllLockRecords","benchmark","measure","execute","listLockRecords","getLockRecord","isEntryLocked","getLockedEntryLockRecord","lockEntry","publish","record","ex","error","updateEntryLock","unlockEntry","unlockEntryRequest","exports"],"sources":["crud.ts"],"sourcesContent":["import { WebinyError } from \"@webiny/error\";\nimport {\n Context,\n IGetIdentity,\n IGetWebsocketsContextCallable,\n IHasRecordLockingAccessCallable,\n IRecordLocking,\n IRecordLockingLockRecordValues,\n IRecordLockingModelManager,\n OnEntryAfterLockTopicParams,\n OnEntryAfterUnlockRequestTopicParams,\n OnEntryAfterUnlockTopicParams,\n OnEntryBeforeLockTopicParams,\n OnEntryBeforeUnlockRequestTopicParams,\n OnEntryBeforeUnlockTopicParams,\n OnEntryLockErrorTopicParams,\n OnEntryUnlockErrorTopicParams,\n OnEntryUnlockRequestErrorTopicParams,\n RecordLockingSecurityPermission\n} from \"~/types\";\nimport { RECORD_LOCKING_MODEL_ID } from \"./model\";\nimport { IGetLockRecordUseCaseExecute } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { IIsEntryLockedUseCaseExecute } from \"~/abstractions/IIsEntryLocked\";\nimport { ILockEntryUseCaseExecute } from \"~/abstractions/ILockEntryUseCase\";\nimport { IUnlockEntryUseCaseExecute } from \"~/abstractions/IUnlockEntryUseCase\";\nimport { createUseCases } from \"~/useCases\";\nimport { IUnlockEntryRequestUseCaseExecute } from \"~/abstractions/IUnlockEntryRequestUseCase\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { IListAllLockRecordsUseCaseExecute } from \"~/abstractions/IListAllLockRecordsUseCase\";\nimport { IListLockRecordsUseCaseExecute } from \"~/abstractions/IListLockRecordsUseCase\";\nimport { IUpdateEntryLockUseCaseExecute } from \"~/abstractions/IUpdateEntryLockUseCase\";\nimport { IGetLockedEntryLockRecordUseCaseExecute } from \"~/abstractions/IGetLockedEntryLockRecordUseCase\";\nimport { getTimeout as baseGetTimeout } from \"~/utils/getTimeout\";\n\ninterface Params {\n context: Pick<Context, \"plugins\" | \"cms\" | \"benchmark\" | \"security\" | \"websockets\">;\n timeout?: number;\n}\n\nexport const createRecordLockingCrud = async (params: Params): Promise<IRecordLocking> => {\n const { context } = params;\n const getTimeout = (): number => {\n return baseGetTimeout(params.timeout);\n };\n const getModel = async () => {\n const model = await context.cms.getModel(RECORD_LOCKING_MODEL_ID);\n if (model) {\n return model;\n }\n throw new WebinyError(\"Record Locking model not found.\", \"MODEL_NOT_FOUND\", {\n modelId: RECORD_LOCKING_MODEL_ID\n });\n };\n\n const getManager = async (): Promise<IRecordLockingModelManager> => {\n return await context.cms.getEntryManager<IRecordLockingLockRecordValues>(\n RECORD_LOCKING_MODEL_ID\n );\n };\n\n const getIdentity: IGetIdentity = () => {\n const identity = context.security.getIdentity();\n if (!identity) {\n throw new WebinyError(\"Identity missing.\");\n }\n return {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n };\n };\n\n const hasRecordLockingAccess: IHasRecordLockingAccessCallable = async () => {\n const hasFulLAccess = await context.security.hasFullAccess();\n if (hasFulLAccess) {\n return true;\n }\n const permission = await context.security.getPermission<RecordLockingSecurityPermission>(\n \"recordLocking\"\n );\n return permission?.canForceUnlock === \"yes\";\n };\n\n const onEntryBeforeLock = createTopic<OnEntryBeforeLockTopicParams>(\n \"cms.recordLocking.onEntryBeforeLock\"\n );\n const onEntryAfterLock = createTopic<OnEntryAfterLockTopicParams>(\n \"cms.recordLocking.onEntryAfterLock\"\n );\n const onEntryLockError = createTopic<OnEntryLockErrorTopicParams>(\n \"cms.recordLocking.onEntryLockError\"\n );\n\n const onEntryBeforeUnlock = createTopic<OnEntryBeforeUnlockTopicParams>(\n \"cms.recordLocking.onEntryBeforeUnlock\"\n );\n const onEntryAfterUnlock = createTopic<OnEntryAfterUnlockTopicParams>(\n \"cms.recordLocking.onEntryAfterUnlock\"\n );\n const onEntryUnlockError = createTopic<OnEntryUnlockErrorTopicParams>(\n \"cms.recordLocking.onEntryUnlockError\"\n );\n\n const onEntryBeforeUnlockRequest = createTopic<OnEntryBeforeUnlockRequestTopicParams>(\n \"cms.recordLocking.onEntryBeforeUnlockRequest\"\n );\n const onEntryAfterUnlockRequest = createTopic<OnEntryAfterUnlockRequestTopicParams>(\n \"cms.recordLocking.onEntryAfterUnlockRequest\"\n );\n const onEntryUnlockRequestError = createTopic<OnEntryUnlockRequestErrorTopicParams>(\n \"cms.recordLocking.onEntryUnlockRequestError\"\n );\n\n const getWebsockets: IGetWebsocketsContextCallable = () => {\n return context.websockets;\n };\n\n const {\n listLockRecordsUseCase,\n listAllLockRecordsUseCase,\n getLockRecordUseCase,\n isEntryLockedUseCase,\n getLockedEntryLockRecordUseCase,\n lockEntryUseCase,\n updateEntryLockUseCase,\n unlockEntryUseCase,\n unlockEntryRequestUseCase\n } = createUseCases({\n getIdentity,\n getManager,\n hasRecordLockingAccess,\n getWebsockets,\n getTimeout\n });\n\n const listAllLockRecords: IListAllLockRecordsUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.listAllLockRecords\", async () => {\n return listAllLockRecordsUseCase.execute(params);\n });\n };\n\n const listLockRecords: IListLockRecordsUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.listLockRecords\", async () => {\n return listLockRecordsUseCase.execute(params);\n });\n };\n\n const getLockRecord: IGetLockRecordUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.getLockRecord\", async () => {\n return getLockRecordUseCase.execute(params);\n });\n };\n\n const isEntryLocked: IIsEntryLockedUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.isEntryLocked\", async () => {\n return isEntryLockedUseCase.execute(params);\n });\n };\n\n const getLockedEntryLockRecord: IGetLockedEntryLockRecordUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.getLockedEntryLockRecord\", async () => {\n return getLockedEntryLockRecordUseCase.execute(params);\n });\n };\n\n const lockEntry: ILockEntryUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.lockEntry\", async () => {\n try {\n await onEntryBeforeLock.publish(params);\n const record = await lockEntryUseCase.execute(params);\n await onEntryAfterLock.publish({\n ...params,\n record\n });\n return record;\n } catch (ex) {\n await onEntryLockError.publish({\n ...params,\n error: ex\n });\n throw ex;\n }\n });\n };\n\n const updateEntryLock: IUpdateEntryLockUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.updateEntryLock\", async () => {\n return updateEntryLockUseCase.execute(params);\n });\n };\n\n const unlockEntry: IUnlockEntryUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.unlockEntry\", async () => {\n try {\n await onEntryBeforeUnlock.publish({\n ...params,\n getIdentity\n });\n const record = await unlockEntryUseCase.execute(params);\n await onEntryAfterUnlock.publish({\n ...params,\n record\n });\n return record;\n } catch (ex) {\n await onEntryUnlockError.publish({\n ...params,\n error: ex\n });\n throw ex;\n }\n });\n };\n\n const unlockEntryRequest: IUnlockEntryRequestUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.unlockEntryRequest\", async () => {\n try {\n await onEntryBeforeUnlockRequest.publish(params);\n const record = await unlockEntryRequestUseCase.execute(params);\n await onEntryAfterUnlockRequest.publish({\n ...params,\n record\n });\n return record;\n } catch (ex) {\n await onEntryUnlockRequestError.publish({\n ...params,\n error: ex\n });\n throw ex;\n }\n });\n };\n\n return {\n /**\n * Lifecycle events\n */\n onEntryBeforeLock,\n onEntryAfterLock,\n onEntryLockError,\n onEntryBeforeUnlock,\n onEntryAfterUnlock,\n onEntryUnlockError,\n onEntryBeforeUnlockRequest,\n onEntryAfterUnlockRequest,\n onEntryUnlockRequestError,\n /**\n * Methods\n */\n getModel,\n listLockRecords,\n listAllLockRecords,\n getLockRecord,\n isEntryLocked,\n getLockedEntryLockRecord,\n lockEntry,\n updateEntryLock,\n unlockEntry,\n unlockEntryRequest,\n getTimeout\n };\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAoBA,IAAAC,MAAA,GAAAD,OAAA;AAKA,IAAAE,SAAA,GAAAF,OAAA;AAEA,IAAAG,OAAA,GAAAH,OAAA;AAKA,IAAAI,WAAA,GAAAJ,OAAA;AAOO,MAAMK,uBAAuB,GAAG,MAAOC,MAAc,IAA8B;EACtF,MAAM;IAAEC;EAAQ,CAAC,GAAGD,MAAM;EAC1B,MAAME,UAAU,GAAGA,CAAA,KAAc;IAC7B,OAAO,IAAAC,sBAAc,EAACH,MAAM,CAACI,OAAO,CAAC;EACzC,CAAC;EACD,MAAMC,QAAQ,GAAG,MAAAA,CAAA,KAAY;IACzB,MAAMC,KAAK,GAAG,MAAML,OAAO,CAACM,GAAG,CAACF,QAAQ,CAACG,8BAAuB,CAAC;IACjE,IAAIF,KAAK,EAAE;MACP,OAAOA,KAAK;IAChB;IACA,MAAM,IAAIG,kBAAW,CAAC,iCAAiC,EAAE,iBAAiB,EAAE;MACxEC,OAAO,EAAEF;IACb,CAAC,CAAC;EACN,CAAC;EAED,MAAMG,UAAU,GAAG,MAAAA,CAAA,KAAiD;IAChE,OAAO,MAAMV,OAAO,CAACM,GAAG,CAACK,eAAe,CACpCJ,8BACJ,CAAC;EACL,CAAC;EAED,MAAMK,WAAyB,GAAGA,CAAA,KAAM;IACpC,MAAMC,QAAQ,GAAGb,OAAO,CAACc,QAAQ,CAACF,WAAW,CAAC,CAAC;IAC/C,IAAI,CAACC,QAAQ,EAAE;MACX,MAAM,IAAIL,kBAAW,CAAC,mBAAmB,CAAC;IAC9C;IACA,OAAO;MACHO,EAAE,EAAEF,QAAQ,CAACE,EAAE;MACfC,WAAW,EAAEH,QAAQ,CAACG,WAAW;MACjCC,IAAI,EAAEJ,QAAQ,CAACI;IACnB,CAAC;EACL,CAAC;EAED,MAAMC,sBAAuD,GAAG,MAAAA,CAAA,KAAY;IACxE,MAAMC,aAAa,GAAG,MAAMnB,OAAO,CAACc,QAAQ,CAACM,aAAa,CAAC,CAAC;IAC5D,IAAID,aAAa,EAAE;MACf,OAAO,IAAI;IACf;IACA,MAAME,UAAU,GAAG,MAAMrB,OAAO,CAACc,QAAQ,CAACQ,aAAa,CACnD,eACJ,CAAC;IACD,OAAOD,UAAU,EAAEE,cAAc,KAAK,KAAK;EAC/C,CAAC;EAED,MAAMC,iBAAiB,GAAG,IAAAC,mBAAW,EACjC,qCACJ,CAAC;EACD,MAAMC,gBAAgB,GAAG,IAAAD,mBAAW,EAChC,oCACJ,CAAC;EACD,MAAME,gBAAgB,GAAG,IAAAF,mBAAW,EAChC,oCACJ,CAAC;EAED,MAAMG,mBAAmB,GAAG,IAAAH,mBAAW,EACnC,uCACJ,CAAC;EACD,MAAMI,kBAAkB,GAAG,IAAAJ,mBAAW,EAClC,sCACJ,CAAC;EACD,MAAMK,kBAAkB,GAAG,IAAAL,mBAAW,EAClC,sCACJ,CAAC;EAED,MAAMM,0BAA0B,GAAG,IAAAN,mBAAW,EAC1C,8CACJ,CAAC;EACD,MAAMO,yBAAyB,GAAG,IAAAP,mBAAW,EACzC,6CACJ,CAAC;EACD,MAAMQ,yBAAyB,GAAG,IAAAR,mBAAW,EACzC,6CACJ,CAAC;EAED,MAAMS,aAA4C,GAAGA,CAAA,KAAM;IACvD,OAAOlC,OAAO,CAACmC,UAAU;EAC7B,CAAC;EAED,MAAM;IACFC,sBAAsB;IACtBC,yBAAyB;IACzBC,oBAAoB;IACpBC,oBAAoB;IACpBC,+BAA+B;IAC/BC,gBAAgB;IAChBC,sBAAsB;IACtBC,kBAAkB;IAClBC;EACJ,CAAC,GAAG,IAAAC,wBAAc,EAAC;IACfjC,WAAW;IACXF,UAAU;IACVQ,sBAAsB;IACtBgB,aAAa;IACbjC;EACJ,CAAC,CAAC;EAEF,MAAM6C,kBAAqD,GAAG,MAAM/C,MAAM,IAAI;IAC1E,OAAOC,OAAO,CAAC+C,SAAS,CAACC,OAAO,CAAC,kCAAkC,EAAE,YAAY;MAC7E,OAAOX,yBAAyB,CAACY,OAAO,CAAClD,MAAM,CAAC;IACpD,CAAC,CAAC;EACN,CAAC;EAED,MAAMmD,eAA+C,GAAG,MAAMnD,MAAM,IAAI;IACpE,OAAOC,OAAO,CAAC+C,SAAS,CAACC,OAAO,CAAC,+BAA+B,EAAE,YAAY;MAC1E,OAAOZ,sBAAsB,CAACa,OAAO,CAAClD,MAAM,CAAC;IACjD,CAAC,CAAC;EACN,CAAC;EAED,MAAMoD,aAA2C,GAAG,MAAMpD,MAAM,IAAI;IAChE,OAAOC,OAAO,CAAC+C,SAAS,CAACC,OAAO,CAAC,6BAA6B,EAAE,YAAY;MACxE,OAAOV,oBAAoB,CAACW,OAAO,CAAClD,MAAM,CAAC;IAC/C,CAAC,CAAC;EACN,CAAC;EAED,MAAMqD,aAA2C,GAAG,MAAMrD,MAAM,IAAI;IAChE,OAAOC,OAAO,CAAC+C,SAAS,CAACC,OAAO,CAAC,6BAA6B,EAAE,YAAY;MACxE,OAAOT,oBAAoB,CAACU,OAAO,CAAClD,MAAM,CAAC;IAC/C,CAAC,CAAC;EACN,CAAC;EAED,MAAMsD,wBAAiE,GAAG,MAAMtD,MAAM,IAAI;IACtF,OAAOC,OAAO,CAAC+C,SAAS,CAACC,OAAO,CAAC,wCAAwC,EAAE,YAAY;MACnF,OAAOR,+BAA+B,CAACS,OAAO,CAAClD,MAAM,CAAC;IAC1D,CAAC,CAAC;EACN,CAAC;EAED,MAAMuD,SAAmC,GAAG,MAAMvD,MAAM,IAAI;IACxD,OAAOC,OAAO,CAAC+C,SAAS,CAACC,OAAO,CAAC,yBAAyB,EAAE,YAAY;MACpE,IAAI;QACA,MAAMxB,iBAAiB,CAAC+B,OAAO,CAACxD,MAAM,CAAC;QACvC,MAAMyD,MAAM,GAAG,MAAMf,gBAAgB,CAACQ,OAAO,CAAClD,MAAM,CAAC;QACrD,MAAM2B,gBAAgB,CAAC6B,OAAO,CAAC;UAC3B,GAAGxD,MAAM;UACTyD;QACJ,CAAC,CAAC;QACF,OAAOA,MAAM;MACjB,CAAC,CAAC,OAAOC,EAAE,EAAE;QACT,MAAM9B,gBAAgB,CAAC4B,OAAO,CAAC;UAC3B,GAAGxD,MAAM;UACT2D,KAAK,EAAED;QACX,CAAC,CAAC;QACF,MAAMA,EAAE;MACZ;IACJ,CAAC,CAAC;EACN,CAAC;EAED,MAAME,eAA+C,GAAG,MAAM5D,MAAM,IAAI;IACpE,OAAOC,OAAO,CAAC+C,SAAS,CAACC,OAAO,CAAC,+BAA+B,EAAE,YAAY;MAC1E,OAAON,sBAAsB,CAACO,OAAO,CAAClD,MAAM,CAAC;IACjD,CAAC,CAAC;EACN,CAAC;EAED,MAAM6D,WAAuC,GAAG,MAAM7D,MAAM,IAAI;IAC5D,OAAOC,OAAO,CAAC+C,SAAS,CAACC,OAAO,CAAC,2BAA2B,EAAE,YAAY;MACtE,IAAI;QACA,MAAMpB,mBAAmB,CAAC2B,OAAO,CAAC;UAC9B,GAAGxD,MAAM;UACTa;QACJ,CAAC,CAAC;QACF,MAAM4C,MAAM,GAAG,MAAMb,kBAAkB,CAACM,OAAO,CAAClD,MAAM,CAAC;QACvD,MAAM8B,kBAAkB,CAAC0B,OAAO,CAAC;UAC7B,GAAGxD,MAAM;UACTyD;QACJ,CAAC,CAAC;QACF,OAAOA,MAAM;MACjB,CAAC,CAAC,OAAOC,EAAE,EAAE;QACT,MAAM3B,kBAAkB,CAACyB,OAAO,CAAC;UAC7B,GAAGxD,MAAM;UACT2D,KAAK,EAAED;QACX,CAAC,CAAC;QACF,MAAMA,EAAE;MACZ;IACJ,CAAC,CAAC;EACN,CAAC;EAED,MAAMI,kBAAqD,GAAG,MAAM9D,MAAM,IAAI;IAC1E,OAAOC,OAAO,CAAC+C,SAAS,CAACC,OAAO,CAAC,kCAAkC,EAAE,YAAY;MAC7E,IAAI;QACA,MAAMjB,0BAA0B,CAACwB,OAAO,CAACxD,MAAM,CAAC;QAChD,MAAMyD,MAAM,GAAG,MAAMZ,yBAAyB,CAACK,OAAO,CAAClD,MAAM,CAAC;QAC9D,MAAMiC,yBAAyB,CAACuB,OAAO,CAAC;UACpC,GAAGxD,MAAM;UACTyD;QACJ,CAAC,CAAC;QACF,OAAOA,MAAM;MACjB,CAAC,CAAC,OAAOC,EAAE,EAAE;QACT,MAAMxB,yBAAyB,CAACsB,OAAO,CAAC;UACpC,GAAGxD,MAAM;UACT2D,KAAK,EAAED;QACX,CAAC,CAAC;QACF,MAAMA,EAAE;MACZ;IACJ,CAAC,CAAC;EACN,CAAC;EAED,OAAO;IACH;AACR;AACA;IACQjC,iBAAiB;IACjBE,gBAAgB;IAChBC,gBAAgB;IAChBC,mBAAmB;IACnBC,kBAAkB;IAClBC,kBAAkB;IAClBC,0BAA0B;IAC1BC,yBAAyB;IACzBC,yBAAyB;IACzB;AACR;AACA;IACQ7B,QAAQ;IACR8C,eAAe;IACfJ,kBAAkB;IAClBK,aAAa;IACbC,aAAa;IACbC,wBAAwB;IACxBC,SAAS;IACTK,eAAe;IACfC,WAAW;IACXC,kBAAkB;IAClB5D;EACJ,CAAC;AACL,CAAC;AAAC6D,OAAA,CAAAhE,uBAAA,GAAAA,uBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_error","require","_model","_useCases","_pubsub","_getTimeout","createRecordLockingCrud","params","context","getTimeout","baseGetTimeout","timeout","getModel","model","cms","RECORD_LOCKING_MODEL_ID","WebinyError","modelId","getManager","getEntryManager","getSecurity","security","getIdentity","identity","id","displayName","type","hasRecordLockingAccess","hasFulLAccess","hasFullAccess","permission","getPermission","canForceUnlock","onEntryBeforeLock","createTopic","onEntryAfterLock","onEntryLockError","onEntryBeforeUnlock","onEntryAfterUnlock","onEntryUnlockError","onEntryBeforeUnlockRequest","onEntryAfterUnlockRequest","onEntryUnlockRequestError","getWebsockets","websockets","listLockRecordsUseCase","listAllLockRecordsUseCase","getLockRecordUseCase","isEntryLockedUseCase","getLockedEntryLockRecordUseCase","lockEntryUseCase","updateEntryLockUseCase","unlockEntryUseCase","unlockEntryRequestUseCase","createUseCases","listAllLockRecords","benchmark","measure","execute","listLockRecords","getLockRecord","isEntryLocked","getLockedEntryLockRecord","lockEntry","publish","record","ex","error","updateEntryLock","unlockEntry","unlockEntryRequest","exports"],"sources":["crud.ts"],"sourcesContent":["import { WebinyError } from \"@webiny/error\";\nimport {\n Context,\n IGetIdentity,\n IGetWebsocketsContextCallable,\n IHasRecordLockingAccessCallable,\n IRecordLocking,\n IRecordLockingLockRecordValues,\n IRecordLockingModelManager,\n OnEntryAfterLockTopicParams,\n OnEntryAfterUnlockRequestTopicParams,\n OnEntryAfterUnlockTopicParams,\n OnEntryBeforeLockTopicParams,\n OnEntryBeforeUnlockRequestTopicParams,\n OnEntryBeforeUnlockTopicParams,\n OnEntryLockErrorTopicParams,\n OnEntryUnlockErrorTopicParams,\n OnEntryUnlockRequestErrorTopicParams,\n RecordLockingSecurityPermission\n} from \"~/types\";\nimport { RECORD_LOCKING_MODEL_ID } from \"./model\";\nimport { IGetLockRecordUseCaseExecute } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { IIsEntryLockedUseCaseExecute } from \"~/abstractions/IIsEntryLocked\";\nimport { ILockEntryUseCaseExecute } from \"~/abstractions/ILockEntryUseCase\";\nimport { IUnlockEntryUseCaseExecute } from \"~/abstractions/IUnlockEntryUseCase\";\nimport { createUseCases } from \"~/useCases\";\nimport { IUnlockEntryRequestUseCaseExecute } from \"~/abstractions/IUnlockEntryRequestUseCase\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { IListAllLockRecordsUseCaseExecute } from \"~/abstractions/IListAllLockRecordsUseCase\";\nimport { IListLockRecordsUseCaseExecute } from \"~/abstractions/IListLockRecordsUseCase\";\nimport { IUpdateEntryLockUseCaseExecute } from \"~/abstractions/IUpdateEntryLockUseCase\";\nimport { IGetLockedEntryLockRecordUseCaseExecute } from \"~/abstractions/IGetLockedEntryLockRecordUseCase\";\nimport { getTimeout as baseGetTimeout } from \"~/utils/getTimeout\";\n\ninterface Params {\n context: Pick<Context, \"plugins\" | \"cms\" | \"benchmark\" | \"security\" | \"websockets\">;\n timeout?: number;\n}\n\nexport const createRecordLockingCrud = async (params: Params): Promise<IRecordLocking> => {\n const { context } = params;\n const getTimeout = (): number => {\n return baseGetTimeout(params.timeout);\n };\n const getModel = async () => {\n const model = await context.cms.getModel(RECORD_LOCKING_MODEL_ID);\n if (model) {\n return model;\n }\n throw new WebinyError(\"Record Locking model not found.\", \"MODEL_NOT_FOUND\", {\n modelId: RECORD_LOCKING_MODEL_ID\n });\n };\n\n const getManager = async (): Promise<IRecordLockingModelManager> => {\n return await context.cms.getEntryManager<IRecordLockingLockRecordValues>(\n RECORD_LOCKING_MODEL_ID\n );\n };\n\n const getSecurity = () => {\n return context.security;\n };\n\n const getIdentity: IGetIdentity = () => {\n const identity = context.security.getIdentity();\n if (!identity) {\n throw new WebinyError(\"Identity missing.\");\n }\n return {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n };\n };\n\n const hasRecordLockingAccess: IHasRecordLockingAccessCallable = async () => {\n const hasFulLAccess = await context.security.hasFullAccess();\n if (hasFulLAccess) {\n return true;\n }\n const permission = await context.security.getPermission<RecordLockingSecurityPermission>(\n \"recordLocking\"\n );\n return permission?.canForceUnlock === \"yes\";\n };\n\n const onEntryBeforeLock = createTopic<OnEntryBeforeLockTopicParams>(\n \"cms.recordLocking.onEntryBeforeLock\"\n );\n const onEntryAfterLock = createTopic<OnEntryAfterLockTopicParams>(\n \"cms.recordLocking.onEntryAfterLock\"\n );\n const onEntryLockError = createTopic<OnEntryLockErrorTopicParams>(\n \"cms.recordLocking.onEntryLockError\"\n );\n\n const onEntryBeforeUnlock = createTopic<OnEntryBeforeUnlockTopicParams>(\n \"cms.recordLocking.onEntryBeforeUnlock\"\n );\n const onEntryAfterUnlock = createTopic<OnEntryAfterUnlockTopicParams>(\n \"cms.recordLocking.onEntryAfterUnlock\"\n );\n const onEntryUnlockError = createTopic<OnEntryUnlockErrorTopicParams>(\n \"cms.recordLocking.onEntryUnlockError\"\n );\n\n const onEntryBeforeUnlockRequest = createTopic<OnEntryBeforeUnlockRequestTopicParams>(\n \"cms.recordLocking.onEntryBeforeUnlockRequest\"\n );\n const onEntryAfterUnlockRequest = createTopic<OnEntryAfterUnlockRequestTopicParams>(\n \"cms.recordLocking.onEntryAfterUnlockRequest\"\n );\n const onEntryUnlockRequestError = createTopic<OnEntryUnlockRequestErrorTopicParams>(\n \"cms.recordLocking.onEntryUnlockRequestError\"\n );\n\n const getWebsockets: IGetWebsocketsContextCallable = () => {\n return context.websockets;\n };\n\n const {\n listLockRecordsUseCase,\n listAllLockRecordsUseCase,\n getLockRecordUseCase,\n isEntryLockedUseCase,\n getLockedEntryLockRecordUseCase,\n lockEntryUseCase,\n updateEntryLockUseCase,\n unlockEntryUseCase,\n unlockEntryRequestUseCase\n } = createUseCases({\n getIdentity,\n getManager,\n getSecurity,\n hasRecordLockingAccess,\n getWebsockets,\n getTimeout\n });\n\n const listAllLockRecords: IListAllLockRecordsUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.listAllLockRecords\", async () => {\n return listAllLockRecordsUseCase.execute(params);\n });\n };\n\n const listLockRecords: IListLockRecordsUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.listLockRecords\", async () => {\n return listLockRecordsUseCase.execute(params);\n });\n };\n\n const getLockRecord: IGetLockRecordUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.getLockRecord\", async () => {\n return getLockRecordUseCase.execute(params);\n });\n };\n\n const isEntryLocked: IIsEntryLockedUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.isEntryLocked\", async () => {\n return isEntryLockedUseCase.execute(params);\n });\n };\n\n const getLockedEntryLockRecord: IGetLockedEntryLockRecordUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.getLockedEntryLockRecord\", async () => {\n return getLockedEntryLockRecordUseCase.execute(params);\n });\n };\n\n const lockEntry: ILockEntryUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.lockEntry\", async () => {\n try {\n await onEntryBeforeLock.publish(params);\n const record = await lockEntryUseCase.execute(params);\n await onEntryAfterLock.publish({\n ...params,\n record\n });\n return record;\n } catch (ex) {\n await onEntryLockError.publish({\n ...params,\n error: ex\n });\n throw ex;\n }\n });\n };\n\n const updateEntryLock: IUpdateEntryLockUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.updateEntryLock\", async () => {\n return updateEntryLockUseCase.execute(params);\n });\n };\n\n const unlockEntry: IUnlockEntryUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.unlockEntry\", async () => {\n try {\n await onEntryBeforeUnlock.publish({\n ...params,\n getIdentity\n });\n const record = await unlockEntryUseCase.execute(params);\n await onEntryAfterUnlock.publish({\n ...params,\n record\n });\n return record;\n } catch (ex) {\n await onEntryUnlockError.publish({\n ...params,\n error: ex\n });\n throw ex;\n }\n });\n };\n\n const unlockEntryRequest: IUnlockEntryRequestUseCaseExecute = async params => {\n return context.benchmark.measure(\"recordLocking.unlockEntryRequest\", async () => {\n try {\n await onEntryBeforeUnlockRequest.publish(params);\n const record = await unlockEntryRequestUseCase.execute(params);\n await onEntryAfterUnlockRequest.publish({\n ...params,\n record\n });\n return record;\n } catch (ex) {\n await onEntryUnlockRequestError.publish({\n ...params,\n error: ex\n });\n throw ex;\n }\n });\n };\n\n return {\n /**\n * Lifecycle events\n */\n onEntryBeforeLock,\n onEntryAfterLock,\n onEntryLockError,\n onEntryBeforeUnlock,\n onEntryAfterUnlock,\n onEntryUnlockError,\n onEntryBeforeUnlockRequest,\n onEntryAfterUnlockRequest,\n onEntryUnlockRequestError,\n /**\n * Methods\n */\n getModel,\n listLockRecords,\n listAllLockRecords,\n getLockRecord,\n isEntryLocked,\n getLockedEntryLockRecord,\n lockEntry,\n updateEntryLock,\n unlockEntry,\n unlockEntryRequest,\n getTimeout\n };\n};\n"],"mappings":"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","ignoreList":[]}
package/index.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  import { ContextPlugin } from "@webiny/api";
2
2
  import { Context } from "./types";
3
3
  export interface ICreateContextPluginParams {
4
+ /**
5
+ * A number of seconds after last activity to wait before the record is automatically unlocked.
6
+ */
4
7
  timeout?: number;
5
8
  }
6
9
  export declare const createRecordLocking: (params?: ICreateContextPluginParams) => ContextPlugin<Context>[];
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["_schema","require","_api","_crud","_model","_apiHeadlessCms","createContextPlugin","params","plugin","ContextPlugin","context","wcp","canUseRecordLocking","ready","isHeadlessCmsReady","plugins","register","createLockingModel","recordLocking","createRecordLockingCrud","timeout","graphQlPlugin","createGraphQLSchema","name","createRecordLocking","exports"],"sources":["index.ts"],"sourcesContent":["import { createGraphQLSchema } from \"~/graphql/schema\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { Context } from \"~/types\";\nimport { createRecordLockingCrud } from \"~/crud/crud\";\nimport { createLockingModel } from \"~/crud/model\";\nimport { isHeadlessCmsReady } from \"@webiny/api-headless-cms\";\n\nexport interface ICreateContextPluginParams {\n timeout?: number;\n}\n\nconst createContextPlugin = (params?: ICreateContextPluginParams) => {\n const plugin = new ContextPlugin<Context>(async context => {\n if (!context.wcp.canUseRecordLocking()) {\n return;\n }\n\n const ready = await isHeadlessCmsReady(context);\n if (!ready) {\n return;\n }\n context.plugins.register(createLockingModel());\n\n context.recordLocking = await createRecordLockingCrud({\n context,\n timeout: params?.timeout\n });\n\n const graphQlPlugin = await createGraphQLSchema({ context });\n context.plugins.register(graphQlPlugin);\n });\n plugin.name = \"context.recordLocking\";\n\n return plugin;\n};\n\nexport const createRecordLocking = (params?: ICreateContextPluginParams) => {\n return [createContextPlugin(params)];\n};\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AAEA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AAMA,MAAMK,mBAAmB,GAAIC,MAAmC,IAAK;EACjE,MAAMC,MAAM,GAAG,IAAIC,kBAAa,CAAU,MAAMC,OAAO,IAAI;IACvD,IAAI,CAACA,OAAO,CAACC,GAAG,CAACC,mBAAmB,CAAC,CAAC,EAAE;MACpC;IACJ;IAEA,MAAMC,KAAK,GAAG,MAAM,IAAAC,kCAAkB,EAACJ,OAAO,CAAC;IAC/C,IAAI,CAACG,KAAK,EAAE;MACR;IACJ;IACAH,OAAO,CAACK,OAAO,CAACC,QAAQ,CAAC,IAAAC,yBAAkB,EAAC,CAAC,CAAC;IAE9CP,OAAO,CAACQ,aAAa,GAAG,MAAM,IAAAC,6BAAuB,EAAC;MAClDT,OAAO;MACPU,OAAO,EAAEb,MAAM,EAAEa;IACrB,CAAC,CAAC;IAEF,MAAMC,aAAa,GAAG,MAAM,IAAAC,2BAAmB,EAAC;MAAEZ;IAAQ,CAAC,CAAC;IAC5DA,OAAO,CAACK,OAAO,CAACC,QAAQ,CAACK,aAAa,CAAC;EAC3C,CAAC,CAAC;EACFb,MAAM,CAACe,IAAI,GAAG,uBAAuB;EAErC,OAAOf,MAAM;AACjB,CAAC;AAEM,MAAMgB,mBAAmB,GAAIjB,MAAmC,IAAK;EACxE,OAAO,CAACD,mBAAmB,CAACC,MAAM,CAAC,CAAC;AACxC,CAAC;AAACkB,OAAA,CAAAD,mBAAA,GAAAA,mBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_schema","require","_api","_crud","_model","_apiHeadlessCms","createContextPlugin","params","plugin","ContextPlugin","context","wcp","canUseRecordLocking","ready","isHeadlessCmsReady","plugins","register","createLockingModel","recordLocking","createRecordLockingCrud","timeout","graphQlPlugin","createGraphQLSchema","name","createRecordLocking","exports"],"sources":["index.ts"],"sourcesContent":["import { createGraphQLSchema } from \"~/graphql/schema\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { Context } from \"~/types\";\nimport { createRecordLockingCrud } from \"~/crud/crud\";\nimport { createLockingModel } from \"~/crud/model\";\nimport { isHeadlessCmsReady } from \"@webiny/api-headless-cms\";\n\nexport interface ICreateContextPluginParams {\n /**\n * A number of seconds after last activity to wait before the record is automatically unlocked.\n */\n timeout?: number;\n}\n\nconst createContextPlugin = (params?: ICreateContextPluginParams) => {\n const plugin = new ContextPlugin<Context>(async context => {\n if (!context.wcp.canUseRecordLocking()) {\n return;\n }\n\n const ready = await isHeadlessCmsReady(context);\n if (!ready) {\n return;\n }\n context.plugins.register(createLockingModel());\n\n context.recordLocking = await createRecordLockingCrud({\n context,\n timeout: params?.timeout\n });\n\n const graphQlPlugin = await createGraphQLSchema({ context });\n context.plugins.register(graphQlPlugin);\n });\n plugin.name = \"context.recordLocking\";\n\n return plugin;\n};\n\nexport const createRecordLocking = (params?: ICreateContextPluginParams) => {\n return [createContextPlugin(params)];\n};\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AAEA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AASA,MAAMK,mBAAmB,GAAIC,MAAmC,IAAK;EACjE,MAAMC,MAAM,GAAG,IAAIC,kBAAa,CAAU,MAAMC,OAAO,IAAI;IACvD,IAAI,CAACA,OAAO,CAACC,GAAG,CAACC,mBAAmB,CAAC,CAAC,EAAE;MACpC;IACJ;IAEA,MAAMC,KAAK,GAAG,MAAM,IAAAC,kCAAkB,EAACJ,OAAO,CAAC;IAC/C,IAAI,CAACG,KAAK,EAAE;MACR;IACJ;IACAH,OAAO,CAACK,OAAO,CAACC,QAAQ,CAAC,IAAAC,yBAAkB,EAAC,CAAC,CAAC;IAE9CP,OAAO,CAACQ,aAAa,GAAG,MAAM,IAAAC,6BAAuB,EAAC;MAClDT,OAAO;MACPU,OAAO,EAAEb,MAAM,EAAEa;IACrB,CAAC,CAAC;IAEF,MAAMC,aAAa,GAAG,MAAM,IAAAC,2BAAmB,EAAC;MAAEZ;IAAQ,CAAC,CAAC;IAC5DA,OAAO,CAACK,OAAO,CAACC,QAAQ,CAACK,aAAa,CAAC;EAC3C,CAAC,CAAC;EACFb,MAAM,CAACe,IAAI,GAAG,uBAAuB;EAErC,OAAOf,MAAM;AACjB,CAAC;AAEM,MAAMgB,mBAAmB,GAAIjB,MAAmC,IAAK;EACxE,OAAO,CAACD,mBAAmB,CAACC,MAAM,CAAC,CAAC;AACxC,CAAC;AAACkB,OAAA,CAAAD,mBAAA,GAAAA,mBAAA","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-record-locking",
3
- "version": "5.43.0-beta.0",
3
+ "version": "5.43.0-beta.2",
4
4
  "main": "index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,28 +12,27 @@
12
12
  ],
13
13
  "license": "MIT",
14
14
  "dependencies": {
15
- "@webiny/api": "5.43.0-beta.0",
16
- "@webiny/api-headless-cms": "5.43.0-beta.0",
17
- "@webiny/api-websockets": "5.43.0-beta.0",
18
- "@webiny/error": "5.43.0-beta.0",
19
- "@webiny/handler": "5.43.0-beta.0",
20
- "@webiny/handler-aws": "5.43.0-beta.0",
21
- "@webiny/handler-graphql": "5.43.0-beta.0",
22
- "@webiny/plugins": "5.43.0-beta.0",
23
- "@webiny/pubsub": "5.43.0-beta.0",
24
- "@webiny/utils": "5.43.0-beta.0"
15
+ "@webiny/api": "5.43.0-beta.2",
16
+ "@webiny/api-headless-cms": "5.43.0-beta.2",
17
+ "@webiny/api-websockets": "5.43.0-beta.2",
18
+ "@webiny/error": "5.43.0-beta.2",
19
+ "@webiny/handler": "5.43.0-beta.2",
20
+ "@webiny/handler-aws": "5.43.0-beta.2",
21
+ "@webiny/handler-graphql": "5.43.0-beta.2",
22
+ "@webiny/plugins": "5.43.0-beta.2",
23
+ "@webiny/pubsub": "5.43.0-beta.2",
24
+ "@webiny/utils": "5.43.0-beta.2"
25
25
  },
26
26
  "devDependencies": {
27
- "@webiny/api-i18n": "5.43.0-beta.0",
28
- "@webiny/api-security": "5.43.0-beta.0",
29
- "@webiny/api-tenancy": "5.43.0-beta.0",
30
- "@webiny/api-wcp": "5.43.0-beta.0",
31
- "@webiny/project-utils": "5.43.0-beta.0",
27
+ "@webiny/api-i18n": "5.43.0-beta.2",
28
+ "@webiny/api-security": "5.43.0-beta.2",
29
+ "@webiny/api-tenancy": "5.43.0-beta.2",
30
+ "@webiny/api-wcp": "5.43.0-beta.2",
31
+ "@webiny/project-utils": "5.43.0-beta.2",
32
32
  "graphql": "15.9.0",
33
33
  "rimraf": "6.0.1",
34
- "ttypescript": "1.5.15",
35
- "type-fest": "3.13.1",
36
- "typescript": "4.9.5"
34
+ "type-fest": "4.14.0",
35
+ "typescript": "5.3.3"
37
36
  },
38
37
  "publishConfig": {
39
38
  "access": "public",
@@ -43,5 +42,5 @@
43
42
  "build": "node ../cli/bin.js run build",
44
43
  "watch": "node ../cli/bin.js run watch"
45
44
  },
46
- "gitHead": "abfb4ec7b4391f2414cd22f2c5539c84b6c8abbf"
45
+ "gitHead": "dbed8c263df662358aca18c3cf452cd280f2dfd9"
47
46
  }
package/types.d.ts CHANGED
@@ -60,6 +60,7 @@ export interface IRecordLockingLockRecord extends IRecordLockingLockRecordObject
60
60
  getUnlockRequested(): IRecordLockingLockRecordRequestedAction | undefined;
61
61
  getUnlockApproved(): IRecordLockingLockRecordApprovedAction | undefined;
62
62
  getUnlockDenied(): IRecordLockingLockRecordDeniedAction | undefined;
63
+ isExpired(): boolean;
63
64
  }
64
65
  /**
65
66
  * Do not use any special chars other than #, as we use this to create lock record IDs.
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","RecordLockingLockRecordActionType","exports"],"sources":["types.ts"],"sourcesContent":["import {\n CmsContext,\n CmsEntry,\n CmsEntryListParams,\n CmsEntryMeta,\n CmsError,\n CmsIdentity,\n CmsModel,\n CmsModelManager\n} from \"@webiny/api-headless-cms/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\nimport {\n Context as IWebsocketsContext,\n IWebsocketsContextObject\n} from \"@webiny/api-websockets/types\";\nimport { SecurityPermission } from \"@webiny/api-security/types\";\n\nexport { CmsError, CmsEntry };\n\nexport type IRecordLockingIdentity = CmsIdentity;\n\nexport type IRecordLockingModelManager = CmsModelManager<IRecordLockingLockRecordValues>;\n\nexport type IRecordLockingMeta = CmsEntryMeta;\n\nexport interface IHasRecordLockingAccessCallable {\n (): Promise<boolean>;\n}\n\nexport interface IGetWebsocketsContextCallable {\n (): IWebsocketsContextObject;\n}\n\nexport interface IGetIdentity {\n (): IRecordLockingIdentity;\n}\n\nexport interface IRecordLockingLockRecordValues {\n targetId: string;\n type: IRecordLockingLockRecordEntryType;\n actions?: IRecordLockingLockRecordAction[];\n}\nexport enum RecordLockingLockRecordActionType {\n requested = \"requested\",\n approved = \"approved\",\n denied = \"denied\"\n}\n\nexport interface IRecordLockingLockRecordRequestedAction {\n type: RecordLockingLockRecordActionType.requested;\n message?: string;\n createdOn: Date;\n createdBy: IRecordLockingIdentity;\n}\n\nexport interface IRecordLockingLockRecordApprovedAction {\n type: RecordLockingLockRecordActionType.approved;\n message?: string;\n createdOn: Date;\n createdBy: IRecordLockingIdentity;\n}\n\nexport interface IRecordLockingLockRecordDeniedAction {\n type: RecordLockingLockRecordActionType.denied;\n message?: string;\n createdOn: Date;\n createdBy: IRecordLockingIdentity;\n}\n\nexport type IRecordLockingLockRecordAction =\n | IRecordLockingLockRecordRequestedAction\n | IRecordLockingLockRecordApprovedAction\n | IRecordLockingLockRecordDeniedAction;\n\nexport interface IRecordLockingLockRecordObject {\n id: string;\n targetId: string;\n type: IRecordLockingLockRecordEntryType;\n lockedBy: IRecordLockingIdentity;\n lockedOn: Date;\n updatedOn: Date;\n expiresOn: Date;\n actions?: IRecordLockingLockRecordAction[];\n}\n\nexport interface IRecordLockingLockRecord extends IRecordLockingLockRecordObject {\n toObject(): IRecordLockingLockRecordObject;\n addAction(action: IRecordLockingLockRecordAction): void;\n getUnlockRequested(): IRecordLockingLockRecordRequestedAction | undefined;\n getUnlockApproved(): IRecordLockingLockRecordApprovedAction | undefined;\n getUnlockDenied(): IRecordLockingLockRecordDeniedAction | undefined;\n}\n\n/**\n * Do not use any special chars other than #, as we use this to create lock record IDs.\n */\nexport type IRecordLockingLockRecordEntryType = string;\n\nexport type IRecordLockingListAllLockRecordsParams = Pick<\n CmsEntryListParams,\n \"where\" | \"limit\" | \"sort\" | \"after\"\n>;\n\nexport type IRecordLockingListLockRecordsParams = IRecordLockingListAllLockRecordsParams;\n\nexport interface IRecordLockingListAllLockRecordsResponse {\n items: IRecordLockingLockRecord[];\n meta: IRecordLockingMeta;\n}\n\nexport type IRecordLockingListLockRecordsResponse = IRecordLockingListAllLockRecordsResponse;\n\nexport interface IRecordLockingGetLockRecordParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface IRecordLockingIsLockedParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface IRecordLockingGetLockedEntryLockRecordParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface IRecordLockingLockEntryParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface IRecordLockingUpdateEntryLockParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface IRecordLockingUnlockEntryParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n force?: boolean;\n}\n\nexport interface IRecordLockingUnlockEntryRequestParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface OnEntryBeforeLockTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface OnEntryAfterLockTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n record: IRecordLockingLockRecord;\n}\n\nexport interface OnEntryLockErrorTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n error: CmsError;\n}\n\nexport interface OnEntryBeforeUnlockTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n getIdentity: IGetIdentity;\n}\n\nexport interface OnEntryAfterUnlockTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n record: IRecordLockingLockRecord;\n}\n\nexport interface OnEntryUnlockErrorTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n error: CmsError;\n}\n\nexport interface OnEntryBeforeUnlockRequestTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface OnEntryAfterUnlockRequestTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n record: IRecordLockingLockRecord;\n}\n\nexport interface OnEntryUnlockRequestErrorTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n error: CmsError;\n}\n\nexport interface IRecordLocking {\n /**\n * In milliseconds.\n */\n getTimeout: () => number;\n onEntryBeforeLock: Topic<OnEntryBeforeLockTopicParams>;\n onEntryAfterLock: Topic<OnEntryAfterLockTopicParams>;\n onEntryLockError: Topic<OnEntryLockErrorTopicParams>;\n onEntryBeforeUnlock: Topic<OnEntryBeforeUnlockTopicParams>;\n onEntryAfterUnlock: Topic<OnEntryAfterUnlockTopicParams>;\n onEntryUnlockError: Topic<OnEntryUnlockErrorTopicParams>;\n onEntryBeforeUnlockRequest: Topic<OnEntryBeforeUnlockRequestTopicParams>;\n onEntryAfterUnlockRequest: Topic<OnEntryAfterUnlockRequestTopicParams>;\n onEntryUnlockRequestError: Topic<OnEntryUnlockRequestErrorTopicParams>;\n getModel(): Promise<CmsModel>;\n listAllLockRecords(\n params?: IRecordLockingListAllLockRecordsParams\n ): Promise<IRecordLockingListAllLockRecordsResponse>;\n /**\n * Same call as listAllLockRecords, except this one will filter out records with expired lock.\n */\n listLockRecords(\n params?: IRecordLockingListLockRecordsParams\n ): Promise<IRecordLockingListLockRecordsResponse>;\n getLockRecord(\n params: IRecordLockingGetLockRecordParams\n ): Promise<IRecordLockingLockRecord | null>;\n isEntryLocked(params: IRecordLockingIsLockedParams): Promise<boolean>;\n getLockedEntryLockRecord(\n params: IRecordLockingGetLockedEntryLockRecordParams\n ): Promise<IRecordLockingLockRecord | null>;\n lockEntry(params: IRecordLockingLockEntryParams): Promise<IRecordLockingLockRecord>;\n updateEntryLock(params: IRecordLockingUpdateEntryLockParams): Promise<IRecordLockingLockRecord>;\n unlockEntry(params: IRecordLockingUnlockEntryParams): Promise<IRecordLockingLockRecord>;\n unlockEntryRequest(\n params: IRecordLockingUnlockEntryRequestParams\n ): Promise<IRecordLockingLockRecord>;\n}\n\nexport interface Context extends CmsContext, IWebsocketsContext {\n recordLocking: IRecordLocking;\n}\n\nexport interface RecordLockingSecurityPermission extends SecurityPermission {\n canForceUnlock?: string;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AASwC,IAiC5BC,iCAAiC,GAAAC,OAAA,CAAAD,iCAAA,0BAAjCA,iCAAiC;EAAjCA,iCAAiC;EAAjCA,iCAAiC;EAAjCA,iCAAiC;EAAA,OAAjCA,iCAAiC;AAAA;AAmD7C;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","RecordLockingLockRecordActionType","exports"],"sources":["types.ts"],"sourcesContent":["import {\n CmsContext,\n CmsEntry,\n CmsEntryListParams,\n CmsEntryMeta,\n CmsError,\n CmsIdentity,\n CmsModel,\n CmsModelManager\n} from \"@webiny/api-headless-cms/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\nimport {\n Context as IWebsocketsContext,\n IWebsocketsContextObject\n} from \"@webiny/api-websockets/types\";\nimport { SecurityPermission } from \"@webiny/api-security/types\";\n\nexport { CmsError, CmsEntry };\n\nexport type IRecordLockingIdentity = CmsIdentity;\n\nexport type IRecordLockingModelManager = CmsModelManager<IRecordLockingLockRecordValues>;\n\nexport type IRecordLockingMeta = CmsEntryMeta;\n\nexport interface IHasRecordLockingAccessCallable {\n (): Promise<boolean>;\n}\n\nexport interface IGetWebsocketsContextCallable {\n (): IWebsocketsContextObject;\n}\n\nexport interface IGetIdentity {\n (): IRecordLockingIdentity;\n}\n\nexport interface IRecordLockingLockRecordValues {\n targetId: string;\n type: IRecordLockingLockRecordEntryType;\n actions?: IRecordLockingLockRecordAction[];\n}\nexport enum RecordLockingLockRecordActionType {\n requested = \"requested\",\n approved = \"approved\",\n denied = \"denied\"\n}\n\nexport interface IRecordLockingLockRecordRequestedAction {\n type: RecordLockingLockRecordActionType.requested;\n message?: string;\n createdOn: Date;\n createdBy: IRecordLockingIdentity;\n}\n\nexport interface IRecordLockingLockRecordApprovedAction {\n type: RecordLockingLockRecordActionType.approved;\n message?: string;\n createdOn: Date;\n createdBy: IRecordLockingIdentity;\n}\n\nexport interface IRecordLockingLockRecordDeniedAction {\n type: RecordLockingLockRecordActionType.denied;\n message?: string;\n createdOn: Date;\n createdBy: IRecordLockingIdentity;\n}\n\nexport type IRecordLockingLockRecordAction =\n | IRecordLockingLockRecordRequestedAction\n | IRecordLockingLockRecordApprovedAction\n | IRecordLockingLockRecordDeniedAction;\n\nexport interface IRecordLockingLockRecordObject {\n id: string;\n targetId: string;\n type: IRecordLockingLockRecordEntryType;\n lockedBy: IRecordLockingIdentity;\n lockedOn: Date;\n updatedOn: Date;\n expiresOn: Date;\n actions?: IRecordLockingLockRecordAction[];\n}\n\nexport interface IRecordLockingLockRecord extends IRecordLockingLockRecordObject {\n toObject(): IRecordLockingLockRecordObject;\n addAction(action: IRecordLockingLockRecordAction): void;\n getUnlockRequested(): IRecordLockingLockRecordRequestedAction | undefined;\n getUnlockApproved(): IRecordLockingLockRecordApprovedAction | undefined;\n getUnlockDenied(): IRecordLockingLockRecordDeniedAction | undefined;\n isExpired(): boolean;\n}\n\n/**\n * Do not use any special chars other than #, as we use this to create lock record IDs.\n */\nexport type IRecordLockingLockRecordEntryType = string;\n\nexport type IRecordLockingListAllLockRecordsParams = Pick<\n CmsEntryListParams,\n \"where\" | \"limit\" | \"sort\" | \"after\"\n>;\n\nexport type IRecordLockingListLockRecordsParams = IRecordLockingListAllLockRecordsParams;\n\nexport interface IRecordLockingListAllLockRecordsResponse {\n items: IRecordLockingLockRecord[];\n meta: IRecordLockingMeta;\n}\n\nexport type IRecordLockingListLockRecordsResponse = IRecordLockingListAllLockRecordsResponse;\n\nexport interface IRecordLockingGetLockRecordParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface IRecordLockingIsLockedParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface IRecordLockingGetLockedEntryLockRecordParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface IRecordLockingLockEntryParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface IRecordLockingUpdateEntryLockParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface IRecordLockingUnlockEntryParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n force?: boolean;\n}\n\nexport interface IRecordLockingUnlockEntryRequestParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface OnEntryBeforeLockTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface OnEntryAfterLockTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n record: IRecordLockingLockRecord;\n}\n\nexport interface OnEntryLockErrorTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n error: CmsError;\n}\n\nexport interface OnEntryBeforeUnlockTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n getIdentity: IGetIdentity;\n}\n\nexport interface OnEntryAfterUnlockTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n record: IRecordLockingLockRecord;\n}\n\nexport interface OnEntryUnlockErrorTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n error: CmsError;\n}\n\nexport interface OnEntryBeforeUnlockRequestTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n}\n\nexport interface OnEntryAfterUnlockRequestTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n record: IRecordLockingLockRecord;\n}\n\nexport interface OnEntryUnlockRequestErrorTopicParams {\n id: string;\n type: IRecordLockingLockRecordEntryType;\n error: CmsError;\n}\n\nexport interface IRecordLocking {\n /**\n * In milliseconds.\n */\n getTimeout: () => number;\n onEntryBeforeLock: Topic<OnEntryBeforeLockTopicParams>;\n onEntryAfterLock: Topic<OnEntryAfterLockTopicParams>;\n onEntryLockError: Topic<OnEntryLockErrorTopicParams>;\n onEntryBeforeUnlock: Topic<OnEntryBeforeUnlockTopicParams>;\n onEntryAfterUnlock: Topic<OnEntryAfterUnlockTopicParams>;\n onEntryUnlockError: Topic<OnEntryUnlockErrorTopicParams>;\n onEntryBeforeUnlockRequest: Topic<OnEntryBeforeUnlockRequestTopicParams>;\n onEntryAfterUnlockRequest: Topic<OnEntryAfterUnlockRequestTopicParams>;\n onEntryUnlockRequestError: Topic<OnEntryUnlockRequestErrorTopicParams>;\n getModel(): Promise<CmsModel>;\n listAllLockRecords(\n params?: IRecordLockingListAllLockRecordsParams\n ): Promise<IRecordLockingListAllLockRecordsResponse>;\n /**\n * Same call as listAllLockRecords, except this one will filter out records with expired lock.\n */\n listLockRecords(\n params?: IRecordLockingListLockRecordsParams\n ): Promise<IRecordLockingListLockRecordsResponse>;\n getLockRecord(\n params: IRecordLockingGetLockRecordParams\n ): Promise<IRecordLockingLockRecord | null>;\n isEntryLocked(params: IRecordLockingIsLockedParams): Promise<boolean>;\n getLockedEntryLockRecord(\n params: IRecordLockingGetLockedEntryLockRecordParams\n ): Promise<IRecordLockingLockRecord | null>;\n lockEntry(params: IRecordLockingLockEntryParams): Promise<IRecordLockingLockRecord>;\n updateEntryLock(params: IRecordLockingUpdateEntryLockParams): Promise<IRecordLockingLockRecord>;\n unlockEntry(params: IRecordLockingUnlockEntryParams): Promise<IRecordLockingLockRecord>;\n unlockEntryRequest(\n params: IRecordLockingUnlockEntryRequestParams\n ): Promise<IRecordLockingLockRecord>;\n}\n\nexport interface Context extends CmsContext, IWebsocketsContext {\n recordLocking: IRecordLocking;\n}\n\nexport interface RecordLockingSecurityPermission extends SecurityPermission {\n canForceUnlock?: string;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AASwC,IAiC5BC,iCAAiC,GAAAC,OAAA,CAAAD,iCAAA,0BAAjCA,iCAAiC;EAAjCA,iCAAiC;EAAjCA,iCAAiC;EAAjCA,iCAAiC;EAAA,OAAjCA,iCAAiC;AAAA;AAoD7C;AACA;AACA","ignoreList":[]}
@@ -1,12 +1,15 @@
1
1
  import type { IGetLockRecordUseCase, IGetLockRecordUseCaseExecuteParams } from "../../abstractions/IGetLockRecordUseCase";
2
2
  import type { IRecordLockingLockRecord, IRecordLockingModelManager } from "../../types";
3
3
  import type { ConvertEntryToLockRecordCb } from "../types";
4
+ import type { Security } from "@webiny/api-security/types";
4
5
  export interface IGetLockRecordUseCaseParams {
5
6
  getManager(): Promise<IRecordLockingModelManager>;
7
+ getSecurity(): Pick<Security, "withoutAuthorization">;
6
8
  convert: ConvertEntryToLockRecordCb;
7
9
  }
8
10
  export declare class GetLockRecordUseCase implements IGetLockRecordUseCase {
9
11
  private readonly getManager;
12
+ private readonly getSecurity;
10
13
  private readonly convert;
11
14
  constructor(params: IGetLockRecordUseCaseParams);
12
15
  execute(input: IGetLockRecordUseCaseExecuteParams): Promise<IRecordLockingLockRecord | null>;
@@ -10,6 +10,7 @@ var _utils = require("@webiny/utils");
10
10
  class GetLockRecordUseCase {
11
11
  constructor(params) {
12
12
  this.getManager = params.getManager;
13
+ this.getSecurity = params.getSecurity;
13
14
  this.convert = params.convert;
14
15
  }
15
16
  async execute(input) {
@@ -18,10 +19,13 @@ class GetLockRecordUseCase {
18
19
  id: recordId,
19
20
  version: 1
20
21
  });
22
+ const security = this.getSecurity();
21
23
  try {
22
24
  const manager = await this.getManager();
23
- const result = await manager.get(id);
24
- return this.convert(result);
25
+ return await security.withoutAuthorization(async () => {
26
+ const result = await manager.get(id);
27
+ return this.convert(result);
28
+ });
25
29
  } catch (ex) {
26
30
  if (ex instanceof _handlerGraphql.NotFoundError) {
27
31
  return null;
@@ -1 +1 @@
1
- {"version":3,"names":["_handlerGraphql","require","_lockRecordDatabaseId","_utils","GetLockRecordUseCase","constructor","params","getManager","convert","execute","input","recordId","createLockRecordDatabaseId","id","createIdentifier","version","manager","result","get","ex","NotFoundError","exports"],"sources":["GetLockRecordUseCase.ts"],"sourcesContent":["import type {\n IGetLockRecordUseCase,\n IGetLockRecordUseCaseExecuteParams\n} from \"~/abstractions/IGetLockRecordUseCase\";\nimport type { IRecordLockingLockRecord, IRecordLockingModelManager } from \"~/types\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport type { ConvertEntryToLockRecordCb } from \"~/useCases/types\";\n\nexport interface IGetLockRecordUseCaseParams {\n getManager(): Promise<IRecordLockingModelManager>;\n convert: ConvertEntryToLockRecordCb;\n}\n\nexport class GetLockRecordUseCase implements IGetLockRecordUseCase {\n private readonly getManager: IGetLockRecordUseCaseParams[\"getManager\"];\n private readonly convert: ConvertEntryToLockRecordCb;\n\n public constructor(params: IGetLockRecordUseCaseParams) {\n this.getManager = params.getManager;\n this.convert = params.convert;\n }\n\n public async execute(\n input: IGetLockRecordUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord | null> {\n const recordId = createLockRecordDatabaseId(input.id);\n const id = createIdentifier({\n id: recordId,\n version: 1\n });\n try {\n const manager = await this.getManager();\n const result = await manager.get(id);\n return this.convert(result);\n } catch (ex) {\n if (ex instanceof NotFoundError) {\n return null;\n }\n throw ex;\n }\n }\n}\n"],"mappings":";;;;;;AAKA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAQO,MAAMG,oBAAoB,CAAkC;EAIxDC,WAAWA,CAACC,MAAmC,EAAE;IACpD,IAAI,CAACC,UAAU,GAAGD,MAAM,CAACC,UAAU;IACnC,IAAI,CAACC,OAAO,GAAGF,MAAM,CAACE,OAAO;EACjC;EAEA,MAAaC,OAAOA,CAChBC,KAAyC,EACD;IACxC,MAAMC,QAAQ,GAAG,IAAAC,gDAA0B,EAACF,KAAK,CAACG,EAAE,CAAC;IACrD,MAAMA,EAAE,GAAG,IAAAC,uBAAgB,EAAC;MACxBD,EAAE,EAAEF,QAAQ;MACZI,OAAO,EAAE;IACb,CAAC,CAAC;IACF,IAAI;MACA,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACT,UAAU,CAAC,CAAC;MACvC,MAAMU,MAAM,GAAG,MAAMD,OAAO,CAACE,GAAG,CAACL,EAAE,CAAC;MACpC,OAAO,IAAI,CAACL,OAAO,CAACS,MAAM,CAAC;IAC/B,CAAC,CAAC,OAAOE,EAAE,EAAE;MACT,IAAIA,EAAE,YAAYC,6BAAa,EAAE;QAC7B,OAAO,IAAI;MACf;MACA,MAAMD,EAAE;IACZ;EACJ;AACJ;AAACE,OAAA,CAAAjB,oBAAA,GAAAA,oBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_handlerGraphql","require","_lockRecordDatabaseId","_utils","GetLockRecordUseCase","constructor","params","getManager","getSecurity","convert","execute","input","recordId","createLockRecordDatabaseId","id","createIdentifier","version","security","manager","withoutAuthorization","result","get","ex","NotFoundError","exports"],"sources":["GetLockRecordUseCase.ts"],"sourcesContent":["import type {\n IGetLockRecordUseCase,\n IGetLockRecordUseCaseExecuteParams\n} from \"~/abstractions/IGetLockRecordUseCase\";\nimport type { IRecordLockingLockRecord, IRecordLockingModelManager } from \"~/types\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport type { ConvertEntryToLockRecordCb } from \"~/useCases/types\";\nimport type { Security } from \"@webiny/api-security/types\";\n\nexport interface IGetLockRecordUseCaseParams {\n getManager(): Promise<IRecordLockingModelManager>;\n getSecurity(): Pick<Security, \"withoutAuthorization\">;\n convert: ConvertEntryToLockRecordCb;\n}\n\nexport class GetLockRecordUseCase implements IGetLockRecordUseCase {\n private readonly getManager: IGetLockRecordUseCaseParams[\"getManager\"];\n private readonly getSecurity: IGetLockRecordUseCaseParams[\"getSecurity\"];\n private readonly convert: ConvertEntryToLockRecordCb;\n\n public constructor(params: IGetLockRecordUseCaseParams) {\n this.getManager = params.getManager;\n this.getSecurity = params.getSecurity;\n this.convert = params.convert;\n }\n\n public async execute(\n input: IGetLockRecordUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord | null> {\n const recordId = createLockRecordDatabaseId(input.id);\n const id = createIdentifier({\n id: recordId,\n version: 1\n });\n const security = this.getSecurity();\n try {\n const manager = await this.getManager();\n return await security.withoutAuthorization(async () => {\n const result = await manager.get(id);\n return this.convert(result);\n });\n } catch (ex) {\n if (ex instanceof NotFoundError) {\n return null;\n }\n throw ex;\n }\n }\n}\n"],"mappings":";;;;;;AAKA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAUO,MAAMG,oBAAoB,CAAkC;EAKxDC,WAAWA,CAACC,MAAmC,EAAE;IACpD,IAAI,CAACC,UAAU,GAAGD,MAAM,CAACC,UAAU;IACnC,IAAI,CAACC,WAAW,GAAGF,MAAM,CAACE,WAAW;IACrC,IAAI,CAACC,OAAO,GAAGH,MAAM,CAACG,OAAO;EACjC;EAEA,MAAaC,OAAOA,CAChBC,KAAyC,EACD;IACxC,MAAMC,QAAQ,GAAG,IAAAC,gDAA0B,EAACF,KAAK,CAACG,EAAE,CAAC;IACrD,MAAMA,EAAE,GAAG,IAAAC,uBAAgB,EAAC;MACxBD,EAAE,EAAEF,QAAQ;MACZI,OAAO,EAAE;IACb,CAAC,CAAC;IACF,MAAMC,QAAQ,GAAG,IAAI,CAACT,WAAW,CAAC,CAAC;IACnC,IAAI;MACA,MAAMU,OAAO,GAAG,MAAM,IAAI,CAACX,UAAU,CAAC,CAAC;MACvC,OAAO,MAAMU,QAAQ,CAACE,oBAAoB,CAAC,YAAY;QACnD,MAAMC,MAAM,GAAG,MAAMF,OAAO,CAACG,GAAG,CAACP,EAAE,CAAC;QACpC,OAAO,IAAI,CAACL,OAAO,CAACW,MAAM,CAAC;MAC/B,CAAC,CAAC;IACN,CAAC,CAAC,OAAOE,EAAE,EAAE;MACT,IAAIA,EAAE,YAAYC,6BAAa,EAAE;QAC7B,OAAO,IAAI;MACf;MACA,MAAMD,EAAE;IACZ;EACJ;AACJ;AAACE,OAAA,CAAApB,oBAAA,GAAAA,oBAAA","ignoreList":[]}
@@ -1,15 +1,15 @@
1
1
  import type { IGetLockRecordUseCase } from "../../abstractions/IGetLockRecordUseCase";
2
2
  import type { IGetIdentity, IRecordLockingLockRecord } from "../../types";
3
3
  import type { IGetLockedEntryLockRecordUseCase, IGetLockedEntryLockRecordUseCaseExecuteParams } from "../../abstractions/IGetLockedEntryLockRecordUseCase";
4
- import type { IIsLocked } from "../../utils/isLockedFactory";
5
4
  export interface IGetLockedEntryLockRecordUseCaseParams {
6
5
  getLockRecordUseCase: IGetLockRecordUseCase;
7
- isLocked: IIsLocked;
8
6
  getIdentity: IGetIdentity;
9
7
  }
8
+ /**
9
+ * This use case is used to get a lock record for an entry - and the entry is still locked by someone other than the current user.
10
+ */
10
11
  export declare class GetLockedEntryLockRecordUseCase implements IGetLockedEntryLockRecordUseCase {
11
12
  private readonly getLockRecordUseCase;
12
- private readonly isLocked;
13
13
  private readonly getIdentity;
14
14
  constructor(params: IGetLockedEntryLockRecordUseCaseParams);
15
15
  execute(params: IGetLockedEntryLockRecordUseCaseExecuteParams): Promise<IRecordLockingLockRecord | null>;
@@ -4,22 +4,24 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.GetLockedEntryLockRecordUseCase = void 0;
7
+ /**
8
+ * This use case is used to get a lock record for an entry - and the entry is still locked by someone other than the current user.
9
+ */
7
10
  class GetLockedEntryLockRecordUseCase {
8
11
  constructor(params) {
9
12
  this.getLockRecordUseCase = params.getLockRecordUseCase;
10
- this.isLocked = params.isLocked;
11
13
  this.getIdentity = params.getIdentity;
12
14
  }
13
15
  async execute(params) {
14
16
  const result = await this.getLockRecordUseCase.execute(params);
15
- if (!result?.lockedBy) {
17
+ if (!result?.lockedBy?.id || result.isExpired()) {
16
18
  return null;
17
19
  }
18
20
  const identity = this.getIdentity();
19
21
  if (identity.id === result.lockedBy.id) {
20
22
  return null;
21
23
  }
22
- return this.isLocked(result) ? result : null;
24
+ return result;
23
25
  }
24
26
  }
25
27
  exports.GetLockedEntryLockRecordUseCase = GetLockedEntryLockRecordUseCase;
@@ -1 +1 @@
1
- {"version":3,"names":["GetLockedEntryLockRecordUseCase","constructor","params","getLockRecordUseCase","isLocked","getIdentity","execute","result","lockedBy","identity","id","exports"],"sources":["GetLockedEntryLockRecordUseCase.ts"],"sourcesContent":["import type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport type { IGetIdentity, IRecordLockingLockRecord } from \"~/types\";\nimport type {\n IGetLockedEntryLockRecordUseCase,\n IGetLockedEntryLockRecordUseCaseExecuteParams\n} from \"~/abstractions/IGetLockedEntryLockRecordUseCase\";\nimport type { IIsLocked } from \"~/utils/isLockedFactory\";\n\nexport interface IGetLockedEntryLockRecordUseCaseParams {\n getLockRecordUseCase: IGetLockRecordUseCase;\n isLocked: IIsLocked;\n getIdentity: IGetIdentity;\n}\n\nexport class GetLockedEntryLockRecordUseCase implements IGetLockedEntryLockRecordUseCase {\n private readonly getLockRecordUseCase: IGetLockRecordUseCase;\n private readonly isLocked: IIsLocked;\n private readonly getIdentity: IGetIdentity;\n\n public constructor(params: IGetLockedEntryLockRecordUseCaseParams) {\n this.getLockRecordUseCase = params.getLockRecordUseCase;\n this.isLocked = params.isLocked;\n this.getIdentity = params.getIdentity;\n }\n\n public async execute(\n params: IGetLockedEntryLockRecordUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord | null> {\n const result = await this.getLockRecordUseCase.execute(params);\n if (!result?.lockedBy) {\n return null;\n }\n const identity = this.getIdentity();\n if (identity.id === result.lockedBy.id) {\n return null;\n }\n return this.isLocked(result) ? result : null;\n }\n}\n"],"mappings":";;;;;;AAcO,MAAMA,+BAA+B,CAA6C;EAK9EC,WAAWA,CAACC,MAA8C,EAAE;IAC/D,IAAI,CAACC,oBAAoB,GAAGD,MAAM,CAACC,oBAAoB;IACvD,IAAI,CAACC,QAAQ,GAAGF,MAAM,CAACE,QAAQ;IAC/B,IAAI,CAACC,WAAW,GAAGH,MAAM,CAACG,WAAW;EACzC;EAEA,MAAaC,OAAOA,CAChBJ,MAAqD,EACb;IACxC,MAAMK,MAAM,GAAG,MAAM,IAAI,CAACJ,oBAAoB,CAACG,OAAO,CAACJ,MAAM,CAAC;IAC9D,IAAI,CAACK,MAAM,EAAEC,QAAQ,EAAE;MACnB,OAAO,IAAI;IACf;IACA,MAAMC,QAAQ,GAAG,IAAI,CAACJ,WAAW,CAAC,CAAC;IACnC,IAAII,QAAQ,CAACC,EAAE,KAAKH,MAAM,CAACC,QAAQ,CAACE,EAAE,EAAE;MACpC,OAAO,IAAI;IACf;IACA,OAAO,IAAI,CAACN,QAAQ,CAACG,MAAM,CAAC,GAAGA,MAAM,GAAG,IAAI;EAChD;AACJ;AAACI,OAAA,CAAAX,+BAAA,GAAAA,+BAAA","ignoreList":[]}
1
+ {"version":3,"names":["GetLockedEntryLockRecordUseCase","constructor","params","getLockRecordUseCase","getIdentity","execute","result","lockedBy","id","isExpired","identity","exports"],"sources":["GetLockedEntryLockRecordUseCase.ts"],"sourcesContent":["import type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport type { IGetIdentity, IRecordLockingLockRecord } from \"~/types\";\nimport type {\n IGetLockedEntryLockRecordUseCase,\n IGetLockedEntryLockRecordUseCaseExecuteParams\n} from \"~/abstractions/IGetLockedEntryLockRecordUseCase\";\n\nexport interface IGetLockedEntryLockRecordUseCaseParams {\n getLockRecordUseCase: IGetLockRecordUseCase;\n getIdentity: IGetIdentity;\n}\n\n/**\n * This use case is used to get a lock record for an entry - and the entry is still locked by someone other than the current user.\n */\nexport class GetLockedEntryLockRecordUseCase implements IGetLockedEntryLockRecordUseCase {\n private readonly getLockRecordUseCase: IGetLockRecordUseCase;\n private readonly getIdentity: IGetIdentity;\n\n public constructor(params: IGetLockedEntryLockRecordUseCaseParams) {\n this.getLockRecordUseCase = params.getLockRecordUseCase;\n this.getIdentity = params.getIdentity;\n }\n\n public async execute(\n params: IGetLockedEntryLockRecordUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord | null> {\n const result = await this.getLockRecordUseCase.execute(params);\n if (!result?.lockedBy?.id || result.isExpired()) {\n return null;\n }\n const identity = this.getIdentity();\n if (identity.id === result.lockedBy.id) {\n return null;\n }\n return result;\n }\n}\n"],"mappings":";;;;;;AAYA;AACA;AACA;AACO,MAAMA,+BAA+B,CAA6C;EAI9EC,WAAWA,CAACC,MAA8C,EAAE;IAC/D,IAAI,CAACC,oBAAoB,GAAGD,MAAM,CAACC,oBAAoB;IACvD,IAAI,CAACC,WAAW,GAAGF,MAAM,CAACE,WAAW;EACzC;EAEA,MAAaC,OAAOA,CAChBH,MAAqD,EACb;IACxC,MAAMI,MAAM,GAAG,MAAM,IAAI,CAACH,oBAAoB,CAACE,OAAO,CAACH,MAAM,CAAC;IAC9D,IAAI,CAACI,MAAM,EAAEC,QAAQ,EAAEC,EAAE,IAAIF,MAAM,CAACG,SAAS,CAAC,CAAC,EAAE;MAC7C,OAAO,IAAI;IACf;IACA,MAAMC,QAAQ,GAAG,IAAI,CAACN,WAAW,CAAC,CAAC;IACnC,IAAIM,QAAQ,CAACF,EAAE,KAAKF,MAAM,CAACC,QAAQ,CAACC,EAAE,EAAE;MACpC,OAAO,IAAI;IACf;IACA,OAAOF,MAAM;EACjB;AACJ;AAACK,OAAA,CAAAX,+BAAA,GAAAA,+BAAA","ignoreList":[]}
@@ -1,15 +1,12 @@
1
1
  import type { IIsEntryLockedUseCase, IIsEntryLockedUseCaseExecuteParams } from "../../abstractions/IIsEntryLocked";
2
2
  import type { IGetLockRecordUseCase } from "../../abstractions/IGetLockRecordUseCase";
3
- import type { IIsLocked } from "../../utils/isLockedFactory";
4
3
  import type { IGetIdentity } from "../../types";
5
4
  export interface IIsEntryLockedParams {
6
5
  getLockRecordUseCase: IGetLockRecordUseCase;
7
- isLocked: IIsLocked;
8
6
  getIdentity: IGetIdentity;
9
7
  }
10
8
  export declare class IsEntryLockedUseCase implements IIsEntryLockedUseCase {
11
9
  private readonly getLockRecordUseCase;
12
- private readonly isLocked;
13
10
  private readonly getIdentity;
14
11
  constructor(params: IIsEntryLockedParams);
15
12
  execute(params: IIsEntryLockedUseCaseExecuteParams): Promise<boolean>;
@@ -8,20 +8,16 @@ var _handlerGraphql = require("@webiny/handler-graphql");
8
8
  class IsEntryLockedUseCase {
9
9
  constructor(params) {
10
10
  this.getLockRecordUseCase = params.getLockRecordUseCase;
11
- this.isLocked = params.isLocked;
12
11
  this.getIdentity = params.getIdentity;
13
12
  }
14
13
  async execute(params) {
15
14
  try {
16
15
  const result = await this.getLockRecordUseCase.execute(params);
17
- if (!result) {
16
+ if (!result || result.isExpired()) {
18
17
  return false;
19
18
  }
20
19
  const identity = this.getIdentity();
21
- if (result.lockedBy.id === identity.id) {
22
- return false;
23
- }
24
- return this.isLocked(result);
20
+ return result.lockedBy.id !== identity.id;
25
21
  } catch (ex) {
26
22
  if (ex instanceof _handlerGraphql.NotFoundError === false) {
27
23
  throw ex;
@@ -1 +1 @@
1
- {"version":3,"names":["_handlerGraphql","require","IsEntryLockedUseCase","constructor","params","getLockRecordUseCase","isLocked","getIdentity","execute","result","identity","lockedBy","id","ex","NotFoundError","exports"],"sources":["IsEntryLockedUseCase.ts"],"sourcesContent":["import type {\n IIsEntryLockedUseCase,\n IIsEntryLockedUseCaseExecuteParams\n} from \"~/abstractions/IIsEntryLocked\";\nimport type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport type { IIsLocked } from \"~/utils/isLockedFactory\";\nimport type { IGetIdentity } from \"~/types\";\n\nexport interface IIsEntryLockedParams {\n getLockRecordUseCase: IGetLockRecordUseCase;\n isLocked: IIsLocked;\n getIdentity: IGetIdentity;\n}\n\nexport class IsEntryLockedUseCase implements IIsEntryLockedUseCase {\n private readonly getLockRecordUseCase: IGetLockRecordUseCase;\n private readonly isLocked: IIsLocked;\n private readonly getIdentity: IGetIdentity;\n\n public constructor(params: IIsEntryLockedParams) {\n this.getLockRecordUseCase = params.getLockRecordUseCase;\n this.isLocked = params.isLocked;\n this.getIdentity = params.getIdentity;\n }\n\n public async execute(params: IIsEntryLockedUseCaseExecuteParams): Promise<boolean> {\n try {\n const result = await this.getLockRecordUseCase.execute(params);\n if (!result) {\n return false;\n }\n const identity = this.getIdentity();\n if (result.lockedBy.id === identity.id) {\n return false;\n }\n\n return this.isLocked(result);\n } catch (ex) {\n if (ex instanceof NotFoundError === false) {\n throw ex;\n }\n return false;\n }\n }\n}\n"],"mappings":";;;;;;AAKA,IAAAA,eAAA,GAAAC,OAAA;AAUO,MAAMC,oBAAoB,CAAkC;EAKxDC,WAAWA,CAACC,MAA4B,EAAE;IAC7C,IAAI,CAACC,oBAAoB,GAAGD,MAAM,CAACC,oBAAoB;IACvD,IAAI,CAACC,QAAQ,GAAGF,MAAM,CAACE,QAAQ;IAC/B,IAAI,CAACC,WAAW,GAAGH,MAAM,CAACG,WAAW;EACzC;EAEA,MAAaC,OAAOA,CAACJ,MAA0C,EAAoB;IAC/E,IAAI;MACA,MAAMK,MAAM,GAAG,MAAM,IAAI,CAACJ,oBAAoB,CAACG,OAAO,CAACJ,MAAM,CAAC;MAC9D,IAAI,CAACK,MAAM,EAAE;QACT,OAAO,KAAK;MAChB;MACA,MAAMC,QAAQ,GAAG,IAAI,CAACH,WAAW,CAAC,CAAC;MACnC,IAAIE,MAAM,CAACE,QAAQ,CAACC,EAAE,KAAKF,QAAQ,CAACE,EAAE,EAAE;QACpC,OAAO,KAAK;MAChB;MAEA,OAAO,IAAI,CAACN,QAAQ,CAACG,MAAM,CAAC;IAChC,CAAC,CAAC,OAAOI,EAAE,EAAE;MACT,IAAIA,EAAE,YAAYC,6BAAa,KAAK,KAAK,EAAE;QACvC,MAAMD,EAAE;MACZ;MACA,OAAO,KAAK;IAChB;EACJ;AACJ;AAACE,OAAA,CAAAb,oBAAA,GAAAA,oBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_handlerGraphql","require","IsEntryLockedUseCase","constructor","params","getLockRecordUseCase","getIdentity","execute","result","isExpired","identity","lockedBy","id","ex","NotFoundError","exports"],"sources":["IsEntryLockedUseCase.ts"],"sourcesContent":["import type {\n IIsEntryLockedUseCase,\n IIsEntryLockedUseCaseExecuteParams\n} from \"~/abstractions/IIsEntryLocked\";\nimport type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport type { IGetIdentity } from \"~/types\";\n\nexport interface IIsEntryLockedParams {\n getLockRecordUseCase: IGetLockRecordUseCase;\n getIdentity: IGetIdentity;\n}\n\nexport class IsEntryLockedUseCase implements IIsEntryLockedUseCase {\n private readonly getLockRecordUseCase: IGetLockRecordUseCase;\n private readonly getIdentity: IGetIdentity;\n\n public constructor(params: IIsEntryLockedParams) {\n this.getLockRecordUseCase = params.getLockRecordUseCase;\n this.getIdentity = params.getIdentity;\n }\n\n public async execute(params: IIsEntryLockedUseCaseExecuteParams): Promise<boolean> {\n try {\n const result = await this.getLockRecordUseCase.execute(params);\n if (!result || result.isExpired()) {\n return false;\n }\n const identity = this.getIdentity();\n\n return result.lockedBy.id !== identity.id;\n } catch (ex) {\n if (ex instanceof NotFoundError === false) {\n throw ex;\n }\n return false;\n }\n }\n}\n"],"mappings":";;;;;;AAKA,IAAAA,eAAA,GAAAC,OAAA;AAQO,MAAMC,oBAAoB,CAAkC;EAIxDC,WAAWA,CAACC,MAA4B,EAAE;IAC7C,IAAI,CAACC,oBAAoB,GAAGD,MAAM,CAACC,oBAAoB;IACvD,IAAI,CAACC,WAAW,GAAGF,MAAM,CAACE,WAAW;EACzC;EAEA,MAAaC,OAAOA,CAACH,MAA0C,EAAoB;IAC/E,IAAI;MACA,MAAMI,MAAM,GAAG,MAAM,IAAI,CAACH,oBAAoB,CAACE,OAAO,CAACH,MAAM,CAAC;MAC9D,IAAI,CAACI,MAAM,IAAIA,MAAM,CAACC,SAAS,CAAC,CAAC,EAAE;QAC/B,OAAO,KAAK;MAChB;MACA,MAAMC,QAAQ,GAAG,IAAI,CAACJ,WAAW,CAAC,CAAC;MAEnC,OAAOE,MAAM,CAACG,QAAQ,CAACC,EAAE,KAAKF,QAAQ,CAACE,EAAE;IAC7C,CAAC,CAAC,OAAOC,EAAE,EAAE;MACT,IAAIA,EAAE,YAAYC,6BAAa,KAAK,KAAK,EAAE;QACvC,MAAMD,EAAE;MACZ;MACA,OAAO,KAAK;IAChB;EACJ;AACJ;AAACE,OAAA,CAAAb,oBAAA,GAAAA,oBAAA","ignoreList":[]}
@@ -2,14 +2,19 @@ import type { ILockEntryUseCase, ILockEntryUseCaseExecuteParams } from "../../ab
2
2
  import type { IRecordLockingLockRecord, IRecordLockingModelManager } from "../../types";
3
3
  import type { IIsEntryLockedUseCase } from "../../abstractions/IIsEntryLocked";
4
4
  import type { ConvertEntryToLockRecordCb } from "../types";
5
+ import type { Security, SecurityIdentity } from "@webiny/api-security/types";
5
6
  export interface ILockEntryUseCaseParams {
6
7
  isEntryLockedUseCase: IIsEntryLockedUseCase;
7
8
  getManager(): Promise<IRecordLockingModelManager>;
9
+ getSecurity(): Pick<Security, "withoutAuthorization">;
10
+ getIdentity(): SecurityIdentity;
8
11
  convert: ConvertEntryToLockRecordCb;
9
12
  }
10
13
  export declare class LockEntryUseCase implements ILockEntryUseCase {
11
14
  private readonly isEntryLockedUseCase;
12
15
  private readonly getManager;
16
+ private readonly getSecurity;
17
+ private readonly getIdentity;
13
18
  private readonly convert;
14
19
  constructor(params: ILockEntryUseCaseParams);
15
20
  execute(params: ILockEntryUseCaseExecuteParams): Promise<IRecordLockingLockRecord>;
@@ -12,6 +12,8 @@ class LockEntryUseCase {
12
12
  constructor(params) {
13
13
  this.isEntryLockedUseCase = params.isEntryLockedUseCase;
14
14
  this.getManager = params.getManager;
15
+ this.getSecurity = params.getSecurity;
16
+ this.getIdentity = params.getIdentity;
15
17
  this.convert = params.convert;
16
18
  }
17
19
  async execute(params) {
@@ -29,16 +31,27 @@ class LockEntryUseCase {
29
31
  ...params
30
32
  });
31
33
  }
34
+ const security = this.getSecurity();
35
+ const identity = this.getIdentity();
32
36
  try {
37
+ const user = {
38
+ id: identity.id,
39
+ displayName: identity.displayName,
40
+ type: identity.type
41
+ };
33
42
  const manager = await this.getManager();
34
43
  const id = (0, _lockRecordDatabaseId.createLockRecordDatabaseId)(params.id);
35
- const entry = await manager.create({
36
- id,
37
- targetId: params.id,
38
- type: params.type,
39
- actions: []
44
+ return await security.withoutAuthorization(async () => {
45
+ const entry = await manager.create({
46
+ id,
47
+ createdBy: user,
48
+ savedBy: user,
49
+ targetId: params.id,
50
+ type: params.type,
51
+ actions: []
52
+ });
53
+ return this.convert(entry);
40
54
  });
41
- return this.convert(entry);
42
55
  } catch (ex) {
43
56
  throw new _error.default(`Could not lock entry: ${ex.message}`, ex.code || "LOCK_ENTRY_ERROR", {
44
57
  ...ex.data
@@ -1 +1 @@
1
- {"version":3,"names":["_error","_interopRequireDefault","require","_lockRecordDatabaseId","_handlerGraphql","LockEntryUseCase","constructor","params","isEntryLockedUseCase","getManager","convert","execute","locked","ex","NotFoundError","WebinyError","manager","id","createLockRecordDatabaseId","entry","create","targetId","type","actions","message","code","data","exports"],"sources":["LockEntryUseCase.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n ILockEntryUseCase,\n ILockEntryUseCaseExecuteParams\n} from \"~/abstractions/ILockEntryUseCase\";\nimport type {\n IRecordLockingLockRecord,\n IRecordLockingLockRecordValues,\n IRecordLockingModelManager\n} from \"~/types\";\nimport type { IIsEntryLockedUseCase } from \"~/abstractions/IIsEntryLocked\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport type { ConvertEntryToLockRecordCb } from \"~/useCases/types\";\n\nexport interface ILockEntryUseCaseParams {\n isEntryLockedUseCase: IIsEntryLockedUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n convert: ConvertEntryToLockRecordCb;\n}\n\nexport class LockEntryUseCase implements ILockEntryUseCase {\n private readonly isEntryLockedUseCase: IIsEntryLockedUseCase;\n private readonly getManager: () => Promise<IRecordLockingModelManager>;\n private readonly convert: ConvertEntryToLockRecordCb;\n\n public constructor(params: ILockEntryUseCaseParams) {\n this.isEntryLockedUseCase = params.isEntryLockedUseCase;\n this.getManager = params.getManager;\n this.convert = params.convert;\n }\n\n public async execute(\n params: ILockEntryUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord> {\n let locked = false;\n try {\n locked = await this.isEntryLockedUseCase.execute(params);\n } catch (ex) {\n if (ex instanceof NotFoundError === false) {\n throw ex;\n }\n locked = false;\n }\n if (locked) {\n throw new WebinyError(\"Entry is already locked for editing.\", \"ENTRY_ALREADY_LOCKED\", {\n ...params\n });\n }\n try {\n const manager = await this.getManager();\n\n const id = createLockRecordDatabaseId(params.id);\n const entry = await manager.create<IRecordLockingLockRecordValues>({\n id,\n targetId: params.id,\n type: params.type,\n actions: []\n });\n return this.convert(entry);\n } catch (ex) {\n throw new WebinyError(\n `Could not lock entry: ${ex.message}`,\n ex.code || \"LOCK_ENTRY_ERROR\",\n {\n ...ex.data\n }\n );\n }\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAWA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AASO,MAAMG,gBAAgB,CAA8B;EAKhDC,WAAWA,CAACC,MAA+B,EAAE;IAChD,IAAI,CAACC,oBAAoB,GAAGD,MAAM,CAACC,oBAAoB;IACvD,IAAI,CAACC,UAAU,GAAGF,MAAM,CAACE,UAAU;IACnC,IAAI,CAACC,OAAO,GAAGH,MAAM,CAACG,OAAO;EACjC;EAEA,MAAaC,OAAOA,CAChBJ,MAAsC,EACL;IACjC,IAAIK,MAAM,GAAG,KAAK;IAClB,IAAI;MACAA,MAAM,GAAG,MAAM,IAAI,CAACJ,oBAAoB,CAACG,OAAO,CAACJ,MAAM,CAAC;IAC5D,CAAC,CAAC,OAAOM,EAAE,EAAE;MACT,IAAIA,EAAE,YAAYC,6BAAa,KAAK,KAAK,EAAE;QACvC,MAAMD,EAAE;MACZ;MACAD,MAAM,GAAG,KAAK;IAClB;IACA,IAAIA,MAAM,EAAE;MACR,MAAM,IAAIG,cAAW,CAAC,sCAAsC,EAAE,sBAAsB,EAAE;QAClF,GAAGR;MACP,CAAC,CAAC;IACN;IACA,IAAI;MACA,MAAMS,OAAO,GAAG,MAAM,IAAI,CAACP,UAAU,CAAC,CAAC;MAEvC,MAAMQ,EAAE,GAAG,IAAAC,gDAA0B,EAACX,MAAM,CAACU,EAAE,CAAC;MAChD,MAAME,KAAK,GAAG,MAAMH,OAAO,CAACI,MAAM,CAAiC;QAC/DH,EAAE;QACFI,QAAQ,EAAEd,MAAM,CAACU,EAAE;QACnBK,IAAI,EAAEf,MAAM,CAACe,IAAI;QACjBC,OAAO,EAAE;MACb,CAAC,CAAC;MACF,OAAO,IAAI,CAACb,OAAO,CAACS,KAAK,CAAC;IAC9B,CAAC,CAAC,OAAON,EAAE,EAAE;MACT,MAAM,IAAIE,cAAW,CACjB,yBAAyBF,EAAE,CAACW,OAAO,EAAE,EACrCX,EAAE,CAACY,IAAI,IAAI,kBAAkB,EAC7B;QACI,GAAGZ,EAAE,CAACa;MACV,CACJ,CAAC;IACL;EACJ;AACJ;AAACC,OAAA,CAAAtB,gBAAA,GAAAA,gBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_error","_interopRequireDefault","require","_lockRecordDatabaseId","_handlerGraphql","LockEntryUseCase","constructor","params","isEntryLockedUseCase","getManager","getSecurity","getIdentity","convert","execute","locked","ex","NotFoundError","WebinyError","security","identity","user","id","displayName","type","manager","createLockRecordDatabaseId","withoutAuthorization","entry","create","createdBy","savedBy","targetId","actions","message","code","data","exports"],"sources":["LockEntryUseCase.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n ILockEntryUseCase,\n ILockEntryUseCaseExecuteParams\n} from \"~/abstractions/ILockEntryUseCase\";\nimport type {\n IRecordLockingLockRecord,\n IRecordLockingLockRecordValues,\n IRecordLockingModelManager\n} from \"~/types\";\nimport type { IIsEntryLockedUseCase } from \"~/abstractions/IIsEntryLocked\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport type { ConvertEntryToLockRecordCb } from \"~/useCases/types\";\nimport type { Security, SecurityIdentity } from \"@webiny/api-security/types\";\n\nexport interface ILockEntryUseCaseParams {\n isEntryLockedUseCase: IIsEntryLockedUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n getSecurity(): Pick<Security, \"withoutAuthorization\">;\n getIdentity(): SecurityIdentity;\n convert: ConvertEntryToLockRecordCb;\n}\n\nexport class LockEntryUseCase implements ILockEntryUseCase {\n private readonly isEntryLockedUseCase: IIsEntryLockedUseCase;\n private readonly getManager: ILockEntryUseCaseParams[\"getManager\"];\n private readonly getSecurity: ILockEntryUseCaseParams[\"getSecurity\"];\n private readonly getIdentity: ILockEntryUseCaseParams[\"getIdentity\"];\n private readonly convert: ConvertEntryToLockRecordCb;\n\n public constructor(params: ILockEntryUseCaseParams) {\n this.isEntryLockedUseCase = params.isEntryLockedUseCase;\n this.getManager = params.getManager;\n this.getSecurity = params.getSecurity;\n this.getIdentity = params.getIdentity;\n this.convert = params.convert;\n }\n\n public async execute(\n params: ILockEntryUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord> {\n let locked = false;\n try {\n locked = await this.isEntryLockedUseCase.execute(params);\n } catch (ex) {\n if (ex instanceof NotFoundError === false) {\n throw ex;\n }\n locked = false;\n }\n if (locked) {\n throw new WebinyError(\"Entry is already locked for editing.\", \"ENTRY_ALREADY_LOCKED\", {\n ...params\n });\n }\n const security = this.getSecurity();\n const identity = this.getIdentity();\n try {\n const user: SecurityIdentity = {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n };\n const manager = await this.getManager();\n\n const id = createLockRecordDatabaseId(params.id);\n return await security.withoutAuthorization(async () => {\n const entry = await manager.create<IRecordLockingLockRecordValues>({\n id,\n createdBy: user,\n savedBy: user,\n targetId: params.id,\n type: params.type,\n actions: []\n });\n return this.convert(entry);\n });\n } catch (ex) {\n throw new WebinyError(\n `Could not lock entry: ${ex.message}`,\n ex.code || \"LOCK_ENTRY_ERROR\",\n {\n ...ex.data\n }\n );\n }\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAWA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AAYO,MAAMG,gBAAgB,CAA8B;EAOhDC,WAAWA,CAACC,MAA+B,EAAE;IAChD,IAAI,CAACC,oBAAoB,GAAGD,MAAM,CAACC,oBAAoB;IACvD,IAAI,CAACC,UAAU,GAAGF,MAAM,CAACE,UAAU;IACnC,IAAI,CAACC,WAAW,GAAGH,MAAM,CAACG,WAAW;IACrC,IAAI,CAACC,WAAW,GAAGJ,MAAM,CAACI,WAAW;IACrC,IAAI,CAACC,OAAO,GAAGL,MAAM,CAACK,OAAO;EACjC;EAEA,MAAaC,OAAOA,CAChBN,MAAsC,EACL;IACjC,IAAIO,MAAM,GAAG,KAAK;IAClB,IAAI;MACAA,MAAM,GAAG,MAAM,IAAI,CAACN,oBAAoB,CAACK,OAAO,CAACN,MAAM,CAAC;IAC5D,CAAC,CAAC,OAAOQ,EAAE,EAAE;MACT,IAAIA,EAAE,YAAYC,6BAAa,KAAK,KAAK,EAAE;QACvC,MAAMD,EAAE;MACZ;MACAD,MAAM,GAAG,KAAK;IAClB;IACA,IAAIA,MAAM,EAAE;MACR,MAAM,IAAIG,cAAW,CAAC,sCAAsC,EAAE,sBAAsB,EAAE;QAClF,GAAGV;MACP,CAAC,CAAC;IACN;IACA,MAAMW,QAAQ,GAAG,IAAI,CAACR,WAAW,CAAC,CAAC;IACnC,MAAMS,QAAQ,GAAG,IAAI,CAACR,WAAW,CAAC,CAAC;IACnC,IAAI;MACA,MAAMS,IAAsB,GAAG;QAC3BC,EAAE,EAAEF,QAAQ,CAACE,EAAE;QACfC,WAAW,EAAEH,QAAQ,CAACG,WAAW;QACjCC,IAAI,EAAEJ,QAAQ,CAACI;MACnB,CAAC;MACD,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACf,UAAU,CAAC,CAAC;MAEvC,MAAMY,EAAE,GAAG,IAAAI,gDAA0B,EAAClB,MAAM,CAACc,EAAE,CAAC;MAChD,OAAO,MAAMH,QAAQ,CAACQ,oBAAoB,CAAC,YAAY;QACnD,MAAMC,KAAK,GAAG,MAAMH,OAAO,CAACI,MAAM,CAAiC;UAC/DP,EAAE;UACFQ,SAAS,EAAET,IAAI;UACfU,OAAO,EAAEV,IAAI;UACbW,QAAQ,EAAExB,MAAM,CAACc,EAAE;UACnBE,IAAI,EAAEhB,MAAM,CAACgB,IAAI;UACjBS,OAAO,EAAE;QACb,CAAC,CAAC;QACF,OAAO,IAAI,CAACpB,OAAO,CAACe,KAAK,CAAC;MAC9B,CAAC,CAAC;IACN,CAAC,CAAC,OAAOZ,EAAE,EAAE;MACT,MAAM,IAAIE,cAAW,CACjB,yBAAyBF,EAAE,CAACkB,OAAO,EAAE,EACrClB,EAAE,CAACmB,IAAI,IAAI,kBAAkB,EAC7B;QACI,GAAGnB,EAAE,CAACoB;MACV,CACJ,CAAC;IACL;EACJ;AACJ;AAACC,OAAA,CAAA/B,gBAAA,GAAAA,gBAAA","ignoreList":[]}
@@ -2,10 +2,12 @@ import type { IUnlockEntryUseCase, IUnlockEntryUseCaseExecuteParams } from "../.
2
2
  import type { IGetIdentity, IHasRecordLockingAccessCallable, IRecordLockingLockRecord, IRecordLockingModelManager } from "../../types";
3
3
  import type { IGetLockRecordUseCase } from "../../abstractions/IGetLockRecordUseCase";
4
4
  import type { IKickOutCurrentUserUseCase } from "../../abstractions/IKickOutCurrentUserUseCase";
5
+ import type { Security } from "@webiny/api-security/types";
5
6
  export interface IUnlockEntryUseCaseParams {
6
7
  readonly getLockRecordUseCase: IGetLockRecordUseCase;
7
8
  readonly kickOutCurrentUserUseCase: IKickOutCurrentUserUseCase;
8
9
  getManager(): Promise<IRecordLockingModelManager>;
10
+ getSecurity(): Pick<Security, "withoutAuthorization">;
9
11
  getIdentity: IGetIdentity;
10
12
  hasRecordLockingAccess: IHasRecordLockingAccessCallable;
11
13
  }
@@ -13,6 +15,7 @@ export declare class UnlockEntryUseCase implements IUnlockEntryUseCase {
13
15
  private readonly getLockRecordUseCase;
14
16
  private readonly kickOutCurrentUserUseCase;
15
17
  private readonly getManager;
18
+ private readonly getSecurity;
16
19
  private readonly getIdentity;
17
20
  private readonly hasRecordLockingAccess;
18
21
  constructor(params: IUnlockEntryUseCaseParams);
@@ -15,17 +15,21 @@ class UnlockEntryUseCase {
15
15
  this.getLockRecordUseCase = params.getLockRecordUseCase;
16
16
  this.kickOutCurrentUserUseCase = params.kickOutCurrentUserUseCase;
17
17
  this.getManager = params.getManager;
18
+ this.getSecurity = params.getSecurity;
18
19
  this.getIdentity = params.getIdentity;
19
20
  this.hasRecordLockingAccess = params.hasRecordLockingAccess;
20
21
  }
21
22
  async execute(params) {
22
23
  const record = await this.getLockRecordUseCase.execute(params);
23
- if (!record) {
24
+ if (!record || record.isExpired()) {
25
+ const security = this.getSecurity();
24
26
  try {
25
27
  const manager = await this.getManager();
26
- await manager.delete((0, _lockRecordDatabaseId.createLockRecordDatabaseId)(params.id), {
27
- force: true,
28
- permanently: true
28
+ await security.withoutAuthorization(async () => {
29
+ await manager.delete((0, _lockRecordDatabaseId.createLockRecordDatabaseId)(params.id), {
30
+ force: true,
31
+ permanently: true
32
+ });
29
33
  });
30
34
  } catch (ex) {
31
35
  if (ex instanceof _handlerGraphql.NotFoundError === false) {
@@ -60,17 +64,20 @@ class UnlockEntryUseCase {
60
64
  }
61
65
  kickOutCurrentUser = true;
62
66
  }
67
+ const security = this.getSecurity();
63
68
  try {
64
69
  const manager = await this.getManager();
65
- await manager.delete((0, _lockRecordDatabaseId.createLockRecordDatabaseId)(params.id), {
66
- force: true,
67
- permanently: true
68
- });
69
- if (!kickOutCurrentUser) {
70
+ return await security.withoutAuthorization(async () => {
71
+ await manager.delete((0, _lockRecordDatabaseId.createLockRecordDatabaseId)(params.id), {
72
+ force: true,
73
+ permanently: true
74
+ });
75
+ if (!kickOutCurrentUser) {
76
+ return record;
77
+ }
78
+ await this.kickOutCurrentUserUseCase.execute(record);
70
79
  return record;
71
- }
72
- await this.kickOutCurrentUserUseCase.execute(record);
73
- return record;
80
+ });
74
81
  } catch (ex) {
75
82
  throw new _error.default(`Could not unlock entry: ${ex.message}`, ex.code || "UNLOCK_ENTRY_ERROR", {
76
83
  ...ex.data
@@ -1 +1 @@
1
- {"version":3,"names":["_error","_interopRequireDefault","require","_lockRecordDatabaseId","_validateSameIdentity","_apiSecurity","_handlerGraphql","UnlockEntryUseCase","constructor","params","getLockRecordUseCase","kickOutCurrentUserUseCase","getManager","getIdentity","hasRecordLockingAccess","execute","record","manager","delete","createLockRecordDatabaseId","id","force","permanently","ex","NotFoundError","console","log","error","WebinyError","kickOutCurrentUser","validateSameIdentity","target","lockedBy","hasAccess","NotAuthorizedError","message","code","data","exports"],"sources":["UnlockEntryUseCase.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n IUnlockEntryUseCase,\n IUnlockEntryUseCaseExecuteParams\n} from \"~/abstractions/IUnlockEntryUseCase\";\nimport type {\n IGetIdentity,\n IHasRecordLockingAccessCallable,\n IRecordLockingLockRecord,\n IRecordLockingModelManager\n} from \"~/types\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { validateSameIdentity } from \"~/utils/validateSameIdentity\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport type { IKickOutCurrentUserUseCase } from \"~/abstractions/IKickOutCurrentUserUseCase\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\n\nexport interface IUnlockEntryUseCaseParams {\n readonly getLockRecordUseCase: IGetLockRecordUseCase;\n readonly kickOutCurrentUserUseCase: IKickOutCurrentUserUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n getIdentity: IGetIdentity;\n hasRecordLockingAccess: IHasRecordLockingAccessCallable;\n}\n\nexport class UnlockEntryUseCase implements IUnlockEntryUseCase {\n private readonly getLockRecordUseCase: IGetLockRecordUseCase;\n private readonly kickOutCurrentUserUseCase: IKickOutCurrentUserUseCase;\n private readonly getManager: () => Promise<IRecordLockingModelManager>;\n private readonly getIdentity: IGetIdentity;\n private readonly hasRecordLockingAccess: IHasRecordLockingAccessCallable;\n\n public constructor(params: IUnlockEntryUseCaseParams) {\n this.getLockRecordUseCase = params.getLockRecordUseCase;\n this.kickOutCurrentUserUseCase = params.kickOutCurrentUserUseCase;\n this.getManager = params.getManager;\n this.getIdentity = params.getIdentity;\n this.hasRecordLockingAccess = params.hasRecordLockingAccess;\n }\n\n public async execute(\n params: IUnlockEntryUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord> {\n const record = await this.getLockRecordUseCase.execute(params);\n if (!record) {\n try {\n const manager = await this.getManager();\n await manager.delete(createLockRecordDatabaseId(params.id), {\n force: true,\n permanently: true\n });\n } catch (ex) {\n if (ex instanceof NotFoundError === false) {\n console.log(\"Could not forcefully delete lock record.\");\n console.error(ex);\n }\n }\n\n throw new WebinyError(\"Lock Record not found.\", \"LOCK_RECORD_NOT_FOUND\", {\n ...params\n });\n }\n\n /**\n * We need to validate that the user executing unlock is the same user that locked the entry.\n * In case it is not the same user, there is a possibility that it is a user which has full access,\n * and at that point, we allow unlocking, but we also need to message the user who locked the entry.\n *\n */\n let kickOutCurrentUser = false;\n try {\n validateSameIdentity({\n getIdentity: this.getIdentity,\n target: record.lockedBy\n });\n } catch (ex) {\n if (!params.force) {\n throw ex;\n }\n const hasAccess = await this.hasRecordLockingAccess();\n if (ex instanceof NotAuthorizedError === false || !hasAccess) {\n throw ex;\n }\n\n kickOutCurrentUser = true;\n }\n\n try {\n const manager = await this.getManager();\n await manager.delete(createLockRecordDatabaseId(params.id), {\n force: true,\n permanently: true\n });\n\n if (!kickOutCurrentUser) {\n return record;\n }\n await this.kickOutCurrentUserUseCase.execute(record);\n return record;\n } catch (ex) {\n throw new WebinyError(\n `Could not unlock entry: ${ex.message}`,\n ex.code || \"UNLOCK_ENTRY_ERROR\",\n {\n ...ex.data\n }\n );\n }\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAWA,IAAAC,qBAAA,GAAAD,OAAA;AAEA,IAAAE,qBAAA,GAAAF,OAAA;AACA,IAAAG,YAAA,GAAAH,OAAA;AAEA,IAAAI,eAAA,GAAAJ,OAAA;AAUO,MAAMK,kBAAkB,CAAgC;EAOpDC,WAAWA,CAACC,MAAiC,EAAE;IAClD,IAAI,CAACC,oBAAoB,GAAGD,MAAM,CAACC,oBAAoB;IACvD,IAAI,CAACC,yBAAyB,GAAGF,MAAM,CAACE,yBAAyB;IACjE,IAAI,CAACC,UAAU,GAAGH,MAAM,CAACG,UAAU;IACnC,IAAI,CAACC,WAAW,GAAGJ,MAAM,CAACI,WAAW;IACrC,IAAI,CAACC,sBAAsB,GAAGL,MAAM,CAACK,sBAAsB;EAC/D;EAEA,MAAaC,OAAOA,CAChBN,MAAwC,EACP;IACjC,MAAMO,MAAM,GAAG,MAAM,IAAI,CAACN,oBAAoB,CAACK,OAAO,CAACN,MAAM,CAAC;IAC9D,IAAI,CAACO,MAAM,EAAE;MACT,IAAI;QACA,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACL,UAAU,CAAC,CAAC;QACvC,MAAMK,OAAO,CAACC,MAAM,CAAC,IAAAC,gDAA0B,EAACV,MAAM,CAACW,EAAE,CAAC,EAAE;UACxDC,KAAK,EAAE,IAAI;UACXC,WAAW,EAAE;QACjB,CAAC,CAAC;MACN,CAAC,CAAC,OAAOC,EAAE,EAAE;QACT,IAAIA,EAAE,YAAYC,6BAAa,KAAK,KAAK,EAAE;UACvCC,OAAO,CAACC,GAAG,CAAC,0CAA0C,CAAC;UACvDD,OAAO,CAACE,KAAK,CAACJ,EAAE,CAAC;QACrB;MACJ;MAEA,MAAM,IAAIK,cAAW,CAAC,wBAAwB,EAAE,uBAAuB,EAAE;QACrE,GAAGnB;MACP,CAAC,CAAC;IACN;;IAEA;AACR;AACA;AACA;AACA;AACA;IACQ,IAAIoB,kBAAkB,GAAG,KAAK;IAC9B,IAAI;MACA,IAAAC,0CAAoB,EAAC;QACjBjB,WAAW,EAAE,IAAI,CAACA,WAAW;QAC7BkB,MAAM,EAAEf,MAAM,CAACgB;MACnB,CAAC,CAAC;IACN,CAAC,CAAC,OAAOT,EAAE,EAAE;MACT,IAAI,CAACd,MAAM,CAACY,KAAK,EAAE;QACf,MAAME,EAAE;MACZ;MACA,MAAMU,SAAS,GAAG,MAAM,IAAI,CAACnB,sBAAsB,CAAC,CAAC;MACrD,IAAIS,EAAE,YAAYW,+BAAkB,KAAK,KAAK,IAAI,CAACD,SAAS,EAAE;QAC1D,MAAMV,EAAE;MACZ;MAEAM,kBAAkB,GAAG,IAAI;IAC7B;IAEA,IAAI;MACA,MAAMZ,OAAO,GAAG,MAAM,IAAI,CAACL,UAAU,CAAC,CAAC;MACvC,MAAMK,OAAO,CAACC,MAAM,CAAC,IAAAC,gDAA0B,EAACV,MAAM,CAACW,EAAE,CAAC,EAAE;QACxDC,KAAK,EAAE,IAAI;QACXC,WAAW,EAAE;MACjB,CAAC,CAAC;MAEF,IAAI,CAACO,kBAAkB,EAAE;QACrB,OAAOb,MAAM;MACjB;MACA,MAAM,IAAI,CAACL,yBAAyB,CAACI,OAAO,CAACC,MAAM,CAAC;MACpD,OAAOA,MAAM;IACjB,CAAC,CAAC,OAAOO,EAAE,EAAE;MACT,MAAM,IAAIK,cAAW,CACjB,2BAA2BL,EAAE,CAACY,OAAO,EAAE,EACvCZ,EAAE,CAACa,IAAI,IAAI,oBAAoB,EAC/B;QACI,GAAGb,EAAE,CAACc;MACV,CACJ,CAAC;IACL;EACJ;AACJ;AAACC,OAAA,CAAA/B,kBAAA,GAAAA,kBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_error","_interopRequireDefault","require","_lockRecordDatabaseId","_validateSameIdentity","_apiSecurity","_handlerGraphql","UnlockEntryUseCase","constructor","params","getLockRecordUseCase","kickOutCurrentUserUseCase","getManager","getSecurity","getIdentity","hasRecordLockingAccess","execute","record","isExpired","security","manager","withoutAuthorization","delete","createLockRecordDatabaseId","id","force","permanently","ex","NotFoundError","console","log","error","WebinyError","kickOutCurrentUser","validateSameIdentity","target","lockedBy","hasAccess","NotAuthorizedError","message","code","data","exports"],"sources":["UnlockEntryUseCase.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n IUnlockEntryUseCase,\n IUnlockEntryUseCaseExecuteParams\n} from \"~/abstractions/IUnlockEntryUseCase\";\nimport type {\n IGetIdentity,\n IHasRecordLockingAccessCallable,\n IRecordLockingLockRecord,\n IRecordLockingModelManager\n} from \"~/types\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { validateSameIdentity } from \"~/utils/validateSameIdentity\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport type { IKickOutCurrentUserUseCase } from \"~/abstractions/IKickOutCurrentUserUseCase\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport type { Security } from \"@webiny/api-security/types\";\n\nexport interface IUnlockEntryUseCaseParams {\n readonly getLockRecordUseCase: IGetLockRecordUseCase;\n readonly kickOutCurrentUserUseCase: IKickOutCurrentUserUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n getSecurity(): Pick<Security, \"withoutAuthorization\">;\n getIdentity: IGetIdentity;\n hasRecordLockingAccess: IHasRecordLockingAccessCallable;\n}\n\nexport class UnlockEntryUseCase implements IUnlockEntryUseCase {\n private readonly getLockRecordUseCase: IGetLockRecordUseCase;\n private readonly kickOutCurrentUserUseCase: IKickOutCurrentUserUseCase;\n private readonly getManager: IUnlockEntryUseCaseParams[\"getManager\"];\n private readonly getSecurity: IUnlockEntryUseCaseParams[\"getSecurity\"];\n private readonly getIdentity: IGetIdentity;\n private readonly hasRecordLockingAccess: IHasRecordLockingAccessCallable;\n\n public constructor(params: IUnlockEntryUseCaseParams) {\n this.getLockRecordUseCase = params.getLockRecordUseCase;\n this.kickOutCurrentUserUseCase = params.kickOutCurrentUserUseCase;\n this.getManager = params.getManager;\n this.getSecurity = params.getSecurity;\n this.getIdentity = params.getIdentity;\n this.hasRecordLockingAccess = params.hasRecordLockingAccess;\n }\n\n public async execute(\n params: IUnlockEntryUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord> {\n const record = await this.getLockRecordUseCase.execute(params);\n if (!record || record.isExpired()) {\n const security = this.getSecurity();\n try {\n const manager = await this.getManager();\n await security.withoutAuthorization(async () => {\n await manager.delete(createLockRecordDatabaseId(params.id), {\n force: true,\n permanently: true\n });\n });\n } catch (ex) {\n if (ex instanceof NotFoundError === false) {\n console.log(\"Could not forcefully delete lock record.\");\n console.error(ex);\n }\n }\n\n throw new WebinyError(\"Lock Record not found.\", \"LOCK_RECORD_NOT_FOUND\", {\n ...params\n });\n }\n\n /**\n * We need to validate that the user executing unlock is the same user that locked the entry.\n * In case it is not the same user, there is a possibility that it is a user which has full access,\n * and at that point, we allow unlocking, but we also need to message the user who locked the entry.\n *\n */\n let kickOutCurrentUser = false;\n try {\n validateSameIdentity({\n getIdentity: this.getIdentity,\n target: record.lockedBy\n });\n } catch (ex) {\n if (!params.force) {\n throw ex;\n }\n const hasAccess = await this.hasRecordLockingAccess();\n if (ex instanceof NotAuthorizedError === false || !hasAccess) {\n throw ex;\n }\n\n kickOutCurrentUser = true;\n }\n\n const security = this.getSecurity();\n try {\n const manager = await this.getManager();\n return await security.withoutAuthorization(async () => {\n await manager.delete(createLockRecordDatabaseId(params.id), {\n force: true,\n permanently: true\n });\n\n if (!kickOutCurrentUser) {\n return record;\n }\n await this.kickOutCurrentUserUseCase.execute(record);\n return record;\n });\n } catch (ex) {\n throw new WebinyError(\n `Could not unlock entry: ${ex.message}`,\n ex.code || \"UNLOCK_ENTRY_ERROR\",\n {\n ...ex.data\n }\n );\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -2,15 +2,18 @@ import type { IUnlockEntryRequestUseCase, IUnlockEntryRequestUseCaseExecuteParam
2
2
  import type { IGetIdentity, IRecordLockingLockRecord, IRecordLockingModelManager } from "../../types";
3
3
  import type { IGetLockRecordUseCase } from "../../abstractions/IGetLockRecordUseCase";
4
4
  import type { ConvertEntryToLockRecordCb } from "../types";
5
+ import type { Security } from "@webiny/api-security/types";
5
6
  export interface IUnlockEntryRequestUseCaseParams {
6
7
  getLockRecordUseCase: IGetLockRecordUseCase;
7
- getManager: () => Promise<IRecordLockingModelManager>;
8
+ getManager(): Promise<IRecordLockingModelManager>;
9
+ getSecurity(): Pick<Security, "withoutAuthorization">;
8
10
  getIdentity: IGetIdentity;
9
11
  convert: ConvertEntryToLockRecordCb;
10
12
  }
11
13
  export declare class UnlockEntryRequestUseCase implements IUnlockEntryRequestUseCase {
12
14
  private readonly getLockRecordUseCase;
13
15
  private readonly getManager;
16
+ private readonly getSecurity;
14
17
  private readonly getIdentity;
15
18
  private readonly convert;
16
19
  constructor(params: IUnlockEntryRequestUseCaseParams);
@@ -13,12 +13,13 @@ class UnlockEntryRequestUseCase {
13
13
  constructor(params) {
14
14
  this.getLockRecordUseCase = params.getLockRecordUseCase;
15
15
  this.getManager = params.getManager;
16
+ this.getSecurity = params.getSecurity;
16
17
  this.getIdentity = params.getIdentity;
17
18
  this.convert = params.convert;
18
19
  }
19
20
  async execute(params) {
20
21
  const record = await this.getLockRecordUseCase.execute(params);
21
- if (!record) {
22
+ if (!record || record.isExpired()) {
22
23
  throw new _error.default("Entry is not locked.", "ENTRY_NOT_LOCKED", {
23
24
  ...params
24
25
  });
@@ -50,6 +51,7 @@ class UnlockEntryRequestUseCase {
50
51
  createdOn: new Date(),
51
52
  createdBy: this.getIdentity()
52
53
  });
54
+ const security = this.getSecurity();
53
55
  try {
54
56
  const manager = await this.getManager();
55
57
  const entryId = (0, _lockRecordDatabaseId.createLockRecordDatabaseId)(record.id);
@@ -57,8 +59,10 @@ class UnlockEntryRequestUseCase {
57
59
  id: entryId,
58
60
  version: 1
59
61
  });
60
- const result = await manager.update(id, record.toObject());
61
- return this.convert(result);
62
+ return await security.withoutAuthorization(async () => {
63
+ const result = await manager.update(id, record.toObject());
64
+ return this.convert(result);
65
+ });
62
66
  } catch (ex) {
63
67
  throw new _error.default("Could not update record with a unlock request.", "UNLOCK_REQUEST_ERROR", {
64
68
  ...ex.data,
@@ -1 +1 @@
1
- {"version":3,"names":["_error","_interopRequireDefault","require","_types","_lockRecordDatabaseId","_utils","UnlockEntryRequestUseCase","constructor","params","getLockRecordUseCase","getManager","getIdentity","convert","execute","record","WebinyError","unlockRequested","getUnlockRequested","currentIdentity","createdBy","id","identity","approved","getUnlockApproved","denied","getUnlockDenied","addAction","type","RecordLockingLockRecordActionType","requested","createdOn","Date","manager","entryId","createLockRecordDatabaseId","createIdentifier","version","result","update","toObject","ex","data","error","message","code","recordId","exports"],"sources":["UnlockEntryRequestUseCase.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n IUnlockEntryRequestUseCase,\n IUnlockEntryRequestUseCaseExecuteParams\n} from \"~/abstractions/IUnlockEntryRequestUseCase\";\nimport type { IGetIdentity, IRecordLockingLockRecord, IRecordLockingModelManager } from \"~/types\";\nimport { RecordLockingLockRecordActionType } from \"~/types\";\nimport type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport type { ConvertEntryToLockRecordCb } from \"~/useCases/types\";\n\nexport interface IUnlockEntryRequestUseCaseParams {\n getLockRecordUseCase: IGetLockRecordUseCase;\n getManager: () => Promise<IRecordLockingModelManager>;\n getIdentity: IGetIdentity;\n convert: ConvertEntryToLockRecordCb;\n}\n\nexport class UnlockEntryRequestUseCase implements IUnlockEntryRequestUseCase {\n private readonly getLockRecordUseCase: IGetLockRecordUseCase;\n private readonly getManager: () => Promise<IRecordLockingModelManager>;\n private readonly getIdentity: IGetIdentity;\n private readonly convert: ConvertEntryToLockRecordCb;\n\n public constructor(params: IUnlockEntryRequestUseCaseParams) {\n this.getLockRecordUseCase = params.getLockRecordUseCase;\n this.getManager = params.getManager;\n this.getIdentity = params.getIdentity;\n this.convert = params.convert;\n }\n\n public async execute(\n params: IUnlockEntryRequestUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord> {\n const record = await this.getLockRecordUseCase.execute(params);\n if (!record) {\n throw new WebinyError(\"Entry is not locked.\", \"ENTRY_NOT_LOCKED\", {\n ...params\n });\n }\n const unlockRequested = record.getUnlockRequested();\n if (unlockRequested) {\n const currentIdentity = this.getIdentity();\n /**\n * If a current identity did not request unlock, we will not allow that user to continue.\n */\n if (unlockRequested.createdBy.id !== currentIdentity.id) {\n throw new WebinyError(\n \"Unlock request already sent.\",\n \"UNLOCK_REQUEST_ALREADY_SENT\",\n {\n ...params,\n identity: unlockRequested.createdBy\n }\n );\n }\n const approved = record.getUnlockApproved();\n const denied = record.getUnlockDenied();\n if (approved || denied) {\n return record;\n }\n throw new WebinyError(\"Unlock request already sent.\", \"UNLOCK_REQUEST_ALREADY_SENT\", {\n ...params,\n identity: unlockRequested.createdBy\n });\n }\n\n record.addAction({\n type: RecordLockingLockRecordActionType.requested,\n createdOn: new Date(),\n createdBy: this.getIdentity()\n });\n\n try {\n const manager = await this.getManager();\n\n const entryId = createLockRecordDatabaseId(record.id);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n const result = await manager.update(id, record.toObject());\n return this.convert(result);\n } catch (ex) {\n throw new WebinyError(\n \"Could not update record with a unlock request.\",\n \"UNLOCK_REQUEST_ERROR\",\n {\n ...ex.data,\n error: {\n message: ex.message,\n code: ex.code\n },\n id: params.id,\n type: params.type,\n recordId: record.id\n }\n );\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_error","_interopRequireDefault","require","_types","_lockRecordDatabaseId","_utils","UnlockEntryRequestUseCase","constructor","params","getLockRecordUseCase","getManager","getSecurity","getIdentity","convert","execute","record","isExpired","WebinyError","unlockRequested","getUnlockRequested","currentIdentity","createdBy","id","identity","approved","getUnlockApproved","denied","getUnlockDenied","addAction","type","RecordLockingLockRecordActionType","requested","createdOn","Date","security","manager","entryId","createLockRecordDatabaseId","createIdentifier","version","withoutAuthorization","result","update","toObject","ex","data","error","message","code","recordId","exports"],"sources":["UnlockEntryRequestUseCase.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n IUnlockEntryRequestUseCase,\n IUnlockEntryRequestUseCaseExecuteParams\n} from \"~/abstractions/IUnlockEntryRequestUseCase\";\nimport type { IGetIdentity, IRecordLockingLockRecord, IRecordLockingModelManager } from \"~/types\";\nimport { RecordLockingLockRecordActionType } from \"~/types\";\nimport type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport type { ConvertEntryToLockRecordCb } from \"~/useCases/types\";\nimport type { Security } from \"@webiny/api-security/types\";\n\nexport interface IUnlockEntryRequestUseCaseParams {\n getLockRecordUseCase: IGetLockRecordUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n getSecurity(): Pick<Security, \"withoutAuthorization\">;\n getIdentity: IGetIdentity;\n convert: ConvertEntryToLockRecordCb;\n}\n\nexport class UnlockEntryRequestUseCase implements IUnlockEntryRequestUseCase {\n private readonly getLockRecordUseCase: IGetLockRecordUseCase;\n private readonly getManager: IUnlockEntryRequestUseCaseParams[\"getManager\"];\n private readonly getSecurity: IUnlockEntryRequestUseCaseParams[\"getSecurity\"];\n private readonly getIdentity: IGetIdentity;\n private readonly convert: ConvertEntryToLockRecordCb;\n\n public constructor(params: IUnlockEntryRequestUseCaseParams) {\n this.getLockRecordUseCase = params.getLockRecordUseCase;\n this.getManager = params.getManager;\n this.getSecurity = params.getSecurity;\n this.getIdentity = params.getIdentity;\n this.convert = params.convert;\n }\n\n public async execute(\n params: IUnlockEntryRequestUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord> {\n const record = await this.getLockRecordUseCase.execute(params);\n if (!record || record.isExpired()) {\n throw new WebinyError(\"Entry is not locked.\", \"ENTRY_NOT_LOCKED\", {\n ...params\n });\n }\n const unlockRequested = record.getUnlockRequested();\n if (unlockRequested) {\n const currentIdentity = this.getIdentity();\n /**\n * If a current identity did not request unlock, we will not allow that user to continue.\n */\n if (unlockRequested.createdBy.id !== currentIdentity.id) {\n throw new WebinyError(\n \"Unlock request already sent.\",\n \"UNLOCK_REQUEST_ALREADY_SENT\",\n {\n ...params,\n identity: unlockRequested.createdBy\n }\n );\n }\n const approved = record.getUnlockApproved();\n const denied = record.getUnlockDenied();\n if (approved || denied) {\n return record;\n }\n throw new WebinyError(\"Unlock request already sent.\", \"UNLOCK_REQUEST_ALREADY_SENT\", {\n ...params,\n identity: unlockRequested.createdBy\n });\n }\n\n record.addAction({\n type: RecordLockingLockRecordActionType.requested,\n createdOn: new Date(),\n createdBy: this.getIdentity()\n });\n\n const security = this.getSecurity();\n\n try {\n const manager = await this.getManager();\n\n const entryId = createLockRecordDatabaseId(record.id);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n return await security.withoutAuthorization(async () => {\n const result = await manager.update(id, record.toObject());\n return this.convert(result);\n });\n } catch (ex) {\n throw new WebinyError(\n \"Could not update record with a unlock request.\",\n \"UNLOCK_REQUEST_ERROR\",\n {\n ...ex.data,\n error: {\n message: ex.message,\n code: ex.code\n },\n id: params.id,\n type: params.type,\n recordId: record.id\n }\n );\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -3,10 +3,12 @@ import type { IGetIdentity, IRecordLockingLockRecord, IRecordLockingModelManager
3
3
  import type { IGetLockRecordUseCase } from "../../abstractions/IGetLockRecordUseCase";
4
4
  import type { ILockEntryUseCase } from "../../abstractions/ILockEntryUseCase";
5
5
  import type { ConvertEntryToLockRecordCb } from "../types";
6
+ import type { Security } from "@webiny/api-security/types";
6
7
  export interface IUpdateEntryLockUseCaseParams {
7
8
  readonly getLockRecordUseCase: IGetLockRecordUseCase;
8
9
  readonly lockEntryUseCase: ILockEntryUseCase;
9
10
  getManager(): Promise<IRecordLockingModelManager>;
11
+ getSecurity(): Pick<Security, "withoutAuthorization">;
10
12
  getIdentity: IGetIdentity;
11
13
  convert: ConvertEntryToLockRecordCb;
12
14
  }
@@ -14,8 +16,11 @@ export declare class UpdateEntryLockUseCase implements IUpdateEntryLockUseCase {
14
16
  private readonly getLockRecordUseCase;
15
17
  private readonly lockEntryUseCase;
16
18
  private readonly getManager;
19
+ private readonly getSecurity;
17
20
  private readonly getIdentity;
18
21
  private readonly convert;
19
22
  constructor(params: IUpdateEntryLockUseCaseParams);
20
23
  execute(params: IUpdateEntryLockUseCaseExecuteParams): Promise<IRecordLockingLockRecord>;
24
+ private updateOverExistingLockRecord;
25
+ private updateExistingLockRecord;
21
26
  }
@@ -13,29 +13,74 @@ class UpdateEntryLockUseCase {
13
13
  this.getLockRecordUseCase = params.getLockRecordUseCase;
14
14
  this.lockEntryUseCase = params.lockEntryUseCase;
15
15
  this.getManager = params.getManager;
16
+ this.getSecurity = params.getSecurity;
16
17
  this.getIdentity = params.getIdentity;
17
18
  this.convert = params.convert;
18
19
  }
19
20
  async execute(params) {
21
+ /**
22
+ * There is a possibility that the lock record already exists, just that the entry is not actually locked - lock expired.
23
+ */
20
24
  const record = await this.getLockRecordUseCase.execute(params);
25
+ /**
26
+ * If it exists, we will update the record with new user and dates.
27
+ * But if it does not exist, we will create a new record.
28
+ */
21
29
  if (!record) {
22
30
  return this.lockEntryUseCase.execute(params);
31
+ } else if (record.isExpired()) {
32
+ return this.updateOverExistingLockRecord(record);
23
33
  }
34
+ /**
35
+ * If the record exists and is not expired, we need to check if the user is the same as the one who locked it.
36
+ */
24
37
  (0, _validateSameIdentity.validateSameIdentity)({
25
38
  getIdentity: this.getIdentity,
26
39
  target: record.lockedBy
27
40
  });
41
+ return this.updateExistingLockRecord(record);
42
+ }
43
+ async updateOverExistingLockRecord(record) {
44
+ try {
45
+ const manager = await this.getManager();
46
+ const security = this.getSecurity();
47
+ const identity = this.getIdentity();
48
+ const entryId = (0, _lockRecordDatabaseId.createLockRecordDatabaseId)(record.id);
49
+ const id = (0, _utils.createIdentifier)({
50
+ id: entryId,
51
+ version: 1
52
+ });
53
+ return await security.withoutAuthorization(async () => {
54
+ const date = new Date().toISOString();
55
+ const result = await manager.update(id, {
56
+ savedOn: date,
57
+ createdOn: date,
58
+ savedBy: identity,
59
+ createdBy: identity
60
+ });
61
+ return this.convert(result);
62
+ });
63
+ } catch (ex) {
64
+ throw new _error.WebinyError(`Could not update lock entry: ${ex.message}`, ex.code || "UPDATE_LOCK_ENTRY_ERROR", {
65
+ ...ex.data
66
+ });
67
+ }
68
+ }
69
+ async updateExistingLockRecord(record) {
28
70
  try {
29
71
  const manager = await this.getManager();
72
+ const security = this.getSecurity();
30
73
  const entryId = (0, _lockRecordDatabaseId.createLockRecordDatabaseId)(record.id);
31
74
  const id = (0, _utils.createIdentifier)({
32
75
  id: entryId,
33
76
  version: 1
34
77
  });
35
- const result = await manager.update(id, {
36
- savedOn: new Date().toISOString()
78
+ return await security.withoutAuthorization(async () => {
79
+ const result = await manager.update(id, {
80
+ savedOn: new Date().toISOString()
81
+ });
82
+ return this.convert(result);
37
83
  });
38
- return this.convert(result);
39
84
  } catch (ex) {
40
85
  throw new _error.WebinyError(`Could not update lock entry: ${ex.message}`, ex.code || "UPDATE_LOCK_ENTRY_ERROR", {
41
86
  ...ex.data
@@ -1 +1 @@
1
- {"version":3,"names":["_error","require","_lockRecordDatabaseId","_utils","_validateSameIdentity","UpdateEntryLockUseCase","constructor","params","getLockRecordUseCase","lockEntryUseCase","getManager","getIdentity","convert","execute","record","validateSameIdentity","target","lockedBy","manager","entryId","createLockRecordDatabaseId","id","createIdentifier","version","result","update","savedOn","Date","toISOString","ex","WebinyError","message","code","data","exports"],"sources":["UpdateEntryLockUseCase.ts"],"sourcesContent":["import type {\n IUpdateEntryLockUseCase,\n IUpdateEntryLockUseCaseExecuteParams\n} from \"~/abstractions/IUpdateEntryLockUseCase\";\nimport type { IGetIdentity, IRecordLockingLockRecord, IRecordLockingModelManager } from \"~/types\";\nimport type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { WebinyError } from \"@webiny/error\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport { validateSameIdentity } from \"~/utils/validateSameIdentity\";\nimport type { ILockEntryUseCase } from \"~/abstractions/ILockEntryUseCase\";\nimport type { ConvertEntryToLockRecordCb } from \"~/useCases/types\";\n\nexport interface IUpdateEntryLockUseCaseParams {\n readonly getLockRecordUseCase: IGetLockRecordUseCase;\n readonly lockEntryUseCase: ILockEntryUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n getIdentity: IGetIdentity;\n convert: ConvertEntryToLockRecordCb;\n}\n\nexport class UpdateEntryLockUseCase implements IUpdateEntryLockUseCase {\n private readonly getLockRecordUseCase: IGetLockRecordUseCase;\n private readonly lockEntryUseCase: ILockEntryUseCase;\n private readonly getManager: () => Promise<IRecordLockingModelManager>;\n private readonly getIdentity: IGetIdentity;\n private readonly convert: ConvertEntryToLockRecordCb;\n\n public constructor(params: IUpdateEntryLockUseCaseParams) {\n this.getLockRecordUseCase = params.getLockRecordUseCase;\n this.lockEntryUseCase = params.lockEntryUseCase;\n this.getManager = params.getManager;\n this.getIdentity = params.getIdentity;\n this.convert = params.convert;\n }\n\n public async execute(\n params: IUpdateEntryLockUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord> {\n const record = await this.getLockRecordUseCase.execute(params);\n if (!record) {\n return this.lockEntryUseCase.execute(params);\n }\n\n validateSameIdentity({\n getIdentity: this.getIdentity,\n target: record.lockedBy\n });\n\n try {\n const manager = await this.getManager();\n\n const entryId = createLockRecordDatabaseId(record.id);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n const result = await manager.update(id, {\n savedOn: new Date().toISOString()\n });\n return this.convert(result);\n } catch (ex) {\n throw new WebinyError(\n `Could not update lock entry: ${ex.message}`,\n ex.code || \"UPDATE_LOCK_ENTRY_ERROR\",\n {\n ...ex.data\n }\n );\n }\n }\n}\n"],"mappings":";;;;;;AAMA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,qBAAA,GAAAH,OAAA;AAYO,MAAMI,sBAAsB,CAAoC;EAO5DC,WAAWA,CAACC,MAAqC,EAAE;IACtD,IAAI,CAACC,oBAAoB,GAAGD,MAAM,CAACC,oBAAoB;IACvD,IAAI,CAACC,gBAAgB,GAAGF,MAAM,CAACE,gBAAgB;IAC/C,IAAI,CAACC,UAAU,GAAGH,MAAM,CAACG,UAAU;IACnC,IAAI,CAACC,WAAW,GAAGJ,MAAM,CAACI,WAAW;IACrC,IAAI,CAACC,OAAO,GAAGL,MAAM,CAACK,OAAO;EACjC;EAEA,MAAaC,OAAOA,CAChBN,MAA4C,EACX;IACjC,MAAMO,MAAM,GAAG,MAAM,IAAI,CAACN,oBAAoB,CAACK,OAAO,CAACN,MAAM,CAAC;IAC9D,IAAI,CAACO,MAAM,EAAE;MACT,OAAO,IAAI,CAACL,gBAAgB,CAACI,OAAO,CAACN,MAAM,CAAC;IAChD;IAEA,IAAAQ,0CAAoB,EAAC;MACjBJ,WAAW,EAAE,IAAI,CAACA,WAAW;MAC7BK,MAAM,EAAEF,MAAM,CAACG;IACnB,CAAC,CAAC;IAEF,IAAI;MACA,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACR,UAAU,CAAC,CAAC;MAEvC,MAAMS,OAAO,GAAG,IAAAC,gDAA0B,EAACN,MAAM,CAACO,EAAE,CAAC;MACrD,MAAMA,EAAE,GAAG,IAAAC,uBAAgB,EAAC;QACxBD,EAAE,EAAEF,OAAO;QACXI,OAAO,EAAE;MACb,CAAC,CAAC;MACF,MAAMC,MAAM,GAAG,MAAMN,OAAO,CAACO,MAAM,CAACJ,EAAE,EAAE;QACpCK,OAAO,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC;MACpC,CAAC,CAAC;MACF,OAAO,IAAI,CAAChB,OAAO,CAACY,MAAM,CAAC;IAC/B,CAAC,CAAC,OAAOK,EAAE,EAAE;MACT,MAAM,IAAIC,kBAAW,CACjB,gCAAgCD,EAAE,CAACE,OAAO,EAAE,EAC5CF,EAAE,CAACG,IAAI,IAAI,yBAAyB,EACpC;QACI,GAAGH,EAAE,CAACI;MACV,CACJ,CAAC;IACL;EACJ;AACJ;AAACC,OAAA,CAAA7B,sBAAA,GAAAA,sBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_error","require","_lockRecordDatabaseId","_utils","_validateSameIdentity","UpdateEntryLockUseCase","constructor","params","getLockRecordUseCase","lockEntryUseCase","getManager","getSecurity","getIdentity","convert","execute","record","isExpired","updateOverExistingLockRecord","validateSameIdentity","target","lockedBy","updateExistingLockRecord","manager","security","identity","entryId","createLockRecordDatabaseId","id","createIdentifier","version","withoutAuthorization","date","Date","toISOString","result","update","savedOn","createdOn","savedBy","createdBy","ex","WebinyError","message","code","data","exports"],"sources":["UpdateEntryLockUseCase.ts"],"sourcesContent":["import type {\n IUpdateEntryLockUseCase,\n IUpdateEntryLockUseCaseExecuteParams\n} from \"~/abstractions/IUpdateEntryLockUseCase\";\nimport type { IGetIdentity, IRecordLockingLockRecord, IRecordLockingModelManager } from \"~/types\";\nimport type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { WebinyError } from \"@webiny/error\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport { validateSameIdentity } from \"~/utils/validateSameIdentity\";\nimport type { ILockEntryUseCase } from \"~/abstractions/ILockEntryUseCase\";\nimport type { ConvertEntryToLockRecordCb } from \"~/useCases/types\";\nimport type { Security } from \"@webiny/api-security/types\";\n\nexport interface IUpdateEntryLockUseCaseParams {\n readonly getLockRecordUseCase: IGetLockRecordUseCase;\n readonly lockEntryUseCase: ILockEntryUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n getSecurity(): Pick<Security, \"withoutAuthorization\">;\n getIdentity: IGetIdentity;\n convert: ConvertEntryToLockRecordCb;\n}\n\nexport class UpdateEntryLockUseCase implements IUpdateEntryLockUseCase {\n private readonly getLockRecordUseCase: IGetLockRecordUseCase;\n private readonly lockEntryUseCase: ILockEntryUseCase;\n private readonly getManager: IUpdateEntryLockUseCaseParams[\"getManager\"];\n private readonly getSecurity: IUpdateEntryLockUseCaseParams[\"getSecurity\"];\n private readonly getIdentity: IGetIdentity;\n private readonly convert: ConvertEntryToLockRecordCb;\n\n public constructor(params: IUpdateEntryLockUseCaseParams) {\n this.getLockRecordUseCase = params.getLockRecordUseCase;\n this.lockEntryUseCase = params.lockEntryUseCase;\n this.getManager = params.getManager;\n this.getSecurity = params.getSecurity;\n this.getIdentity = params.getIdentity;\n this.convert = params.convert;\n }\n\n public async execute(\n params: IUpdateEntryLockUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord> {\n /**\n * There is a possibility that the lock record already exists, just that the entry is not actually locked - lock expired.\n */\n const record = await this.getLockRecordUseCase.execute(params);\n /**\n * If it exists, we will update the record with new user and dates.\n * But if it does not exist, we will create a new record.\n */\n if (!record) {\n return this.lockEntryUseCase.execute(params);\n } else if (record.isExpired()) {\n return this.updateOverExistingLockRecord(record);\n }\n /**\n * If the record exists and is not expired, we need to check if the user is the same as the one who locked it.\n */\n validateSameIdentity({\n getIdentity: this.getIdentity,\n target: record.lockedBy\n });\n return this.updateExistingLockRecord(record);\n }\n\n private async updateOverExistingLockRecord(\n record: Pick<IRecordLockingLockRecord, \"id\">\n ): Promise<IRecordLockingLockRecord> {\n try {\n const manager = await this.getManager();\n const security = this.getSecurity();\n const identity = this.getIdentity();\n\n const entryId = createLockRecordDatabaseId(record.id);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n return await security.withoutAuthorization(async () => {\n const date = new Date().toISOString();\n const result = await manager.update(id, {\n savedOn: date,\n createdOn: date,\n savedBy: identity,\n createdBy: identity\n });\n return this.convert(result);\n });\n } catch (ex) {\n throw new WebinyError(\n `Could not update lock entry: ${ex.message}`,\n ex.code || \"UPDATE_LOCK_ENTRY_ERROR\",\n {\n ...ex.data\n }\n );\n }\n }\n\n private async updateExistingLockRecord(\n record: Pick<IRecordLockingLockRecord, \"id\">\n ): Promise<IRecordLockingLockRecord> {\n try {\n const manager = await this.getManager();\n const security = this.getSecurity();\n\n const entryId = createLockRecordDatabaseId(record.id);\n const id = createIdentifier({\n id: entryId,\n version: 1\n });\n return await security.withoutAuthorization(async () => {\n const result = await manager.update(id, {\n savedOn: new Date().toISOString()\n });\n return this.convert(result);\n });\n } catch (ex) {\n throw new WebinyError(\n `Could not update lock entry: ${ex.message}`,\n ex.code || \"UPDATE_LOCK_ENTRY_ERROR\",\n {\n ...ex.data\n }\n );\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -8,10 +8,12 @@ import type { ILockEntryUseCase } from "../abstractions/ILockEntryUseCase";
8
8
  import type { IUpdateEntryLockUseCase } from "../abstractions/IUpdateEntryLockUseCase";
9
9
  import type { IUnlockEntryUseCase } from "../abstractions/IUnlockEntryUseCase";
10
10
  import type { IUnlockEntryRequestUseCase } from "../abstractions/IUnlockEntryRequestUseCase";
11
+ import type { Security } from "@webiny/api-security/types";
11
12
  export interface ICreateUseCasesParams {
12
13
  getTimeout: () => number;
13
14
  getIdentity: IGetIdentity;
14
15
  getManager(): Promise<IRecordLockingModelManager>;
16
+ getSecurity(): Pick<Security, "withoutAuthorization">;
15
17
  hasRecordLockingAccess: IHasRecordLockingAccessCallable;
16
18
  getWebsockets: IGetWebsocketsContextCallable;
17
19
  }
package/useCases/index.js CHANGED
@@ -11,7 +11,6 @@ var _UnlockEntryUseCase = require("./UnlockEntryUseCase/UnlockEntryUseCase");
11
11
  var _UnlockEntryRequestUseCase = require("./UnlockRequestUseCase/UnlockEntryRequestUseCase");
12
12
  var _ListAllLockRecordsUseCase = require("./ListAllLockRecordsUseCase/ListAllLockRecordsUseCase");
13
13
  var _ListLockRecordsUseCase = require("./ListLockRecordsUseCase/ListLockRecordsUseCase");
14
- var _isLockedFactory = require("../utils/isLockedFactory");
15
14
  var _UpdateEntryLockUseCase = require("./UpdateEntryLock/UpdateEntryLockUseCase");
16
15
  var _KickOutCurrentUserUseCase = require("./KickOutCurrentUser/KickOutCurrentUserUseCase");
17
16
  var _GetLockedEntryLockRecordUseCase = require("./GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase");
@@ -21,7 +20,6 @@ const createUseCases = params => {
21
20
  getTimeout
22
21
  } = params;
23
22
  const timeout = getTimeout();
24
- const isLocked = (0, _isLockedFactory.isLockedFactory)(timeout);
25
23
  const convertEntryToLockRecord = entry => {
26
24
  return (0, _convertEntryToLockRecord.convertEntryToLockRecord)(entry, timeout);
27
25
  };
@@ -36,27 +34,29 @@ const createUseCases = params => {
36
34
  });
37
35
  const getLockRecordUseCase = new _GetLockRecordUseCase.GetLockRecordUseCase({
38
36
  getManager: params.getManager,
37
+ getSecurity: params.getSecurity,
39
38
  convert: convertEntryToLockRecord
40
39
  });
41
40
  const isEntryLockedUseCase = new _IsEntryLockedUseCase.IsEntryLockedUseCase({
42
41
  getLockRecordUseCase,
43
- isLocked,
44
42
  getIdentity: params.getIdentity
45
43
  });
46
44
  const getLockedEntryLockRecordUseCase = new _GetLockedEntryLockRecordUseCase.GetLockedEntryLockRecordUseCase({
47
45
  getLockRecordUseCase,
48
- isLocked,
49
46
  getIdentity: params.getIdentity
50
47
  });
51
48
  const lockEntryUseCase = new _LockEntryUseCase.LockEntryUseCase({
52
49
  isEntryLockedUseCase,
53
50
  getManager: params.getManager,
51
+ getSecurity: params.getSecurity,
52
+ getIdentity: params.getIdentity,
54
53
  convert: convertEntryToLockRecord
55
54
  });
56
55
  const updateEntryLockUseCase = new _UpdateEntryLockUseCase.UpdateEntryLockUseCase({
57
56
  getLockRecordUseCase,
58
57
  lockEntryUseCase,
59
58
  getManager: params.getManager,
59
+ getSecurity: params.getSecurity,
60
60
  getIdentity: params.getIdentity,
61
61
  convert: convertEntryToLockRecord
62
62
  });
@@ -68,12 +68,14 @@ const createUseCases = params => {
68
68
  getLockRecordUseCase,
69
69
  kickOutCurrentUserUseCase,
70
70
  getManager: params.getManager,
71
+ getSecurity: params.getSecurity,
71
72
  getIdentity: params.getIdentity,
72
73
  hasRecordLockingAccess: params.hasRecordLockingAccess
73
74
  });
74
75
  const unlockEntryRequestUseCase = new _UnlockEntryRequestUseCase.UnlockEntryRequestUseCase({
75
76
  getLockRecordUseCase,
76
77
  getIdentity: params.getIdentity,
78
+ getSecurity: params.getSecurity,
77
79
  getManager: params.getManager,
78
80
  convert: convertEntryToLockRecord
79
81
  });
@@ -1 +1 @@
1
- {"version":3,"names":["_GetLockRecordUseCase","require","_IsEntryLockedUseCase","_LockEntryUseCase","_UnlockEntryUseCase","_UnlockEntryRequestUseCase","_ListAllLockRecordsUseCase","_ListLockRecordsUseCase","_isLockedFactory","_UpdateEntryLockUseCase","_KickOutCurrentUserUseCase","_GetLockedEntryLockRecordUseCase","_convertEntryToLockRecord","createUseCases","params","getTimeout","timeout","isLocked","isLockedFactory","convertEntryToLockRecord","entry","baseConvertEntryToLockRecord","listAllLockRecordsUseCase","ListAllLockRecordsUseCase","getManager","convert","listLockRecordsUseCase","ListLockRecordsUseCase","getIdentity","getLockRecordUseCase","GetLockRecordUseCase","isEntryLockedUseCase","IsEntryLockedUseCase","getLockedEntryLockRecordUseCase","GetLockedEntryLockRecordUseCase","lockEntryUseCase","LockEntryUseCase","updateEntryLockUseCase","UpdateEntryLockUseCase","kickOutCurrentUserUseCase","KickOutCurrentUserUseCase","getWebsockets","unlockEntryUseCase","UnlockEntryUseCase","hasRecordLockingAccess","unlockEntryRequestUseCase","UnlockEntryRequestUseCase","exports"],"sources":["index.ts"],"sourcesContent":["import type {\n IGetIdentity,\n IGetWebsocketsContextCallable,\n IHasRecordLockingAccessCallable,\n IRecordLockingModelManager\n} from \"~/types\";\nimport { GetLockRecordUseCase } from \"./GetLockRecord/GetLockRecordUseCase\";\nimport { IsEntryLockedUseCase } from \"./IsEntryLocked/IsEntryLockedUseCase\";\nimport { LockEntryUseCase } from \"./LockEntryUseCase/LockEntryUseCase\";\nimport { UnlockEntryUseCase } from \"./UnlockEntryUseCase/UnlockEntryUseCase\";\nimport { UnlockEntryRequestUseCase } from \"./UnlockRequestUseCase/UnlockEntryRequestUseCase\";\nimport { ListAllLockRecordsUseCase } from \"./ListAllLockRecordsUseCase/ListAllLockRecordsUseCase\";\nimport { ListLockRecordsUseCase } from \"./ListLockRecordsUseCase/ListLockRecordsUseCase\";\nimport { isLockedFactory } from \"~/utils/isLockedFactory\";\nimport { UpdateEntryLockUseCase } from \"~/useCases/UpdateEntryLock/UpdateEntryLockUseCase\";\nimport { KickOutCurrentUserUseCase } from \"./KickOutCurrentUser/KickOutCurrentUserUseCase\";\nimport { GetLockedEntryLockRecordUseCase } from \"~/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase\";\nimport type { IListAllLockRecordsUseCase } from \"~/abstractions/IListAllLockRecordsUseCase\";\nimport type { IListLockRecordsUseCase } from \"~/abstractions/IListLockRecordsUseCase\";\nimport type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport type { IIsEntryLockedUseCase } from \"~/abstractions/IIsEntryLocked\";\nimport type { IGetLockedEntryLockRecordUseCase } from \"~/abstractions/IGetLockedEntryLockRecordUseCase\";\nimport type { ILockEntryUseCase } from \"~/abstractions/ILockEntryUseCase\";\nimport type { IUpdateEntryLockUseCase } from \"~/abstractions/IUpdateEntryLockUseCase\";\nimport type { IUnlockEntryUseCase } from \"~/abstractions/IUnlockEntryUseCase\";\nimport type { IUnlockEntryRequestUseCase } from \"~/abstractions/IUnlockEntryRequestUseCase\";\nimport { convertEntryToLockRecord as baseConvertEntryToLockRecord } from \"~/utils/convertEntryToLockRecord\";\nimport { ConvertEntryToLockRecordCb } from \"~/useCases/types\";\n\nexport interface ICreateUseCasesParams {\n getTimeout: () => number;\n getIdentity: IGetIdentity;\n getManager(): Promise<IRecordLockingModelManager>;\n hasRecordLockingAccess: IHasRecordLockingAccessCallable;\n getWebsockets: IGetWebsocketsContextCallable;\n}\n\nexport interface ICreateUseCasesResponse {\n listAllLockRecordsUseCase: IListAllLockRecordsUseCase;\n listLockRecordsUseCase: IListLockRecordsUseCase;\n getLockRecordUseCase: IGetLockRecordUseCase;\n isEntryLockedUseCase: IIsEntryLockedUseCase;\n getLockedEntryLockRecordUseCase: IGetLockedEntryLockRecordUseCase;\n lockEntryUseCase: ILockEntryUseCase;\n updateEntryLockUseCase: IUpdateEntryLockUseCase;\n unlockEntryUseCase: IUnlockEntryUseCase;\n unlockEntryRequestUseCase: IUnlockEntryRequestUseCase;\n}\n\nexport const createUseCases = (params: ICreateUseCasesParams): ICreateUseCasesResponse => {\n const { getTimeout } = params;\n const timeout = getTimeout();\n const isLocked = isLockedFactory(timeout);\n\n const convertEntryToLockRecord: ConvertEntryToLockRecordCb = entry => {\n return baseConvertEntryToLockRecord(entry, timeout);\n };\n\n const listAllLockRecordsUseCase = new ListAllLockRecordsUseCase({\n getManager: params.getManager,\n convert: convertEntryToLockRecord\n });\n\n const listLockRecordsUseCase = new ListLockRecordsUseCase({\n listAllLockRecordsUseCase,\n timeout,\n getIdentity: params.getIdentity\n });\n\n const getLockRecordUseCase = new GetLockRecordUseCase({\n getManager: params.getManager,\n convert: convertEntryToLockRecord\n });\n\n const isEntryLockedUseCase = new IsEntryLockedUseCase({\n getLockRecordUseCase,\n isLocked,\n getIdentity: params.getIdentity\n });\n\n const getLockedEntryLockRecordUseCase = new GetLockedEntryLockRecordUseCase({\n getLockRecordUseCase,\n isLocked,\n getIdentity: params.getIdentity\n });\n\n const lockEntryUseCase = new LockEntryUseCase({\n isEntryLockedUseCase,\n getManager: params.getManager,\n convert: convertEntryToLockRecord\n });\n\n const updateEntryLockUseCase = new UpdateEntryLockUseCase({\n getLockRecordUseCase,\n lockEntryUseCase,\n getManager: params.getManager,\n getIdentity: params.getIdentity,\n convert: convertEntryToLockRecord\n });\n\n const kickOutCurrentUserUseCase = new KickOutCurrentUserUseCase({\n getWebsockets: params.getWebsockets,\n getIdentity: params.getIdentity\n });\n\n const unlockEntryUseCase = new UnlockEntryUseCase({\n getLockRecordUseCase,\n kickOutCurrentUserUseCase,\n getManager: params.getManager,\n getIdentity: params.getIdentity,\n hasRecordLockingAccess: params.hasRecordLockingAccess\n });\n\n const unlockEntryRequestUseCase = new UnlockEntryRequestUseCase({\n getLockRecordUseCase,\n getIdentity: params.getIdentity,\n getManager: params.getManager,\n convert: convertEntryToLockRecord\n });\n\n return {\n listAllLockRecordsUseCase,\n listLockRecordsUseCase,\n getLockRecordUseCase,\n isEntryLockedUseCase,\n getLockedEntryLockRecordUseCase,\n lockEntryUseCase,\n updateEntryLockUseCase,\n unlockEntryUseCase,\n unlockEntryRequestUseCase\n };\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_GetLockRecordUseCase","require","_IsEntryLockedUseCase","_LockEntryUseCase","_UnlockEntryUseCase","_UnlockEntryRequestUseCase","_ListAllLockRecordsUseCase","_ListLockRecordsUseCase","_UpdateEntryLockUseCase","_KickOutCurrentUserUseCase","_GetLockedEntryLockRecordUseCase","_convertEntryToLockRecord","createUseCases","params","getTimeout","timeout","convertEntryToLockRecord","entry","baseConvertEntryToLockRecord","listAllLockRecordsUseCase","ListAllLockRecordsUseCase","getManager","convert","listLockRecordsUseCase","ListLockRecordsUseCase","getIdentity","getLockRecordUseCase","GetLockRecordUseCase","getSecurity","isEntryLockedUseCase","IsEntryLockedUseCase","getLockedEntryLockRecordUseCase","GetLockedEntryLockRecordUseCase","lockEntryUseCase","LockEntryUseCase","updateEntryLockUseCase","UpdateEntryLockUseCase","kickOutCurrentUserUseCase","KickOutCurrentUserUseCase","getWebsockets","unlockEntryUseCase","UnlockEntryUseCase","hasRecordLockingAccess","unlockEntryRequestUseCase","UnlockEntryRequestUseCase","exports"],"sources":["index.ts"],"sourcesContent":["import type {\n IGetIdentity,\n IGetWebsocketsContextCallable,\n IHasRecordLockingAccessCallable,\n IRecordLockingModelManager\n} from \"~/types\";\nimport { GetLockRecordUseCase } from \"./GetLockRecord/GetLockRecordUseCase\";\nimport { IsEntryLockedUseCase } from \"./IsEntryLocked/IsEntryLockedUseCase\";\nimport { LockEntryUseCase } from \"./LockEntryUseCase/LockEntryUseCase\";\nimport { UnlockEntryUseCase } from \"./UnlockEntryUseCase/UnlockEntryUseCase\";\nimport { UnlockEntryRequestUseCase } from \"./UnlockRequestUseCase/UnlockEntryRequestUseCase\";\nimport { ListAllLockRecordsUseCase } from \"./ListAllLockRecordsUseCase/ListAllLockRecordsUseCase\";\nimport { ListLockRecordsUseCase } from \"./ListLockRecordsUseCase/ListLockRecordsUseCase\";\nimport { UpdateEntryLockUseCase } from \"~/useCases/UpdateEntryLock/UpdateEntryLockUseCase\";\nimport { KickOutCurrentUserUseCase } from \"./KickOutCurrentUser/KickOutCurrentUserUseCase\";\nimport { GetLockedEntryLockRecordUseCase } from \"~/useCases/GetLockedEntryLockRecord/GetLockedEntryLockRecordUseCase\";\nimport type { IListAllLockRecordsUseCase } from \"~/abstractions/IListAllLockRecordsUseCase\";\nimport type { IListLockRecordsUseCase } from \"~/abstractions/IListLockRecordsUseCase\";\nimport type { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport type { IIsEntryLockedUseCase } from \"~/abstractions/IIsEntryLocked\";\nimport type { IGetLockedEntryLockRecordUseCase } from \"~/abstractions/IGetLockedEntryLockRecordUseCase\";\nimport type { ILockEntryUseCase } from \"~/abstractions/ILockEntryUseCase\";\nimport type { IUpdateEntryLockUseCase } from \"~/abstractions/IUpdateEntryLockUseCase\";\nimport type { IUnlockEntryUseCase } from \"~/abstractions/IUnlockEntryUseCase\";\nimport type { IUnlockEntryRequestUseCase } from \"~/abstractions/IUnlockEntryRequestUseCase\";\nimport { convertEntryToLockRecord as baseConvertEntryToLockRecord } from \"~/utils/convertEntryToLockRecord\";\nimport { ConvertEntryToLockRecordCb } from \"~/useCases/types\";\nimport type { Security } from \"@webiny/api-security/types\";\n\nexport interface ICreateUseCasesParams {\n getTimeout: () => number;\n getIdentity: IGetIdentity;\n getManager(): Promise<IRecordLockingModelManager>;\n getSecurity(): Pick<Security, \"withoutAuthorization\">;\n hasRecordLockingAccess: IHasRecordLockingAccessCallable;\n getWebsockets: IGetWebsocketsContextCallable;\n}\n\nexport interface ICreateUseCasesResponse {\n listAllLockRecordsUseCase: IListAllLockRecordsUseCase;\n listLockRecordsUseCase: IListLockRecordsUseCase;\n getLockRecordUseCase: IGetLockRecordUseCase;\n isEntryLockedUseCase: IIsEntryLockedUseCase;\n getLockedEntryLockRecordUseCase: IGetLockedEntryLockRecordUseCase;\n lockEntryUseCase: ILockEntryUseCase;\n updateEntryLockUseCase: IUpdateEntryLockUseCase;\n unlockEntryUseCase: IUnlockEntryUseCase;\n unlockEntryRequestUseCase: IUnlockEntryRequestUseCase;\n}\n\nexport const createUseCases = (params: ICreateUseCasesParams): ICreateUseCasesResponse => {\n const { getTimeout } = params;\n const timeout = getTimeout();\n\n const convertEntryToLockRecord: ConvertEntryToLockRecordCb = entry => {\n return baseConvertEntryToLockRecord(entry, timeout);\n };\n\n const listAllLockRecordsUseCase = new ListAllLockRecordsUseCase({\n getManager: params.getManager,\n convert: convertEntryToLockRecord\n });\n\n const listLockRecordsUseCase = new ListLockRecordsUseCase({\n listAllLockRecordsUseCase,\n timeout,\n getIdentity: params.getIdentity\n });\n\n const getLockRecordUseCase = new GetLockRecordUseCase({\n getManager: params.getManager,\n getSecurity: params.getSecurity,\n convert: convertEntryToLockRecord\n });\n\n const isEntryLockedUseCase = new IsEntryLockedUseCase({\n getLockRecordUseCase,\n getIdentity: params.getIdentity\n });\n\n const getLockedEntryLockRecordUseCase = new GetLockedEntryLockRecordUseCase({\n getLockRecordUseCase,\n getIdentity: params.getIdentity\n });\n\n const lockEntryUseCase = new LockEntryUseCase({\n isEntryLockedUseCase,\n getManager: params.getManager,\n getSecurity: params.getSecurity,\n getIdentity: params.getIdentity,\n convert: convertEntryToLockRecord\n });\n\n const updateEntryLockUseCase = new UpdateEntryLockUseCase({\n getLockRecordUseCase,\n lockEntryUseCase,\n getManager: params.getManager,\n getSecurity: params.getSecurity,\n getIdentity: params.getIdentity,\n convert: convertEntryToLockRecord\n });\n\n const kickOutCurrentUserUseCase = new KickOutCurrentUserUseCase({\n getWebsockets: params.getWebsockets,\n getIdentity: params.getIdentity\n });\n\n const unlockEntryUseCase = new UnlockEntryUseCase({\n getLockRecordUseCase,\n kickOutCurrentUserUseCase,\n getManager: params.getManager,\n getSecurity: params.getSecurity,\n getIdentity: params.getIdentity,\n hasRecordLockingAccess: params.hasRecordLockingAccess\n });\n\n const unlockEntryRequestUseCase = new UnlockEntryRequestUseCase({\n getLockRecordUseCase,\n getIdentity: params.getIdentity,\n getSecurity: params.getSecurity,\n getManager: params.getManager,\n convert: convertEntryToLockRecord\n });\n\n return {\n listAllLockRecordsUseCase,\n listLockRecordsUseCase,\n getLockRecordUseCase,\n isEntryLockedUseCase,\n getLockedEntryLockRecordUseCase,\n lockEntryUseCase,\n updateEntryLockUseCase,\n unlockEntryUseCase,\n unlockEntryRequestUseCase\n };\n};\n"],"mappings":";;;;;;AAMA,IAAAA,qBAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AACA,IAAAG,mBAAA,GAAAH,OAAA;AACA,IAAAI,0BAAA,GAAAJ,OAAA;AACA,IAAAK,0BAAA,GAAAL,OAAA;AACA,IAAAM,uBAAA,GAAAN,OAAA;AACA,IAAAO,uBAAA,GAAAP,OAAA;AACA,IAAAQ,0BAAA,GAAAR,OAAA;AACA,IAAAS,gCAAA,GAAAT,OAAA;AAUA,IAAAU,yBAAA,GAAAV,OAAA;AAyBO,MAAMW,cAAc,GAAIC,MAA6B,IAA8B;EACtF,MAAM;IAAEC;EAAW,CAAC,GAAGD,MAAM;EAC7B,MAAME,OAAO,GAAGD,UAAU,CAAC,CAAC;EAE5B,MAAME,wBAAoD,GAAGC,KAAK,IAAI;IAClE,OAAO,IAAAC,kDAA4B,EAACD,KAAK,EAAEF,OAAO,CAAC;EACvD,CAAC;EAED,MAAMI,yBAAyB,GAAG,IAAIC,oDAAyB,CAAC;IAC5DC,UAAU,EAAER,MAAM,CAACQ,UAAU;IAC7BC,OAAO,EAAEN;EACb,CAAC,CAAC;EAEF,MAAMO,sBAAsB,GAAG,IAAIC,8CAAsB,CAAC;IACtDL,yBAAyB;IACzBJ,OAAO;IACPU,WAAW,EAAEZ,MAAM,CAACY;EACxB,CAAC,CAAC;EAEF,MAAMC,oBAAoB,GAAG,IAAIC,0CAAoB,CAAC;IAClDN,UAAU,EAAER,MAAM,CAACQ,UAAU;IAC7BO,WAAW,EAAEf,MAAM,CAACe,WAAW;IAC/BN,OAAO,EAAEN;EACb,CAAC,CAAC;EAEF,MAAMa,oBAAoB,GAAG,IAAIC,0CAAoB,CAAC;IAClDJ,oBAAoB;IACpBD,WAAW,EAAEZ,MAAM,CAACY;EACxB,CAAC,CAAC;EAEF,MAAMM,+BAA+B,GAAG,IAAIC,gEAA+B,CAAC;IACxEN,oBAAoB;IACpBD,WAAW,EAAEZ,MAAM,CAACY;EACxB,CAAC,CAAC;EAEF,MAAMQ,gBAAgB,GAAG,IAAIC,kCAAgB,CAAC;IAC1CL,oBAAoB;IACpBR,UAAU,EAAER,MAAM,CAACQ,UAAU;IAC7BO,WAAW,EAAEf,MAAM,CAACe,WAAW;IAC/BH,WAAW,EAAEZ,MAAM,CAACY,WAAW;IAC/BH,OAAO,EAAEN;EACb,CAAC,CAAC;EAEF,MAAMmB,sBAAsB,GAAG,IAAIC,8CAAsB,CAAC;IACtDV,oBAAoB;IACpBO,gBAAgB;IAChBZ,UAAU,EAAER,MAAM,CAACQ,UAAU;IAC7BO,WAAW,EAAEf,MAAM,CAACe,WAAW;IAC/BH,WAAW,EAAEZ,MAAM,CAACY,WAAW;IAC/BH,OAAO,EAAEN;EACb,CAAC,CAAC;EAEF,MAAMqB,yBAAyB,GAAG,IAAIC,oDAAyB,CAAC;IAC5DC,aAAa,EAAE1B,MAAM,CAAC0B,aAAa;IACnCd,WAAW,EAAEZ,MAAM,CAACY;EACxB,CAAC,CAAC;EAEF,MAAMe,kBAAkB,GAAG,IAAIC,sCAAkB,CAAC;IAC9Cf,oBAAoB;IACpBW,yBAAyB;IACzBhB,UAAU,EAAER,MAAM,CAACQ,UAAU;IAC7BO,WAAW,EAAEf,MAAM,CAACe,WAAW;IAC/BH,WAAW,EAAEZ,MAAM,CAACY,WAAW;IAC/BiB,sBAAsB,EAAE7B,MAAM,CAAC6B;EACnC,CAAC,CAAC;EAEF,MAAMC,yBAAyB,GAAG,IAAIC,oDAAyB,CAAC;IAC5DlB,oBAAoB;IACpBD,WAAW,EAAEZ,MAAM,CAACY,WAAW;IAC/BG,WAAW,EAAEf,MAAM,CAACe,WAAW;IAC/BP,UAAU,EAAER,MAAM,CAACQ,UAAU;IAC7BC,OAAO,EAAEN;EACb,CAAC,CAAC;EAEF,OAAO;IACHG,yBAAyB;IACzBI,sBAAsB;IACtBG,oBAAoB;IACpBG,oBAAoB;IACpBE,+BAA+B;IAC/BE,gBAAgB;IAChBE,sBAAsB;IACtBK,kBAAkB;IAClBG;EACJ,CAAC;AACL,CAAC;AAACE,OAAA,CAAAjC,cAAA,GAAAA,cAAA","ignoreList":[]}
@@ -5,6 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.calculateExpiresOn = void 0;
7
7
  const calculateExpiresOn = (input, timeout) => {
8
+ if (!input.savedOn) {
9
+ throw new Error("Missing savedOn property.");
10
+ }
8
11
  const savedOn = new Date(input.savedOn);
9
12
  return new Date(savedOn.getTime() + timeout);
10
13
  };
@@ -1 +1 @@
1
- {"version":3,"names":["calculateExpiresOn","input","timeout","savedOn","Date","getTime","exports"],"sources":["calculateExpiresOn.ts"],"sourcesContent":["import { IHeadlessCmsLockRecordParams } from \"./convertEntryToLockRecord\";\n\nexport const calculateExpiresOn = (\n input: Pick<IHeadlessCmsLockRecordParams, \"savedOn\">,\n timeout: number\n): Date => {\n const savedOn = new Date(input.savedOn);\n\n return new Date(savedOn.getTime() + timeout);\n};\n"],"mappings":";;;;;;AAEO,MAAMA,kBAAkB,GAAGA,CAC9BC,KAAoD,EACpDC,OAAe,KACR;EACP,MAAMC,OAAO,GAAG,IAAIC,IAAI,CAACH,KAAK,CAACE,OAAO,CAAC;EAEvC,OAAO,IAAIC,IAAI,CAACD,OAAO,CAACE,OAAO,CAAC,CAAC,GAAGH,OAAO,CAAC;AAChD,CAAC;AAACI,OAAA,CAAAN,kBAAA,GAAAA,kBAAA","ignoreList":[]}
1
+ {"version":3,"names":["calculateExpiresOn","input","timeout","savedOn","Error","Date","getTime","exports"],"sources":["calculateExpiresOn.ts"],"sourcesContent":["import { IHeadlessCmsLockRecordParams } from \"./convertEntryToLockRecord\";\n\nexport const calculateExpiresOn = (\n input: Pick<IHeadlessCmsLockRecordParams, \"savedOn\">,\n timeout: number\n): Date => {\n if (!input.savedOn) {\n throw new Error(\"Missing savedOn property.\");\n }\n const savedOn = new Date(input.savedOn);\n\n return new Date(savedOn.getTime() + timeout);\n};\n"],"mappings":";;;;;;AAEO,MAAMA,kBAAkB,GAAGA,CAC9BC,KAAoD,EACpDC,OAAe,KACR;EACP,IAAI,CAACD,KAAK,CAACE,OAAO,EAAE;IAChB,MAAM,IAAIC,KAAK,CAAC,2BAA2B,CAAC;EAChD;EACA,MAAMD,OAAO,GAAG,IAAIE,IAAI,CAACJ,KAAK,CAACE,OAAO,CAAC;EAEvC,OAAO,IAAIE,IAAI,CAACF,OAAO,CAACG,OAAO,CAAC,CAAC,GAAGJ,OAAO,CAAC;AAChD,CAAC;AAACK,OAAA,CAAAP,kBAAA,GAAAA,kBAAA","ignoreList":[]}
@@ -24,4 +24,5 @@ export declare class HeadlessCmsLockRecord implements IRecordLockingLockRecord {
24
24
  getUnlockRequested(): IRecordLockingLockRecordRequestedAction | undefined;
25
25
  getUnlockApproved(): IRecordLockingLockRecordApprovedAction | undefined;
26
26
  getUnlockDenied(): IRecordLockingLockRecordDeniedAction | undefined;
27
+ isExpired(): boolean;
27
28
  }
@@ -82,6 +82,9 @@ class HeadlessCmsLockRecord {
82
82
  }
83
83
  return this._actions.find(action => action.type === _types.RecordLockingLockRecordActionType.denied);
84
84
  }
85
+ isExpired() {
86
+ return this._expiresOn.getTime() < new Date().getTime();
87
+ }
85
88
  }
86
89
  exports.HeadlessCmsLockRecord = HeadlessCmsLockRecord;
87
90
 
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_lockRecordDatabaseId","_calculateExpiresOn","convertEntryToLockRecord","entry","timeout","HeadlessCmsLockRecord","exports","id","_id","targetId","_targetId","type","_type","lockedBy","_lockedBy","lockedOn","_lockedOn","updatedOn","_updatedOn","expiresOn","_expiresOn","actions","_actions","constructor","input","removeLockRecordDatabasePrefix","entryId","values","createdBy","Date","createdOn","savedOn","calculateExpiresOn","toObject","addAction","action","push","getUnlockRequested","length","undefined","find","RecordLockingLockRecordActionType","requested","getUnlockApproved","approved","getUnlockDenied","denied"],"sources":["convertEntryToLockRecord.ts"],"sourcesContent":["import type {\n CmsEntry,\n IRecordLockingIdentity,\n IRecordLockingLockRecord,\n IRecordLockingLockRecordAction,\n IRecordLockingLockRecordApprovedAction,\n IRecordLockingLockRecordDeniedAction,\n IRecordLockingLockRecordEntryType,\n IRecordLockingLockRecordObject,\n IRecordLockingLockRecordRequestedAction,\n IRecordLockingLockRecordValues\n} from \"~/types\";\nimport { RecordLockingLockRecordActionType } from \"~/types\";\nimport { removeLockRecordDatabasePrefix } from \"~/utils/lockRecordDatabaseId\";\nimport { calculateExpiresOn } from \"~/utils/calculateExpiresOn\";\n\nexport const convertEntryToLockRecord = (\n entry: CmsEntry<IRecordLockingLockRecordValues>,\n timeout: number\n): IRecordLockingLockRecord => {\n return new HeadlessCmsLockRecord(entry, timeout);\n};\n\nexport type IHeadlessCmsLockRecordParams = Pick<\n CmsEntry<IRecordLockingLockRecordValues>,\n \"entryId\" | \"values\" | \"createdBy\" | \"createdOn\" | \"savedOn\"\n>;\n\nexport class HeadlessCmsLockRecord implements IRecordLockingLockRecord {\n private readonly _id: string;\n private readonly _targetId: string;\n private readonly _type: IRecordLockingLockRecordEntryType;\n private readonly _lockedBy: IRecordLockingIdentity;\n private readonly _lockedOn: Date;\n private readonly _updatedOn: Date;\n private readonly _expiresOn: Date;\n private _actions?: IRecordLockingLockRecordAction[];\n\n public get id(): string {\n return this._id;\n }\n\n public get targetId(): string {\n return this._targetId;\n }\n\n public get type(): IRecordLockingLockRecordEntryType {\n return this._type;\n }\n\n public get lockedBy(): IRecordLockingIdentity {\n return this._lockedBy;\n }\n\n public get lockedOn(): Date {\n return this._lockedOn;\n }\n\n public get updatedOn(): Date {\n return this._updatedOn;\n }\n\n public get expiresOn(): Date {\n return this._expiresOn;\n }\n\n public get actions(): IRecordLockingLockRecordAction[] | undefined {\n return this._actions;\n }\n\n public constructor(input: IHeadlessCmsLockRecordParams, timeout: number) {\n this._id = removeLockRecordDatabasePrefix(input.entryId);\n this._targetId = input.values.targetId;\n this._type = input.values.type;\n this._lockedBy = input.createdBy;\n this._lockedOn = new Date(input.createdOn);\n this._updatedOn = new Date(input.savedOn);\n this._expiresOn = calculateExpiresOn(input, timeout);\n this._actions = input.values.actions;\n }\n\n public toObject(): IRecordLockingLockRecordObject {\n return {\n id: this._id,\n targetId: this._targetId,\n type: this._type,\n lockedBy: this._lockedBy,\n lockedOn: this._lockedOn,\n updatedOn: this._updatedOn,\n expiresOn: this._expiresOn,\n actions: this._actions\n };\n }\n\n public addAction(action: IRecordLockingLockRecordAction) {\n if (!this._actions) {\n this._actions = [];\n }\n this._actions.push(action);\n }\n\n public getUnlockRequested(): IRecordLockingLockRecordRequestedAction | undefined {\n if (!this._actions?.length) {\n return undefined;\n }\n return this._actions.find(\n (action): action is IRecordLockingLockRecordRequestedAction =>\n action.type === RecordLockingLockRecordActionType.requested\n );\n }\n\n public getUnlockApproved(): IRecordLockingLockRecordApprovedAction | undefined {\n if (!this._actions?.length) {\n return undefined;\n }\n return this._actions.find(\n (action): action is IRecordLockingLockRecordApprovedAction =>\n action.type === RecordLockingLockRecordActionType.approved\n );\n }\n\n public getUnlockDenied(): IRecordLockingLockRecordDeniedAction | undefined {\n if (!this._actions?.length) {\n return undefined;\n }\n return this._actions.find(\n (action): action is IRecordLockingLockRecordDeniedAction =>\n action.type === RecordLockingLockRecordActionType.denied\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","_lockRecordDatabaseId","_calculateExpiresOn","convertEntryToLockRecord","entry","timeout","HeadlessCmsLockRecord","exports","id","_id","targetId","_targetId","type","_type","lockedBy","_lockedBy","lockedOn","_lockedOn","updatedOn","_updatedOn","expiresOn","_expiresOn","actions","_actions","constructor","input","removeLockRecordDatabasePrefix","entryId","values","createdBy","Date","createdOn","savedOn","calculateExpiresOn","toObject","addAction","action","push","getUnlockRequested","length","undefined","find","RecordLockingLockRecordActionType","requested","getUnlockApproved","approved","getUnlockDenied","denied","isExpired","getTime"],"sources":["convertEntryToLockRecord.ts"],"sourcesContent":["import type {\n CmsEntry,\n IRecordLockingIdentity,\n IRecordLockingLockRecord,\n IRecordLockingLockRecordAction,\n IRecordLockingLockRecordApprovedAction,\n IRecordLockingLockRecordDeniedAction,\n IRecordLockingLockRecordEntryType,\n IRecordLockingLockRecordObject,\n IRecordLockingLockRecordRequestedAction,\n IRecordLockingLockRecordValues\n} from \"~/types\";\nimport { RecordLockingLockRecordActionType } from \"~/types\";\nimport { removeLockRecordDatabasePrefix } from \"~/utils/lockRecordDatabaseId\";\nimport { calculateExpiresOn } from \"~/utils/calculateExpiresOn\";\n\nexport const convertEntryToLockRecord = (\n entry: CmsEntry<IRecordLockingLockRecordValues>,\n timeout: number\n): IRecordLockingLockRecord => {\n return new HeadlessCmsLockRecord(entry, timeout);\n};\n\nexport type IHeadlessCmsLockRecordParams = Pick<\n CmsEntry<IRecordLockingLockRecordValues>,\n \"entryId\" | \"values\" | \"createdBy\" | \"createdOn\" | \"savedOn\"\n>;\n\nexport class HeadlessCmsLockRecord implements IRecordLockingLockRecord {\n private readonly _id: string;\n private readonly _targetId: string;\n private readonly _type: IRecordLockingLockRecordEntryType;\n private readonly _lockedBy: IRecordLockingIdentity;\n private readonly _lockedOn: Date;\n private readonly _updatedOn: Date;\n private readonly _expiresOn: Date;\n private _actions?: IRecordLockingLockRecordAction[];\n\n public get id(): string {\n return this._id;\n }\n\n public get targetId(): string {\n return this._targetId;\n }\n\n public get type(): IRecordLockingLockRecordEntryType {\n return this._type;\n }\n\n public get lockedBy(): IRecordLockingIdentity {\n return this._lockedBy;\n }\n\n public get lockedOn(): Date {\n return this._lockedOn;\n }\n\n public get updatedOn(): Date {\n return this._updatedOn;\n }\n\n public get expiresOn(): Date {\n return this._expiresOn;\n }\n\n public get actions(): IRecordLockingLockRecordAction[] | undefined {\n return this._actions;\n }\n\n public constructor(input: IHeadlessCmsLockRecordParams, timeout: number) {\n this._id = removeLockRecordDatabasePrefix(input.entryId);\n this._targetId = input.values.targetId;\n this._type = input.values.type;\n this._lockedBy = input.createdBy;\n this._lockedOn = new Date(input.createdOn);\n this._updatedOn = new Date(input.savedOn);\n this._expiresOn = calculateExpiresOn(input, timeout);\n this._actions = input.values.actions;\n }\n\n public toObject(): IRecordLockingLockRecordObject {\n return {\n id: this._id,\n targetId: this._targetId,\n type: this._type,\n lockedBy: this._lockedBy,\n lockedOn: this._lockedOn,\n updatedOn: this._updatedOn,\n expiresOn: this._expiresOn,\n actions: this._actions\n };\n }\n\n public addAction(action: IRecordLockingLockRecordAction) {\n if (!this._actions) {\n this._actions = [];\n }\n this._actions.push(action);\n }\n\n public getUnlockRequested(): IRecordLockingLockRecordRequestedAction | undefined {\n if (!this._actions?.length) {\n return undefined;\n }\n return this._actions.find(\n (action): action is IRecordLockingLockRecordRequestedAction =>\n action.type === RecordLockingLockRecordActionType.requested\n );\n }\n\n public getUnlockApproved(): IRecordLockingLockRecordApprovedAction | undefined {\n if (!this._actions?.length) {\n return undefined;\n }\n return this._actions.find(\n (action): action is IRecordLockingLockRecordApprovedAction =>\n action.type === RecordLockingLockRecordActionType.approved\n );\n }\n\n public getUnlockDenied(): IRecordLockingLockRecordDeniedAction | undefined {\n if (!this._actions?.length) {\n return undefined;\n }\n return this._actions.find(\n (action): action is IRecordLockingLockRecordDeniedAction =>\n action.type === RecordLockingLockRecordActionType.denied\n );\n }\n\n public isExpired(): boolean {\n return this._expiresOn.getTime() < new Date().getTime();\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -4,13 +4,17 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getTimeout = void 0;
7
- const defaultTimeoutInSeconds = 1800;
7
+ const minTimeoutInSeconds = 30;
8
+ const defaultTimeoutInSeconds = 60;
8
9
  /**
9
10
  * Input is in seconds.
10
11
  * Output is milliseconds.
11
12
  */
12
13
  const getTimeout = input => {
13
14
  if (input && input > 0) {
15
+ if (input < minTimeoutInSeconds) {
16
+ return minTimeoutInSeconds * 1000;
17
+ }
14
18
  return input * 1000;
15
19
  }
16
20
  const userDefined = process.env.WEBINY_RECORD_LOCK_TIMEOUT ? parseInt(process.env.WEBINY_RECORD_LOCK_TIMEOUT) : undefined;
@@ -1 +1 @@
1
- {"version":3,"names":["defaultTimeoutInSeconds","getTimeout","input","userDefined","process","env","WEBINY_RECORD_LOCK_TIMEOUT","parseInt","undefined","isNaN","exports"],"sources":["getTimeout.ts"],"sourcesContent":["const defaultTimeoutInSeconds = 1800;\n/**\n * Input is in seconds.\n * Output is milliseconds.\n */\nexport const getTimeout = (input: number | undefined) => {\n if (input && input > 0) {\n return input * 1000;\n }\n const userDefined = process.env.WEBINY_RECORD_LOCK_TIMEOUT\n ? parseInt(process.env.WEBINY_RECORD_LOCK_TIMEOUT)\n : undefined;\n if (!userDefined || isNaN(userDefined) || userDefined <= 0) {\n return defaultTimeoutInSeconds * 1000;\n }\n return userDefined * 1000;\n};\n"],"mappings":";;;;;;AAAA,MAAMA,uBAAuB,GAAG,IAAI;AACpC;AACA;AACA;AACA;AACO,MAAMC,UAAU,GAAIC,KAAyB,IAAK;EACrD,IAAIA,KAAK,IAAIA,KAAK,GAAG,CAAC,EAAE;IACpB,OAAOA,KAAK,GAAG,IAAI;EACvB;EACA,MAAMC,WAAW,GAAGC,OAAO,CAACC,GAAG,CAACC,0BAA0B,GACpDC,QAAQ,CAACH,OAAO,CAACC,GAAG,CAACC,0BAA0B,CAAC,GAChDE,SAAS;EACf,IAAI,CAACL,WAAW,IAAIM,KAAK,CAACN,WAAW,CAAC,IAAIA,WAAW,IAAI,CAAC,EAAE;IACxD,OAAOH,uBAAuB,GAAG,IAAI;EACzC;EACA,OAAOG,WAAW,GAAG,IAAI;AAC7B,CAAC;AAACO,OAAA,CAAAT,UAAA,GAAAA,UAAA","ignoreList":[]}
1
+ {"version":3,"names":["minTimeoutInSeconds","defaultTimeoutInSeconds","getTimeout","input","userDefined","process","env","WEBINY_RECORD_LOCK_TIMEOUT","parseInt","undefined","isNaN","exports"],"sources":["getTimeout.ts"],"sourcesContent":["const minTimeoutInSeconds = 30;\nconst defaultTimeoutInSeconds = 60;\n/**\n * Input is in seconds.\n * Output is milliseconds.\n */\nexport const getTimeout = (input: number | undefined) => {\n if (input && input > 0) {\n if (input < minTimeoutInSeconds) {\n return minTimeoutInSeconds * 1000;\n }\n return input * 1000;\n }\n const userDefined = process.env.WEBINY_RECORD_LOCK_TIMEOUT\n ? parseInt(process.env.WEBINY_RECORD_LOCK_TIMEOUT)\n : undefined;\n if (!userDefined || isNaN(userDefined) || userDefined <= 0) {\n return defaultTimeoutInSeconds * 1000;\n }\n return userDefined * 1000;\n};\n"],"mappings":";;;;;;AAAA,MAAMA,mBAAmB,GAAG,EAAE;AAC9B,MAAMC,uBAAuB,GAAG,EAAE;AAClC;AACA;AACA;AACA;AACO,MAAMC,UAAU,GAAIC,KAAyB,IAAK;EACrD,IAAIA,KAAK,IAAIA,KAAK,GAAG,CAAC,EAAE;IACpB,IAAIA,KAAK,GAAGH,mBAAmB,EAAE;MAC7B,OAAOA,mBAAmB,GAAG,IAAI;IACrC;IACA,OAAOG,KAAK,GAAG,IAAI;EACvB;EACA,MAAMC,WAAW,GAAGC,OAAO,CAACC,GAAG,CAACC,0BAA0B,GACpDC,QAAQ,CAACH,OAAO,CAACC,GAAG,CAACC,0BAA0B,CAAC,GAChDE,SAAS;EACf,IAAI,CAACL,WAAW,IAAIM,KAAK,CAACN,WAAW,CAAC,IAAIA,WAAW,IAAI,CAAC,EAAE;IACxD,OAAOH,uBAAuB,GAAG,IAAI;EACzC;EACA,OAAOG,WAAW,GAAG,IAAI;AAC7B,CAAC;AAACO,OAAA,CAAAT,UAAA,GAAAA,UAAA","ignoreList":[]}
@@ -1,5 +0,0 @@
1
- import { IRecordLockingLockRecord } from "../types";
2
- export interface IIsLocked {
3
- (record?: Pick<IRecordLockingLockRecord, "lockedOn"> | null): boolean;
4
- }
5
- export declare const isLockedFactory: (timeout: number) => IIsLocked;
@@ -1,19 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.isLockedFactory = void 0;
7
- const isLockedFactory = timeout => {
8
- return record => {
9
- if (!record || record.lockedOn instanceof Date === false) {
10
- return false;
11
- }
12
- const now = new Date().getTime();
13
- const lockedOn = record.lockedOn.getTime();
14
- return lockedOn + timeout >= now;
15
- };
16
- };
17
- exports.isLockedFactory = isLockedFactory;
18
-
19
- //# sourceMappingURL=isLockedFactory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["isLockedFactory","timeout","record","lockedOn","Date","now","getTime","exports"],"sources":["isLockedFactory.ts"],"sourcesContent":["import { IRecordLockingLockRecord } from \"~/types\";\n\nexport interface IIsLocked {\n (record?: Pick<IRecordLockingLockRecord, \"lockedOn\"> | null): boolean;\n}\n\nexport const isLockedFactory = (timeout: number): IIsLocked => {\n return record => {\n if (!record || record.lockedOn instanceof Date === false) {\n return false;\n }\n const now = new Date().getTime();\n const lockedOn = record.lockedOn.getTime();\n return lockedOn + timeout >= now;\n };\n};\n"],"mappings":";;;;;;AAMO,MAAMA,eAAe,GAAIC,OAAe,IAAgB;EAC3D,OAAOC,MAAM,IAAI;IACb,IAAI,CAACA,MAAM,IAAIA,MAAM,CAACC,QAAQ,YAAYC,IAAI,KAAK,KAAK,EAAE;MACtD,OAAO,KAAK;IAChB;IACA,MAAMC,GAAG,GAAG,IAAID,IAAI,CAAC,CAAC,CAACE,OAAO,CAAC,CAAC;IAChC,MAAMH,QAAQ,GAAGD,MAAM,CAACC,QAAQ,CAACG,OAAO,CAAC,CAAC;IAC1C,OAAOH,QAAQ,GAAGF,OAAO,IAAII,GAAG;EACpC,CAAC;AACL,CAAC;AAACE,OAAA,CAAAP,eAAA,GAAAA,eAAA","ignoreList":[]}