@webiny/api-record-locking 5.41.4 → 5.42.0-beta.1

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.
@@ -1 +1 @@
1
- {"version":3,"names":["_resolve","require","_handlerGraphql","_renderFields","_createFieldTypePluginRecords","_renderListFilterFields","_renderSortEnum","_checkPermissions","createGraphQLSchema","params","context","model","recordLocking","getModel","models","security","withoutAuthorization","cms","listModels","filter","fields","length","isPrivate","fieldTypePlugins","createFieldTypePluginRecords","plugins","recordLockingFields","renderFields","type","listFilterFieldsRender","renderListFilterFields","excludeFields","sortEnumRender","renderSortEnum","sorterPlugins","plugin","createGraphQLSchemaPlugin","typeDefs","map","f","join","resolvers","Query","Mutation","RecordLockingQuery","isEntryLocked","_","args","resolve","checkPermissions","id","getLockRecord","result","NotFoundError","getLockedEntryLockRecord","listLockRecords","resolveList","listAllLockRecords","RecordLockingMutation","lockEntry","updateEntryLock","unlockEntry","force","unlockEntryRequest","name","exports"],"sources":["schema.ts"],"sourcesContent":["import { resolve, resolveList } from \"~/utils/resolve\";\nimport { Context } from \"~/types\";\nimport {\n createGraphQLSchemaPlugin,\n IGraphQLSchemaPlugin,\n NotFoundError\n} from \"@webiny/handler-graphql\";\nimport { renderFields } from \"@webiny/api-headless-cms/utils/renderFields\";\nimport { createFieldTypePluginRecords } from \"@webiny/api-headless-cms/graphql/schema/createFieldTypePluginRecords\";\nimport { renderListFilterFields } from \"@webiny/api-headless-cms/utils/renderListFilterFields\";\nimport { renderSortEnum } from \"@webiny/api-headless-cms/utils/renderSortEnum\";\nimport { checkPermissions } from \"~/utils/checkPermissions\";\n\ninterface Params {\n context: Pick<Context, \"plugins\" | \"recordLocking\" | \"security\" | \"cms\">;\n}\nexport const createGraphQLSchema = async (\n params: Params\n): Promise<IGraphQLSchemaPlugin<Context>> => {\n const context = params.context;\n\n const model = await context.recordLocking.getModel();\n\n const models = await context.security.withoutAuthorization(async () => {\n return (await context.cms.listModels()).filter(model => {\n if (model.fields.length === 0) {\n return false;\n } else if (model.isPrivate) {\n return false;\n }\n return true;\n });\n });\n\n const fieldTypePlugins = createFieldTypePluginRecords(context.plugins);\n\n const recordLockingFields = renderFields({\n models,\n model,\n fields: model.fields,\n type: \"manage\",\n fieldTypePlugins\n });\n\n const listFilterFieldsRender = renderListFilterFields({\n model,\n fields: model.fields,\n type: \"manage\",\n fieldTypePlugins,\n excludeFields: [\"entryId\"]\n });\n\n const sortEnumRender = renderSortEnum({\n model,\n fields: model.fields,\n fieldTypePlugins,\n sorterPlugins: []\n });\n\n const plugin = createGraphQLSchemaPlugin<Context>({\n typeDefs: /* GraphQL */ `\n ${recordLockingFields.map(f => f.typeDefs).join(\"\\n\")}\n\n type RecordLockingError {\n message: String\n code: String\n data: JSON\n stack: String\n }\n\n enum RecordLockingRecordActionType {\n requested\n approved\n denied\n }\n\n type RecordLockingIdentity {\n id: String!\n displayName: String\n type: String\n }\n\n type RecordLockingRecordAction {\n id: ID!\n type: RecordLockingRecordActionType!\n message: String\n createdBy: RecordLockingIdentity!\n createdOn: DateTime!\n }\n\n type RecordLockingRecord {\n id: ID!\n lockedBy: RecordLockingIdentity!\n lockedOn: DateTime!\n updatedOn: DateTime!\n expiresOn: DateTime!\n ${recordLockingFields.map(f => f.fields).join(\"\\n\")}\n }\n\n type RecordLockingIsEntryLockedResponse {\n data: Boolean\n error: RecordLockingError\n }\n\n type RecordLockingGetLockRecordResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingGetLockedEntryLockRecordResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingListLockRecordsResponse {\n data: [RecordLockingRecord!]\n error: RecordLockingError\n }\n\n type RecordLockingLockEntryResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n \n type RecordLockingUpdateLockResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingUnlockEntryResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingUnlockEntryRequestResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n input RecordLockingListWhereInput {\n ${listFilterFieldsRender}\n }\n\n enum RecordLockingListSorter {\n ${sortEnumRender}\n }\n\n type RecordLockingQuery {\n _empty: String\n }\n\n type RecordLockingMutation {\n _empty: String\n }\n\n extend type RecordLockingQuery {\n isEntryLocked(id: ID!, type: String!): RecordLockingIsEntryLockedResponse!\n getLockRecord(id: ID!, type: String!): RecordLockingGetLockRecordResponse!\n # Returns lock record or null - if entry is locked in context of the current user, does not throw an error like getLockRecord if no record in the DB\n getLockedEntryLockRecord(id: ID!, type: String!): RecordLockingGetLockedEntryLockRecordResponse!\n listAllLockRecords(\n where: RecordLockingListWhereInput\n sort: [RecordLockingListSorter!]\n limit: Int\n after: String\n ): RecordLockingListLockRecordsResponse!\n # Basically same as listAllLockRecords except this one will filter out records with expired lock.\n listLockRecords(\n where: RecordLockingListWhereInput\n sort: [RecordLockingListSorter!]\n limit: Int\n after: String\n ): RecordLockingListLockRecordsResponse!\n }\n\n extend type RecordLockingMutation {\n lockEntry(id: ID!, type: String!): RecordLockingLockEntryResponse!\n updateEntryLock(id: ID!, type: String!): RecordLockingUpdateLockResponse!\n unlockEntry(id: ID!, type: String!, force: Boolean): RecordLockingUnlockEntryResponse!\n unlockEntryRequest(\n id: ID!\n type: String!\n ): RecordLockingUnlockEntryRequestResponse!\n }\n\n extend type Query {\n recordLocking: RecordLockingQuery\n }\n\n extend type Mutation {\n recordLocking: RecordLockingMutation\n }\n `,\n resolvers: {\n Query: {\n recordLocking: async () => ({})\n },\n Mutation: {\n recordLocking: async () => ({})\n },\n RecordLockingQuery: {\n async isEntryLocked(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return context.recordLocking.isEntryLocked({\n id: args.id,\n type: args.type\n });\n });\n },\n async getLockRecord(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const result = await context.recordLocking.getLockRecord({\n id: args.id,\n type: args.type\n });\n if (result) {\n return result;\n }\n throw new NotFoundError(\"Lock record not found.\");\n });\n },\n async getLockedEntryLockRecord(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.recordLocking.getLockedEntryLockRecord({\n id: args.id,\n type: args.type\n });\n });\n },\n\n async listLockRecords(_, args, context) {\n return resolveList(async () => {\n await checkPermissions(context);\n return await context.recordLocking.listLockRecords(args);\n });\n },\n listAllLockRecords(_, args, context) {\n return resolveList(async () => {\n await checkPermissions(context);\n return await context.recordLocking.listAllLockRecords(args);\n });\n }\n },\n RecordLockingMutation: {\n async lockEntry(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return context.recordLocking.lockEntry({\n id: args.id,\n type: args.type\n });\n });\n },\n async updateEntryLock(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return context.recordLocking.updateEntryLock({\n id: args.id,\n type: args.type\n });\n });\n },\n async unlockEntry(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.recordLocking.unlockEntry({\n id: args.id,\n type: args.type,\n force: args.force\n });\n });\n },\n async unlockEntryRequest(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.recordLocking.unlockEntryRequest({\n id: args.id,\n type: args.type\n });\n });\n }\n }\n }\n });\n\n plugin.name = \"recordLocking.graphql.schema.locking\";\n\n return plugin;\n};\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAEA,IAAAC,eAAA,GAAAD,OAAA;AAKA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,6BAAA,GAAAH,OAAA;AACA,IAAAI,uBAAA,GAAAJ,OAAA;AACA,IAAAK,eAAA,GAAAL,OAAA;AACA,IAAAM,iBAAA,GAAAN,OAAA;AAKO,MAAMO,mBAAmB,GAAG,MAC/BC,MAAc,IAC2B;EACzC,MAAMC,OAAO,GAAGD,MAAM,CAACC,OAAO;EAE9B,MAAMC,KAAK,GAAG,MAAMD,OAAO,CAACE,aAAa,CAACC,QAAQ,CAAC,CAAC;EAEpD,MAAMC,MAAM,GAAG,MAAMJ,OAAO,CAACK,QAAQ,CAACC,oBAAoB,CAAC,YAAY;IACnE,OAAO,CAAC,MAAMN,OAAO,CAACO,GAAG,CAACC,UAAU,CAAC,CAAC,EAAEC,MAAM,CAACR,KAAK,IAAI;MACpD,IAAIA,KAAK,CAACS,MAAM,CAACC,MAAM,KAAK,CAAC,EAAE;QAC3B,OAAO,KAAK;MAChB,CAAC,MAAM,IAAIV,KAAK,CAACW,SAAS,EAAE;QACxB,OAAO,KAAK;MAChB;MACA,OAAO,IAAI;IACf,CAAC,CAAC;EACN,CAAC,CAAC;EAEF,MAAMC,gBAAgB,GAAG,IAAAC,0DAA4B,EAACd,OAAO,CAACe,OAAO,CAAC;EAEtE,MAAMC,mBAAmB,GAAG,IAAAC,0BAAY,EAAC;IACrCb,MAAM;IACNH,KAAK;IACLS,MAAM,EAAET,KAAK,CAACS,MAAM;IACpBQ,IAAI,EAAE,QAAQ;IACdL;EACJ,CAAC,CAAC;EAEF,MAAMM,sBAAsB,GAAG,IAAAC,8CAAsB,EAAC;IAClDnB,KAAK;IACLS,MAAM,EAAET,KAAK,CAACS,MAAM;IACpBQ,IAAI,EAAE,QAAQ;IACdL,gBAAgB;IAChBQ,aAAa,EAAE,CAAC,SAAS;EAC7B,CAAC,CAAC;EAEF,MAAMC,cAAc,GAAG,IAAAC,8BAAc,EAAC;IAClCtB,KAAK;IACLS,MAAM,EAAET,KAAK,CAACS,MAAM;IACpBG,gBAAgB;IAChBW,aAAa,EAAE;EACnB,CAAC,CAAC;EAEF,MAAMC,MAAM,GAAG,IAAAC,yCAAyB,EAAU;IAC9CC,QAAQ,EAAE,aAAe;AACjC,cAAcX,mBAAmB,CAACY,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACF,QAAQ,CAAC,CAACG,IAAI,CAAC,IAAI,CAAE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkBd,mBAAmB,CAACY,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACnB,MAAM,CAAC,CAACoB,IAAI,CAAC,IAAI,CAAE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkBX,sBAAuB;AACzC;AACA;AACA;AACA,kBAAkBG,cAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;IACDS,SAAS,EAAE;MACPC,KAAK,EAAE;QACH9B,aAAa,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;MAClC,CAAC;MACD+B,QAAQ,EAAE;QACN/B,aAAa,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;MAClC,CAAC;MACDgC,kBAAkB,EAAE;QAChB,MAAMC,aAAaA,CAACC,CAAC,EAAEC,IAAI,EAAErC,OAAO,EAAE;UAClC,OAAO,IAAAsC,gBAAO,EAAC,YAAY;YACvB,MAAM,IAAAC,kC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","ignoreList":[]}
1
+ {"version":3,"names":["_resolve","require","_handlerGraphql","_renderFields","_createFieldTypePluginRecords","_renderListFilterFields","_renderSortEnum","_checkPermissions","createGraphQLSchema","params","context","model","recordLocking","getModel","models","security","withoutAuthorization","cms","listModels","filter","fields","length","isPrivate","fieldTypePlugins","createFieldTypePluginRecords","plugins","recordLockingFields","renderFields","type","listFilterFieldsRender","renderListFilterFields","excludeFields","sortEnumRender","renderSortEnum","sorterPlugins","plugin","createGraphQLSchemaPlugin","typeDefs","map","f","join","resolvers","Query","Mutation","RecordLockingQuery","isEntryLocked","_","args","resolve","checkPermissions","id","getLockRecord","result","NotFoundError","getLockedEntryLockRecord","listLockRecords","resolveList","listAllLockRecords","RecordLockingMutation","lockEntry","updateEntryLock","unlockEntry","force","unlockEntryRequest","name","exports"],"sources":["schema.ts"],"sourcesContent":["import { resolve, resolveList } from \"~/utils/resolve\";\nimport { Context } from \"~/types\";\nimport {\n createGraphQLSchemaPlugin,\n IGraphQLSchemaPlugin,\n NotFoundError\n} from \"@webiny/handler-graphql\";\nimport { renderFields } from \"@webiny/api-headless-cms/utils/renderFields\";\nimport { createFieldTypePluginRecords } from \"@webiny/api-headless-cms/graphql/schema/createFieldTypePluginRecords\";\nimport { renderListFilterFields } from \"@webiny/api-headless-cms/utils/renderListFilterFields\";\nimport { renderSortEnum } from \"@webiny/api-headless-cms/utils/renderSortEnum\";\nimport { checkPermissions } from \"~/utils/checkPermissions\";\n\ninterface Params {\n context: Pick<Context, \"plugins\" | \"recordLocking\" | \"security\" | \"cms\">;\n}\nexport const createGraphQLSchema = async (\n params: Params\n): Promise<IGraphQLSchemaPlugin<Context>> => {\n const context = params.context;\n\n const model = await context.recordLocking.getModel();\n\n const models = await context.security.withoutAuthorization(async () => {\n return (await context.cms.listModels()).filter(model => {\n if (model.fields.length === 0) {\n return false;\n } else if (model.isPrivate) {\n return false;\n }\n return true;\n });\n });\n\n const fieldTypePlugins = createFieldTypePluginRecords(context.plugins);\n\n const recordLockingFields = renderFields({\n models,\n model,\n fields: model.fields,\n type: \"manage\",\n fieldTypePlugins\n });\n\n const listFilterFieldsRender = renderListFilterFields({\n model,\n fields: model.fields,\n type: \"manage\",\n fieldTypePlugins,\n excludeFields: [\"entryId\"]\n });\n\n const sortEnumRender = renderSortEnum({\n model,\n fields: model.fields,\n fieldTypePlugins,\n sorterPlugins: []\n });\n\n const plugin = createGraphQLSchemaPlugin<Context>({\n typeDefs: /* GraphQL */ `\n ${recordLockingFields.map(f => f.typeDefs).join(\"\\n\")}\n\n type RecordLockingError {\n message: String\n code: String\n data: JSON\n stack: String\n }\n\n enum RecordLockingRecordActionType {\n requested\n approved\n denied\n }\n\n type RecordLockingIdentity {\n id: String!\n displayName: String\n type: String\n }\n\n type RecordLockingRecordAction {\n id: ID!\n type: RecordLockingRecordActionType!\n message: String\n createdBy: RecordLockingIdentity!\n createdOn: DateTime!\n }\n\n type RecordLockingRecord {\n id: ID!\n lockedBy: RecordLockingIdentity!\n lockedOn: DateTime!\n updatedOn: DateTime!\n expiresOn: DateTime!\n ${recordLockingFields.map(f => f.fields).join(\"\\n\")}\n }\n\n type RecordLockingIsEntryLockedResponse {\n data: Boolean\n error: RecordLockingError\n }\n\n type RecordLockingGetLockRecordResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingGetLockedEntryLockRecordResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingListLockRecordsResponse {\n data: [RecordLockingRecord!]\n error: RecordLockingError\n }\n\n type RecordLockingLockEntryResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n \n type RecordLockingUpdateLockResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingUnlockEntryResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n type RecordLockingUnlockEntryRequestResponse {\n data: RecordLockingRecord\n error: RecordLockingError\n }\n\n input RecordLockingListWhereInput {\n ${listFilterFieldsRender}\n }\n\n enum RecordLockingListSorter {\n ${sortEnumRender}\n }\n\n type RecordLockingQuery {\n _empty: String\n }\n\n type RecordLockingMutation {\n _empty: String\n }\n\n extend type RecordLockingQuery {\n isEntryLocked(id: ID!, type: String!): RecordLockingIsEntryLockedResponse!\n getLockRecord(id: ID!, type: String!): RecordLockingGetLockRecordResponse!\n # Returns lock record or null - if entry is locked in context of the current user, does not throw an error like getLockRecord if no record in the DB\n getLockedEntryLockRecord(id: ID!, type: String!): RecordLockingGetLockedEntryLockRecordResponse!\n listAllLockRecords(\n where: RecordLockingListWhereInput\n sort: [RecordLockingListSorter!]\n limit: Int\n after: String\n ): RecordLockingListLockRecordsResponse!\n # Basically same as listAllLockRecords except this one will filter out records with expired lock.\n listLockRecords(\n where: RecordLockingListWhereInput\n sort: [RecordLockingListSorter!]\n limit: Int\n after: String\n ): RecordLockingListLockRecordsResponse!\n }\n\n extend type RecordLockingMutation {\n lockEntry(id: ID!, type: String!): RecordLockingLockEntryResponse!\n updateEntryLock(id: ID!, type: String!): RecordLockingUpdateLockResponse!\n unlockEntry(id: ID!, type: String!, force: Boolean): RecordLockingUnlockEntryResponse!\n unlockEntryRequest(\n id: ID!\n type: String!\n ): RecordLockingUnlockEntryRequestResponse!\n }\n\n extend type Query {\n recordLocking: RecordLockingQuery\n }\n\n extend type Mutation {\n recordLocking: RecordLockingMutation\n }\n `,\n resolvers: {\n Query: {\n recordLocking: async () => ({})\n },\n Mutation: {\n recordLocking: async () => ({})\n },\n RecordLockingQuery: {\n async isEntryLocked(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return context.recordLocking.isEntryLocked({\n id: args.id,\n type: args.type\n });\n });\n },\n async getLockRecord(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n const result = await context.recordLocking.getLockRecord({\n id: args.id,\n type: args.type\n });\n if (result) {\n return result;\n }\n throw new NotFoundError(\"Lock record not found.\");\n });\n },\n async getLockedEntryLockRecord(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.recordLocking.getLockedEntryLockRecord({\n id: args.id,\n type: args.type\n });\n });\n },\n\n async listLockRecords(_, args, context) {\n return resolveList(async () => {\n await checkPermissions(context);\n return await context.recordLocking.listLockRecords(args);\n });\n },\n listAllLockRecords(_, args, context) {\n return resolveList(async () => {\n await checkPermissions(context);\n return await context.recordLocking.listAllLockRecords(args);\n });\n }\n },\n RecordLockingMutation: {\n async lockEntry(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return context.recordLocking.lockEntry({\n id: args.id,\n type: args.type\n });\n });\n },\n async updateEntryLock(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return context.recordLocking.updateEntryLock({\n id: args.id,\n type: args.type\n });\n });\n },\n async unlockEntry(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.recordLocking.unlockEntry({\n id: args.id,\n type: args.type,\n force: args.force\n });\n });\n },\n async unlockEntryRequest(_, args, context) {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.recordLocking.unlockEntryRequest({\n id: args.id,\n type: args.type\n });\n });\n }\n }\n }\n });\n\n plugin.name = \"recordLocking.graphql.schema.locking\";\n\n return plugin;\n};\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAEA,IAAAC,eAAA,GAAAD,OAAA;AAKA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,6BAAA,GAAAH,OAAA;AACA,IAAAI,uBAAA,GAAAJ,OAAA;AACA,IAAAK,eAAA,GAAAL,OAAA;AACA,IAAAM,iBAAA,GAAAN,OAAA;AAKO,MAAMO,mBAAmB,GAAG,MAC/BC,MAAc,IAC2B;EACzC,MAAMC,OAAO,GAAGD,MAAM,CAACC,OAAO;EAE9B,MAAMC,KAAK,GAAG,MAAMD,OAAO,CAACE,aAAa,CAACC,QAAQ,CAAC,CAAC;EAEpD,MAAMC,MAAM,GAAG,MAAMJ,OAAO,CAACK,QAAQ,CAACC,oBAAoB,CAAC,YAAY;IACnE,OAAO,CAAC,MAAMN,OAAO,CAACO,GAAG,CAACC,UAAU,CAAC,CAAC,EAAEC,MAAM,CAACR,KAAK,IAAI;MACpD,IAAIA,KAAK,CAACS,MAAM,CAACC,MAAM,KAAK,CAAC,EAAE;QAC3B,OAAO,KAAK;MAChB,CAAC,MAAM,IAAIV,KAAK,CAACW,SAAS,EAAE;QACxB,OAAO,KAAK;MAChB;MACA,OAAO,IAAI;IACf,CAAC,CAAC;EACN,CAAC,CAAC;EAEF,MAAMC,gBAAgB,GAAG,IAAAC,0DAA4B,EAACd,OAAO,CAACe,OAAO,CAAC;EAEtE,MAAMC,mBAAmB,GAAG,IAAAC,0BAAY,EAAC;IACrCb,MAAM;IACNH,KAAK;IACLS,MAAM,EAAET,KAAK,CAACS,MAAM;IACpBQ,IAAI,EAAE,QAAQ;IACdL;EACJ,CAAC,CAAC;EAEF,MAAMM,sBAAsB,GAAG,IAAAC,8CAAsB,EAAC;IAClDnB,KAAK;IACLS,MAAM,EAAET,KAAK,CAACS,MAAM;IACpBQ,IAAI,EAAE,QAAQ;IACdL,gBAAgB;IAChBQ,aAAa,EAAE,CAAC,SAAS;EAC7B,CAAC,CAAC;EAEF,MAAMC,cAAc,GAAG,IAAAC,8BAAc,EAAC;IAClCtB,KAAK;IACLS,MAAM,EAAET,KAAK,CAACS,MAAM;IACpBG,gBAAgB;IAChBW,aAAa,EAAE;EACnB,CAAC,CAAC;EAEF,MAAMC,MAAM,GAAG,IAAAC,yCAAyB,EAAU;IAC9CC,QAAQ,EAAE,aAAc;AAChC,cAAcX,mBAAmB,CAACY,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACF,QAAQ,CAAC,CAACG,IAAI,CAAC,IAAI,CAAC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkBd,mBAAmB,CAACY,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACnB,MAAM,CAAC,CAACoB,IAAI,CAAC,IAAI,CAAC;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkBX,sBAAsB;AACxC;AACA;AACA;AACA,kBAAkBG,cAAc;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;IACDS,SAAS,EAAE;MACPC,KAAK,EAAE;QACH9B,aAAa,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;MAClC,CAAC;MACD+B,QAAQ,EAAE;QACN/B,aAAa,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;MAClC,CAAC;MACDgC,kBAAkB,EAAE;QAChB,MAAMC,aAAaA,CAACC,CAAC,EAAEC,IAAI,EAAErC,OAAO,EAAE;UAClC,OAAO,IAAAsC,gBAAO,EAAC,YAAY;YACvB,MAAM,IAAAC,kC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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-record-locking",
3
- "version": "5.41.4",
3
+ "version": "5.42.0-beta.1",
4
4
  "main": "index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,34 +12,28 @@
12
12
  ],
13
13
  "license": "MIT",
14
14
  "dependencies": {
15
- "@babel/runtime": "7.24.1",
16
- "@types/aws-lambda": "8.10.136",
17
- "@webiny/api": "5.41.4",
18
- "@webiny/api-headless-cms": "5.41.4",
19
- "@webiny/api-websockets": "5.41.4",
20
- "@webiny/error": "5.41.4",
21
- "@webiny/handler": "5.41.4",
22
- "@webiny/handler-aws": "5.41.4",
23
- "@webiny/handler-graphql": "5.41.4",
24
- "@webiny/plugins": "5.41.4",
25
- "@webiny/pubsub": "5.41.4",
26
- "@webiny/utils": "5.41.4"
15
+ "@webiny/api": "5.42.0-beta.1",
16
+ "@webiny/api-headless-cms": "5.42.0-beta.1",
17
+ "@webiny/api-websockets": "5.42.0-beta.1",
18
+ "@webiny/error": "5.42.0-beta.1",
19
+ "@webiny/handler": "5.42.0-beta.1",
20
+ "@webiny/handler-aws": "5.42.0-beta.1",
21
+ "@webiny/handler-graphql": "5.42.0-beta.1",
22
+ "@webiny/plugins": "5.42.0-beta.1",
23
+ "@webiny/pubsub": "5.42.0-beta.1",
24
+ "@webiny/utils": "5.42.0-beta.1"
27
25
  },
28
26
  "devDependencies": {
29
- "@babel/cli": "7.24.1",
30
- "@babel/core": "7.24.3",
31
- "@babel/preset-env": "7.24.3",
32
- "@babel/preset-typescript": "7.24.1",
33
- "@webiny/api-i18n": "5.41.4",
34
- "@webiny/api-security": "5.41.4",
35
- "@webiny/api-tenancy": "5.41.4",
36
- "@webiny/api-wcp": "5.41.4",
37
- "@webiny/cli": "5.41.4",
38
- "@webiny/project-utils": "5.41.4",
39
- "graphql": "15.8.0",
40
- "rimraf": "5.0.5",
27
+ "@webiny/api-i18n": "5.42.0-beta.1",
28
+ "@webiny/api-security": "5.42.0-beta.1",
29
+ "@webiny/api-tenancy": "5.42.0-beta.1",
30
+ "@webiny/api-wcp": "5.42.0-beta.1",
31
+ "@webiny/cli": "5.42.0-beta.1",
32
+ "@webiny/project-utils": "5.42.0-beta.1",
33
+ "graphql": "15.9.0",
34
+ "rimraf": "6.0.1",
41
35
  "ttypescript": "1.5.15",
42
- "type-fest": "2.19.0",
36
+ "type-fest": "3.13.1",
43
37
  "typescript": "4.9.5"
44
38
  },
45
39
  "publishConfig": {
@@ -50,15 +44,5 @@
50
44
  "build": "yarn webiny run build",
51
45
  "watch": "yarn webiny run watch"
52
46
  },
53
- "gitHead": "94922b33af59db5afe75127bb07443ce7f1448c4",
54
- "adio": {
55
- "ignore": {
56
- "src": [
57
- "aws-lambda"
58
- ],
59
- "dependencies": [
60
- "@types/aws-lambda"
61
- ]
62
- }
63
- }
47
+ "gitHead": "5e69da579efa4f2c8268e0c97ac6407ddc3f5f07"
64
48
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_utils","require","KickOutCurrentUserUseCase","constructor","params","getWebsockets","getIdentity","execute","record","lockedBy","id","websockets","entryId","parseIdentifier","identity","send","action","data","toObject","user","ex","console","error","info","exports"],"sources":["KickOutCurrentUserUseCase.ts"],"sourcesContent":["import {\n IKickOutCurrentUserUseCase,\n IKickOutCurrentUserUseCaseExecuteParams\n} from \"~/abstractions/IKickOutCurrentUserUseCase\";\nimport { IGetIdentity, IGetWebsocketsContextCallable } from \"~/types\";\nimport { parseIdentifier } from \"@webiny/utils\";\n\nexport interface IKickOutCurrentUserUseCaseParams {\n getWebsockets: IGetWebsocketsContextCallable;\n getIdentity: IGetIdentity;\n}\n\nexport class KickOutCurrentUserUseCase implements IKickOutCurrentUserUseCase {\n private readonly getWebsockets: IGetWebsocketsContextCallable;\n private readonly getIdentity: IGetIdentity;\n\n public constructor(params: IKickOutCurrentUserUseCaseParams) {\n this.getWebsockets = params.getWebsockets;\n this.getIdentity = params.getIdentity;\n }\n\n public async execute(record: IKickOutCurrentUserUseCaseExecuteParams): Promise<void> {\n const { lockedBy, id } = record;\n\n const websockets = this.getWebsockets();\n\n const { id: entryId } = parseIdentifier(id);\n\n const identity = this.getIdentity();\n\n /**\n * We do not want any errors to leak out of this method.\n * Just log the error, if any.\n */\n try {\n await websockets.send(\n { id: lockedBy.id },\n {\n action: `recordLocking.entry.kickOut.${entryId}`,\n data: {\n record: record.toObject(),\n user: identity\n }\n }\n );\n } catch (ex) {\n console.error(\n `Could not send the kickOut message to a user with identity id: ${lockedBy.id}. More info in next log line.`\n );\n console.info(ex);\n }\n }\n}\n"],"mappings":";;;;;;AAKA,IAAAA,MAAA,GAAAC,OAAA;AAOO,MAAMC,yBAAyB,CAAuC;EAIlEC,WAAWA,CAACC,MAAwC,EAAE;IACzD,IAAI,CAACC,aAAa,GAAGD,MAAM,CAACC,aAAa;IACzC,IAAI,CAACC,WAAW,GAAGF,MAAM,CAACE,WAAW;EACzC;EAEA,MAAaC,OAAOA,CAACC,MAA+C,EAAiB;IACjF,MAAM;MAAEC,QAAQ;MAAEC;IAAG,CAAC,GAAGF,MAAM;IAE/B,MAAMG,UAAU,GAAG,IAAI,CAACN,aAAa,CAAC,CAAC;IAEvC,MAAM;MAAEK,EAAE,EAAEE;IAAQ,CAAC,GAAG,IAAAC,sBAAe,EAACH,EAAE,CAAC;IAE3C,MAAMI,QAAQ,GAAG,IAAI,CAACR,WAAW,CAAC,CAAC;;IAEnC;AACR;AACA;AACA;IACQ,IAAI;MACA,MAAMK,UAAU,CAACI,IAAI,CACjB;QAAEL,EAAE,EAAED,QAAQ,CAACC;MAAG,CAAC,EACnB;QACIM,MAAM,EAAG,+BAA8BJ,OAAQ,EAAC;QAChDK,IAAI,EAAE;UACFT,MAAM,EAAEA,MAAM,CAACU,QAAQ,CAAC,CAAC;UACzBC,IAAI,EAAEL;QACV;MACJ,CACJ,CAAC;IACL,CAAC,CAAC,OAAOM,EAAE,EAAE;MACTC,OAAO,CAACC,KAAK,CACR,kEAAiEb,QAAQ,CAACC,EAAG,+BAClF,CAAC;MACDW,OAAO,CAACE,IAAI,CAACH,EAAE,CAAC;IACpB;EACJ;AACJ;AAACI,OAAA,CAAAtB,yBAAA,GAAAA,yBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_utils","require","KickOutCurrentUserUseCase","constructor","params","getWebsockets","getIdentity","execute","record","lockedBy","id","websockets","entryId","parseIdentifier","identity","send","action","data","toObject","user","ex","console","error","info","exports"],"sources":["KickOutCurrentUserUseCase.ts"],"sourcesContent":["import {\n IKickOutCurrentUserUseCase,\n IKickOutCurrentUserUseCaseExecuteParams\n} from \"~/abstractions/IKickOutCurrentUserUseCase\";\nimport { IGetIdentity, IGetWebsocketsContextCallable } from \"~/types\";\nimport { parseIdentifier } from \"@webiny/utils\";\n\nexport interface IKickOutCurrentUserUseCaseParams {\n getWebsockets: IGetWebsocketsContextCallable;\n getIdentity: IGetIdentity;\n}\n\nexport class KickOutCurrentUserUseCase implements IKickOutCurrentUserUseCase {\n private readonly getWebsockets: IGetWebsocketsContextCallable;\n private readonly getIdentity: IGetIdentity;\n\n public constructor(params: IKickOutCurrentUserUseCaseParams) {\n this.getWebsockets = params.getWebsockets;\n this.getIdentity = params.getIdentity;\n }\n\n public async execute(record: IKickOutCurrentUserUseCaseExecuteParams): Promise<void> {\n const { lockedBy, id } = record;\n\n const websockets = this.getWebsockets();\n\n const { id: entryId } = parseIdentifier(id);\n\n const identity = this.getIdentity();\n\n /**\n * We do not want any errors to leak out of this method.\n * Just log the error, if any.\n */\n try {\n await websockets.send(\n { id: lockedBy.id },\n {\n action: `recordLocking.entry.kickOut.${entryId}`,\n data: {\n record: record.toObject(),\n user: identity\n }\n }\n );\n } catch (ex) {\n console.error(\n `Could not send the kickOut message to a user with identity id: ${lockedBy.id}. More info in next log line.`\n );\n console.info(ex);\n }\n }\n}\n"],"mappings":";;;;;;AAKA,IAAAA,MAAA,GAAAC,OAAA;AAOO,MAAMC,yBAAyB,CAAuC;EAIlEC,WAAWA,CAACC,MAAwC,EAAE;IACzD,IAAI,CAACC,aAAa,GAAGD,MAAM,CAACC,aAAa;IACzC,IAAI,CAACC,WAAW,GAAGF,MAAM,CAACE,WAAW;EACzC;EAEA,MAAaC,OAAOA,CAACC,MAA+C,EAAiB;IACjF,MAAM;MAAEC,QAAQ;MAAEC;IAAG,CAAC,GAAGF,MAAM;IAE/B,MAAMG,UAAU,GAAG,IAAI,CAACN,aAAa,CAAC,CAAC;IAEvC,MAAM;MAAEK,EAAE,EAAEE;IAAQ,CAAC,GAAG,IAAAC,sBAAe,EAACH,EAAE,CAAC;IAE3C,MAAMI,QAAQ,GAAG,IAAI,CAACR,WAAW,CAAC,CAAC;;IAEnC;AACR;AACA;AACA;IACQ,IAAI;MACA,MAAMK,UAAU,CAACI,IAAI,CACjB;QAAEL,EAAE,EAAED,QAAQ,CAACC;MAAG,CAAC,EACnB;QACIM,MAAM,EAAE,+BAA+BJ,OAAO,EAAE;QAChDK,IAAI,EAAE;UACFT,MAAM,EAAEA,MAAM,CAACU,QAAQ,CAAC,CAAC;UACzBC,IAAI,EAAEL;QACV;MACJ,CACJ,CAAC;IACL,CAAC,CAAC,OAAOM,EAAE,EAAE;MACTC,OAAO,CAACC,KAAK,CACT,kEAAkEb,QAAQ,CAACC,EAAE,+BACjF,CAAC;MACDW,OAAO,CAACE,IAAI,CAACH,EAAE,CAAC;IACpB;EACJ;AACJ;AAACI,OAAA,CAAAtB,yBAAA,GAAAA,yBAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_error","_interopRequireDefault","require","_convertEntryToLockRecord","_lockRecordDatabaseId","_handlerGraphql","LockEntryUseCase","constructor","params","isEntryLockedUseCase","getManager","execute","locked","ex","NotFoundError","WebinyError","manager","id","createLockRecordDatabaseId","entry","create","targetId","type","actions","convertEntryToLockRecord","message","code","data","exports"],"sources":["LockEntryUseCase.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n ILockEntryUseCase,\n ILockEntryUseCaseExecuteParams\n} from \"~/abstractions/ILockEntryUseCase\";\nimport {\n IRecordLockingLockRecord,\n IRecordLockingLockRecordValues,\n IRecordLockingModelManager\n} from \"~/types\";\nimport { IIsEntryLockedUseCase } from \"~/abstractions/IIsEntryLocked\";\nimport { convertEntryToLockRecord } from \"~/utils/convertEntryToLockRecord\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\n\nexport interface ILockEntryUseCaseParams {\n isEntryLockedUseCase: IIsEntryLockedUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n}\n\nexport class LockEntryUseCase implements ILockEntryUseCase {\n private readonly isEntryLockedUseCase: IIsEntryLockedUseCase;\n private readonly getManager: () => Promise<IRecordLockingModelManager>;\n\n public constructor(params: ILockEntryUseCaseParams) {\n this.isEntryLockedUseCase = params.isEntryLockedUseCase;\n this.getManager = params.getManager;\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 convertEntryToLockRecord(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,yBAAA,GAAAD,OAAA;AACA,IAAAE,qBAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAH,OAAA;AAOO,MAAMI,gBAAgB,CAA8B;EAIhDC,WAAWA,CAACC,MAA+B,EAAE;IAChD,IAAI,CAACC,oBAAoB,GAAGD,MAAM,CAACC,oBAAoB;IACvD,IAAI,CAACC,UAAU,GAAGF,MAAM,CAACE,UAAU;EACvC;EAEA,MAAaC,OAAOA,CAChBH,MAAsC,EACL;IACjC,IAAII,MAAM,GAAG,KAAK;IAClB,IAAI;MACAA,MAAM,GAAG,MAAM,IAAI,CAACH,oBAAoB,CAACE,OAAO,CAACH,MAAM,CAAC;IAC5D,CAAC,CAAC,OAAOK,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,GAAGP;MACP,CAAC,CAAC;IACN;IACA,IAAI;MACA,MAAMQ,OAAO,GAAG,MAAM,IAAI,CAACN,UAAU,CAAC,CAAC;MAEvC,MAAMO,EAAE,GAAG,IAAAC,gDAA0B,EAACV,MAAM,CAACS,EAAE,CAAC;MAChD,MAAME,KAAK,GAAG,MAAMH,OAAO,CAACI,MAAM,CAAiC;QAC/DH,EAAE;QACFI,QAAQ,EAAEb,MAAM,CAACS,EAAE;QACnBK,IAAI,EAAEd,MAAM,CAACc,IAAI;QACjBC,OAAO,EAAE;MACb,CAAC,CAAC;MACF,OAAO,IAAAC,kDAAwB,EAACL,KAAK,CAAC;IAC1C,CAAC,CAAC,OAAON,EAAE,EAAE;MACT,MAAM,IAAIE,cAAW,CAChB,yBAAwBF,EAAE,CAACY,OAAQ,EAAC,EACrCZ,EAAE,CAACa,IAAI,IAAI,kBAAkB,EAC7B;QACI,GAAGb,EAAE,CAACc;MACV,CACJ,CAAC;IACL;EACJ;AACJ;AAACC,OAAA,CAAAtB,gBAAA,GAAAA,gBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_error","_interopRequireDefault","require","_convertEntryToLockRecord","_lockRecordDatabaseId","_handlerGraphql","LockEntryUseCase","constructor","params","isEntryLockedUseCase","getManager","execute","locked","ex","NotFoundError","WebinyError","manager","id","createLockRecordDatabaseId","entry","create","targetId","type","actions","convertEntryToLockRecord","message","code","data","exports"],"sources":["LockEntryUseCase.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n ILockEntryUseCase,\n ILockEntryUseCaseExecuteParams\n} from \"~/abstractions/ILockEntryUseCase\";\nimport {\n IRecordLockingLockRecord,\n IRecordLockingLockRecordValues,\n IRecordLockingModelManager\n} from \"~/types\";\nimport { IIsEntryLockedUseCase } from \"~/abstractions/IIsEntryLocked\";\nimport { convertEntryToLockRecord } from \"~/utils/convertEntryToLockRecord\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\n\nexport interface ILockEntryUseCaseParams {\n isEntryLockedUseCase: IIsEntryLockedUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n}\n\nexport class LockEntryUseCase implements ILockEntryUseCase {\n private readonly isEntryLockedUseCase: IIsEntryLockedUseCase;\n private readonly getManager: () => Promise<IRecordLockingModelManager>;\n\n public constructor(params: ILockEntryUseCaseParams) {\n this.isEntryLockedUseCase = params.isEntryLockedUseCase;\n this.getManager = params.getManager;\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 convertEntryToLockRecord(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,yBAAA,GAAAD,OAAA;AACA,IAAAE,qBAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAH,OAAA;AAOO,MAAMI,gBAAgB,CAA8B;EAIhDC,WAAWA,CAACC,MAA+B,EAAE;IAChD,IAAI,CAACC,oBAAoB,GAAGD,MAAM,CAACC,oBAAoB;IACvD,IAAI,CAACC,UAAU,GAAGF,MAAM,CAACE,UAAU;EACvC;EAEA,MAAaC,OAAOA,CAChBH,MAAsC,EACL;IACjC,IAAII,MAAM,GAAG,KAAK;IAClB,IAAI;MACAA,MAAM,GAAG,MAAM,IAAI,CAACH,oBAAoB,CAACE,OAAO,CAACH,MAAM,CAAC;IAC5D,CAAC,CAAC,OAAOK,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,GAAGP;MACP,CAAC,CAAC;IACN;IACA,IAAI;MACA,MAAMQ,OAAO,GAAG,MAAM,IAAI,CAACN,UAAU,CAAC,CAAC;MAEvC,MAAMO,EAAE,GAAG,IAAAC,gDAA0B,EAACV,MAAM,CAACS,EAAE,CAAC;MAChD,MAAME,KAAK,GAAG,MAAMH,OAAO,CAACI,MAAM,CAAiC;QAC/DH,EAAE;QACFI,QAAQ,EAAEb,MAAM,CAACS,EAAE;QACnBK,IAAI,EAAEd,MAAM,CAACc,IAAI;QACjBC,OAAO,EAAE;MACb,CAAC,CAAC;MACF,OAAO,IAAAC,kDAAwB,EAACL,KAAK,CAAC;IAC1C,CAAC,CAAC,OAAON,EAAE,EAAE;MACT,MAAM,IAAIE,cAAW,CACjB,yBAAyBF,EAAE,CAACY,OAAO,EAAE,EACrCZ,EAAE,CAACa,IAAI,IAAI,kBAAkB,EAC7B;QACI,GAAGb,EAAE,CAACc;MACV,CACJ,CAAC;IACL;EACJ;AACJ;AAACC,OAAA,CAAAtB,gBAAA,GAAAA,gBAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_error","_interopRequireDefault","require","_lockRecordDatabaseId","_validateSameIdentity","_apiSecurity","UnlockEntryUseCase","constructor","params","getLockRecordUseCase","kickOutCurrentUserUseCase","getManager","getIdentity","hasFullAccess","execute","record","WebinyError","kickOutCurrentUser","validateSameIdentity","target","lockedBy","ex","force","NotAuthorizedError","manager","delete","createLockRecordDatabaseId","id","message","code","data","exports"],"sources":["UnlockEntryUseCase.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n IUnlockEntryUseCase,\n IUnlockEntryUseCaseExecuteParams\n} from \"~/abstractions/IUnlockEntryUseCase\";\nimport {\n IGetIdentity,\n IHasFullAccessCallable,\n IRecordLockingLockRecord,\n IRecordLockingModelManager\n} from \"~/types\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { validateSameIdentity } from \"~/utils/validateSameIdentity\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport { IKickOutCurrentUserUseCase } from \"~/abstractions/IKickOutCurrentUserUseCase\";\n\nexport interface IUnlockEntryUseCaseParams {\n readonly getLockRecordUseCase: IGetLockRecordUseCase;\n readonly kickOutCurrentUserUseCase: IKickOutCurrentUserUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n getIdentity: IGetIdentity;\n hasFullAccess: IHasFullAccessCallable;\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 hasFullAccess: IHasFullAccessCallable;\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.hasFullAccess = params.hasFullAccess;\n }\n\n public async execute(\n params: IUnlockEntryUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord> {\n const record = await this.getLockRecordUseCase.execute(params);\n if (!record) {\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 hasFullAccess = await this.hasFullAccess();\n if (ex instanceof NotAuthorizedError === false || !hasFullAccess) {\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\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;AAWO,MAAMI,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,aAAa,GAAGL,MAAM,CAACK,aAAa;EAC7C;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,MAAM,IAAIC,cAAW,CAAC,wBAAwB,EAAE,uBAAuB,EAAE;QACrE,GAAGR;MACP,CAAC,CAAC;IACN;;IAEA;AACR;AACA;AACA;AACA;AACA;IACQ,IAAIS,kBAAkB,GAAG,KAAK;IAC9B,IAAI;MACA,IAAAC,0CAAoB,EAAC;QACjBN,WAAW,EAAE,IAAI,CAACA,WAAW;QAC7BO,MAAM,EAAEJ,MAAM,CAACK;MACnB,CAAC,CAAC;IACN,CAAC,CAAC,OAAOC,EAAE,EAAE;MACT,IAAI,CAACb,MAAM,CAACc,KAAK,EAAE;QACf,MAAMD,EAAE;MACZ;MACA,MAAMR,aAAa,GAAG,MAAM,IAAI,CAACA,aAAa,CAAC,CAAC;MAChD,IAAIQ,EAAE,YAAYE,+BAAkB,KAAK,KAAK,IAAI,CAACV,aAAa,EAAE;QAC9D,MAAMQ,EAAE;MACZ;MAEAJ,kBAAkB,GAAG,IAAI;IAC7B;IAEA,IAAI;MACA,MAAMO,OAAO,GAAG,MAAM,IAAI,CAACb,UAAU,CAAC,CAAC;MACvC,MAAMa,OAAO,CAACC,MAAM,CAAC,IAAAC,gDAA0B,EAAClB,MAAM,CAACmB,EAAE,CAAC,CAAC;MAE3D,IAAI,CAACV,kBAAkB,EAAE;QACrB,OAAOF,MAAM;MACjB;MACA,MAAM,IAAI,CAACL,yBAAyB,CAACI,OAAO,CAACC,MAAM,CAAC;MACpD,OAAOA,MAAM;IACjB,CAAC,CAAC,OAAOM,EAAE,EAAE;MACT,MAAM,IAAIL,cAAW,CAChB,2BAA0BK,EAAE,CAACO,OAAQ,EAAC,EACvCP,EAAE,CAACQ,IAAI,IAAI,oBAAoB,EAC/B;QACI,GAAGR,EAAE,CAACS;MACV,CACJ,CAAC;IACL;EACJ;AACJ;AAACC,OAAA,CAAAzB,kBAAA,GAAAA,kBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_error","_interopRequireDefault","require","_lockRecordDatabaseId","_validateSameIdentity","_apiSecurity","UnlockEntryUseCase","constructor","params","getLockRecordUseCase","kickOutCurrentUserUseCase","getManager","getIdentity","hasFullAccess","execute","record","WebinyError","kickOutCurrentUser","validateSameIdentity","target","lockedBy","ex","force","NotAuthorizedError","manager","delete","createLockRecordDatabaseId","id","message","code","data","exports"],"sources":["UnlockEntryUseCase.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n IUnlockEntryUseCase,\n IUnlockEntryUseCaseExecuteParams\n} from \"~/abstractions/IUnlockEntryUseCase\";\nimport {\n IGetIdentity,\n IHasFullAccessCallable,\n IRecordLockingLockRecord,\n IRecordLockingModelManager\n} from \"~/types\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { validateSameIdentity } from \"~/utils/validateSameIdentity\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport { IKickOutCurrentUserUseCase } from \"~/abstractions/IKickOutCurrentUserUseCase\";\n\nexport interface IUnlockEntryUseCaseParams {\n readonly getLockRecordUseCase: IGetLockRecordUseCase;\n readonly kickOutCurrentUserUseCase: IKickOutCurrentUserUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n getIdentity: IGetIdentity;\n hasFullAccess: IHasFullAccessCallable;\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 hasFullAccess: IHasFullAccessCallable;\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.hasFullAccess = params.hasFullAccess;\n }\n\n public async execute(\n params: IUnlockEntryUseCaseExecuteParams\n ): Promise<IRecordLockingLockRecord> {\n const record = await this.getLockRecordUseCase.execute(params);\n if (!record) {\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 hasFullAccess = await this.hasFullAccess();\n if (ex instanceof NotAuthorizedError === false || !hasFullAccess) {\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\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;AAWO,MAAMI,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,aAAa,GAAGL,MAAM,CAACK,aAAa;EAC7C;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,MAAM,IAAIC,cAAW,CAAC,wBAAwB,EAAE,uBAAuB,EAAE;QACrE,GAAGR;MACP,CAAC,CAAC;IACN;;IAEA;AACR;AACA;AACA;AACA;AACA;IACQ,IAAIS,kBAAkB,GAAG,KAAK;IAC9B,IAAI;MACA,IAAAC,0CAAoB,EAAC;QACjBN,WAAW,EAAE,IAAI,CAACA,WAAW;QAC7BO,MAAM,EAAEJ,MAAM,CAACK;MACnB,CAAC,CAAC;IACN,CAAC,CAAC,OAAOC,EAAE,EAAE;MACT,IAAI,CAACb,MAAM,CAACc,KAAK,EAAE;QACf,MAAMD,EAAE;MACZ;MACA,MAAMR,aAAa,GAAG,MAAM,IAAI,CAACA,aAAa,CAAC,CAAC;MAChD,IAAIQ,EAAE,YAAYE,+BAAkB,KAAK,KAAK,IAAI,CAACV,aAAa,EAAE;QAC9D,MAAMQ,EAAE;MACZ;MAEAJ,kBAAkB,GAAG,IAAI;IAC7B;IAEA,IAAI;MACA,MAAMO,OAAO,GAAG,MAAM,IAAI,CAACb,UAAU,CAAC,CAAC;MACvC,MAAMa,OAAO,CAACC,MAAM,CAAC,IAAAC,gDAA0B,EAAClB,MAAM,CAACmB,EAAE,CAAC,CAAC;MAE3D,IAAI,CAACV,kBAAkB,EAAE;QACrB,OAAOF,MAAM;MACjB;MACA,MAAM,IAAI,CAACL,yBAAyB,CAACI,OAAO,CAACC,MAAM,CAAC;MACpD,OAAOA,MAAM;IACjB,CAAC,CAAC,OAAOM,EAAE,EAAE;MACT,MAAM,IAAIL,cAAW,CACjB,2BAA2BK,EAAE,CAACO,OAAO,EAAE,EACvCP,EAAE,CAACQ,IAAI,IAAI,oBAAoB,EAC/B;QACI,GAAGR,EAAE,CAACS;MACV,CACJ,CAAC;IACL;EACJ;AACJ;AAACC,OAAA,CAAAzB,kBAAA,GAAAA,kBAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["_error","require","_convertEntryToLockRecord","_lockRecordDatabaseId","_utils","_validateSameIdentity","UpdateEntryLockUseCase","constructor","params","getLockRecordUseCase","lockEntryUseCase","getManager","getIdentity","execute","record","validateSameIdentity","target","lockedBy","manager","entryId","createLockRecordDatabaseId","id","createIdentifier","version","result","update","savedOn","Date","toISOString","convertEntryToLockRecord","ex","WebinyError","message","code","data","exports"],"sources":["UpdateEntryLockUseCase.ts"],"sourcesContent":["import {\n IUpdateEntryLockUseCase,\n IUpdateEntryLockUseCaseExecuteParams\n} from \"~/abstractions/IUpdateEntryLockUseCase\";\nimport { IGetIdentity, IRecordLockingLockRecord, IRecordLockingModelManager } from \"~/types\";\nimport { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { WebinyError } from \"@webiny/error\";\nimport { convertEntryToLockRecord } from \"~/utils/convertEntryToLockRecord\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport { validateSameIdentity } from \"~/utils/validateSameIdentity\";\nimport { ILockEntryUseCase } from \"~/abstractions/ILockEntryUseCase\";\n\nexport interface IUpdateEntryLockUseCaseParams {\n readonly getLockRecordUseCase: IGetLockRecordUseCase;\n readonly lockEntryUseCase: ILockEntryUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n getIdentity: IGetIdentity;\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\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 }\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 convertEntryToLockRecord(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,yBAAA,GAAAD,OAAA;AACA,IAAAE,qBAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,qBAAA,GAAAJ,OAAA;AAUO,MAAMK,sBAAsB,CAAoC;EAM5DC,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;EACzC;EAEA,MAAaC,OAAOA,CAChBL,MAA4C,EACX;IACjC,MAAMM,MAAM,GAAG,MAAM,IAAI,CAACL,oBAAoB,CAACI,OAAO,CAACL,MAAM,CAAC;IAC9D,IAAI,CAACM,MAAM,EAAE;MACT,OAAO,IAAI,CAACJ,gBAAgB,CAACG,OAAO,CAACL,MAAM,CAAC;IAChD;IAEA,IAAAO,0CAAoB,EAAC;MACjBH,WAAW,EAAE,IAAI,CAACA,WAAW;MAC7BI,MAAM,EAAEF,MAAM,CAACG;IACnB,CAAC,CAAC;IAEF,IAAI;MACA,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACP,UAAU,CAAC,CAAC;MAEvC,MAAMQ,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,IAAAC,kDAAwB,EAACL,MAAM,CAAC;IAC3C,CAAC,CAAC,OAAOM,EAAE,EAAE;MACT,MAAM,IAAIC,kBAAW,CAChB,gCAA+BD,EAAE,CAACE,OAAQ,EAAC,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","_convertEntryToLockRecord","_lockRecordDatabaseId","_utils","_validateSameIdentity","UpdateEntryLockUseCase","constructor","params","getLockRecordUseCase","lockEntryUseCase","getManager","getIdentity","execute","record","validateSameIdentity","target","lockedBy","manager","entryId","createLockRecordDatabaseId","id","createIdentifier","version","result","update","savedOn","Date","toISOString","convertEntryToLockRecord","ex","WebinyError","message","code","data","exports"],"sources":["UpdateEntryLockUseCase.ts"],"sourcesContent":["import {\n IUpdateEntryLockUseCase,\n IUpdateEntryLockUseCaseExecuteParams\n} from \"~/abstractions/IUpdateEntryLockUseCase\";\nimport { IGetIdentity, IRecordLockingLockRecord, IRecordLockingModelManager } from \"~/types\";\nimport { IGetLockRecordUseCase } from \"~/abstractions/IGetLockRecordUseCase\";\nimport { WebinyError } from \"@webiny/error\";\nimport { convertEntryToLockRecord } from \"~/utils/convertEntryToLockRecord\";\nimport { createLockRecordDatabaseId } from \"~/utils/lockRecordDatabaseId\";\nimport { createIdentifier } from \"@webiny/utils\";\nimport { validateSameIdentity } from \"~/utils/validateSameIdentity\";\nimport { ILockEntryUseCase } from \"~/abstractions/ILockEntryUseCase\";\n\nexport interface IUpdateEntryLockUseCaseParams {\n readonly getLockRecordUseCase: IGetLockRecordUseCase;\n readonly lockEntryUseCase: ILockEntryUseCase;\n getManager(): Promise<IRecordLockingModelManager>;\n getIdentity: IGetIdentity;\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\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 }\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 convertEntryToLockRecord(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,yBAAA,GAAAD,OAAA;AACA,IAAAE,qBAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,qBAAA,GAAAJ,OAAA;AAUO,MAAMK,sBAAsB,CAAoC;EAM5DC,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;EACzC;EAEA,MAAaC,OAAOA,CAChBL,MAA4C,EACX;IACjC,MAAMM,MAAM,GAAG,MAAM,IAAI,CAACL,oBAAoB,CAACI,OAAO,CAACL,MAAM,CAAC;IAC9D,IAAI,CAACM,MAAM,EAAE;MACT,OAAO,IAAI,CAACJ,gBAAgB,CAACG,OAAO,CAACL,MAAM,CAAC;IAChD;IAEA,IAAAO,0CAAoB,EAAC;MACjBH,WAAW,EAAE,IAAI,CAACA,WAAW;MAC7BI,MAAM,EAAEF,MAAM,CAACG;IACnB,CAAC,CAAC;IAEF,IAAI;MACA,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACP,UAAU,CAAC,CAAC;MAEvC,MAAMQ,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,IAAAC,kDAAwB,EAACL,MAAM,CAAC;IAC3C,CAAC,CAAC,OAAOM,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 +1 @@
1
- {"version":3,"names":["_utils","require","WBY_LM_PREFIX","createLockRecordDatabaseId","input","id","parseIdentifier","startsWith","exports","removeLockRecordDatabasePrefix","replace"],"sources":["lockRecordDatabaseId.ts"],"sourcesContent":["import { parseIdentifier } from \"@webiny/utils\";\n\nconst WBY_LM_PREFIX = \"wby-lm-\";\n\nexport const createLockRecordDatabaseId = (input: string): string => {\n const { id } = parseIdentifier(input);\n if (id.startsWith(WBY_LM_PREFIX)) {\n return id;\n }\n return `${WBY_LM_PREFIX}${id}`;\n};\n\nexport const removeLockRecordDatabasePrefix = (id: string) => {\n return id.replace(WBY_LM_PREFIX, \"\");\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,MAAMC,aAAa,GAAG,SAAS;AAExB,MAAMC,0BAA0B,GAAIC,KAAa,IAAa;EACjE,MAAM;IAAEC;EAAG,CAAC,GAAG,IAAAC,sBAAe,EAACF,KAAK,CAAC;EACrC,IAAIC,EAAE,CAACE,UAAU,CAACL,aAAa,CAAC,EAAE;IAC9B,OAAOG,EAAE;EACb;EACA,OAAQ,GAAEH,aAAc,GAAEG,EAAG,EAAC;AAClC,CAAC;AAACG,OAAA,CAAAL,0BAAA,GAAAA,0BAAA;AAEK,MAAMM,8BAA8B,GAAIJ,EAAU,IAAK;EAC1D,OAAOA,EAAE,CAACK,OAAO,CAACR,aAAa,EAAE,EAAE,CAAC;AACxC,CAAC;AAACM,OAAA,CAAAC,8BAAA,GAAAA,8BAAA","ignoreList":[]}
1
+ {"version":3,"names":["_utils","require","WBY_LM_PREFIX","createLockRecordDatabaseId","input","id","parseIdentifier","startsWith","exports","removeLockRecordDatabasePrefix","replace"],"sources":["lockRecordDatabaseId.ts"],"sourcesContent":["import { parseIdentifier } from \"@webiny/utils\";\n\nconst WBY_LM_PREFIX = \"wby-lm-\";\n\nexport const createLockRecordDatabaseId = (input: string): string => {\n const { id } = parseIdentifier(input);\n if (id.startsWith(WBY_LM_PREFIX)) {\n return id;\n }\n return `${WBY_LM_PREFIX}${id}`;\n};\n\nexport const removeLockRecordDatabasePrefix = (id: string) => {\n return id.replace(WBY_LM_PREFIX, \"\");\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,MAAMC,aAAa,GAAG,SAAS;AAExB,MAAMC,0BAA0B,GAAIC,KAAa,IAAa;EACjE,MAAM;IAAEC;EAAG,CAAC,GAAG,IAAAC,sBAAe,EAACF,KAAK,CAAC;EACrC,IAAIC,EAAE,CAACE,UAAU,CAACL,aAAa,CAAC,EAAE;IAC9B,OAAOG,EAAE;EACb;EACA,OAAO,GAAGH,aAAa,GAAGG,EAAE,EAAE;AAClC,CAAC;AAACG,OAAA,CAAAL,0BAAA,GAAAA,0BAAA;AAEK,MAAMM,8BAA8B,GAAIJ,EAAU,IAAK;EAC1D,OAAOA,EAAE,CAACK,OAAO,CAACR,aAAa,EAAE,EAAE,CAAC;AACxC,CAAC;AAACM,OAAA,CAAAC,8BAAA,GAAAA,8BAAA","ignoreList":[]}