@webiny/api-headless-cms 6.5.0-beta.0 → 6.5.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.
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.d.ts +1 -3
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js +4 -12
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js.map +1 -1
- package/features/contentEntry/CreateEntryRevisionFrom/abstractions.d.ts +2 -0
- package/features/contentEntry/CreateEntryRevisionFrom/abstractions.js.map +1 -1
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.d.ts +1 -3
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.js +4 -10
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js +3 -1
- package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js +3 -1
- package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js +3 -1
- package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js.map +1 -1
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.d.ts +5 -3
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js +40 -14
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/abstractions.d.ts +17 -1
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/abstractions.js.map +1 -1
- package/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/CreatePublishEntryDataFactory.d.ts +5 -3
- package/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/CreatePublishEntryDataFactory.js +22 -16
- package/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/CreatePublishEntryDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/abstractions.d.ts +15 -1
- package/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/abstractions.js.map +1 -1
- package/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/CreateRepublishEntryDataFactory.d.ts +5 -3
- package/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/CreateRepublishEntryDataFactory.js +17 -13
- package/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/CreateRepublishEntryDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/abstractions.d.ts +13 -1
- package/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/abstractions.js.map +1 -1
- package/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/CreateUnpublishEntryDataFactory.d.ts +6 -6
- package/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/CreateUnpublishEntryDataFactory.js +17 -18
- package/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/CreateUnpublishEntryDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/abstractions.d.ts +14 -2
- package/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/abstractions.js.map +1 -1
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.d.ts +5 -3
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js +66 -29
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/abstractions.d.ts +15 -1
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/abstractions.js.map +1 -1
- package/features/contentEntry/entryDataFactories/hasEntryContentChanged.d.ts +24 -0
- package/features/contentEntry/entryDataFactories/hasEntryContentChanged.js +13 -0
- package/features/contentEntry/entryDataFactories/hasEntryContentChanged.js.map +1 -0
- package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js +1 -1
- package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js.map +1 -1
- package/features/graphql/fields/base/AssetToGraphQL.js +7 -2
- package/features/graphql/fields/base/AssetToGraphQL.js.map +1 -1
- package/package.json +18 -18
|
@@ -3,17 +3,15 @@ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.j
|
|
|
3
3
|
import { CreateEntryRevisionFromRepository, CreateEntryRevisionFromUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
4
4
|
import { AccessControl } from "../../../features/shared/abstractions.js";
|
|
5
5
|
import { GetRevisionByIdUseCase } from "../../../features/contentEntry/GetRevisionById/index.js";
|
|
6
|
-
import { GetLatestRevisionByEntryIdUseCase } from "../../../features/contentEntry/GetLatestRevisionByEntryId/index.js";
|
|
7
6
|
import type { CmsEntry, CmsEntryValues, CmsModel, CreateCmsEntryInput, CreateCmsEntryOptionsInput } from "../../../types/index.js";
|
|
8
7
|
import { CreateEntryRevisionFromDataFactory } from "../../../features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/index.js";
|
|
9
8
|
declare class CreateEntryRevisionFromUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
10
9
|
private repository;
|
|
11
10
|
private accessControl;
|
|
12
11
|
private getRevisionById;
|
|
13
|
-
private getLatestRevision;
|
|
14
12
|
private eventPublisher;
|
|
15
13
|
private createEntryRevisionFromDataFactory;
|
|
16
|
-
constructor(repository: CreateEntryRevisionFromRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface,
|
|
14
|
+
constructor(repository: CreateEntryRevisionFromRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface, eventPublisher: EventPublisher.Interface, createEntryRevisionFromDataFactory: CreateEntryRevisionFromDataFactory.Interface);
|
|
17
15
|
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, sourceId: string, rawInput: CreateCmsEntryInput<T>, options?: CreateCmsEntryOptionsInput): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
|
|
18
16
|
}
|
|
19
17
|
export declare const CreateEntryRevisionFromUseCase: import("@webiny/di").Implementation<typeof CreateEntryRevisionFromUseCaseImpl>;
|
|
@@ -3,17 +3,14 @@ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.j
|
|
|
3
3
|
import { CreateEntryRevisionFromRepository, CreateEntryRevisionFromUseCase } from "./abstractions.js";
|
|
4
4
|
import { AccessControl } from "../../shared/abstractions.js";
|
|
5
5
|
import { GetRevisionByIdUseCase } from "../GetRevisionById/index.js";
|
|
6
|
-
import { GetLatestRevisionByEntryIdUseCase } from "../GetLatestRevisionByEntryId/index.js";
|
|
7
6
|
import { EntryRevisionAfterCreateEvent, EntryRevisionBeforeCreateEvent, EntryRevisionCreateErrorEvent } from "./events.js";
|
|
8
7
|
import { EntryNotAuthorizedError } from "../../../domain/contentEntry/errors.js";
|
|
9
|
-
import { parseIdentifier } from "@webiny/utils";
|
|
10
8
|
import { CreateEntryRevisionFromDataFactory } from "../entryDataFactories/CreateEntryRevisionFromDataFactory/index.js";
|
|
11
9
|
class CreateEntryRevisionFromUseCaseImpl {
|
|
12
|
-
constructor(repository, accessControl, getRevisionById,
|
|
10
|
+
constructor(repository, accessControl, getRevisionById, eventPublisher, createEntryRevisionFromDataFactory){
|
|
13
11
|
this.repository = repository;
|
|
14
12
|
this.accessControl = accessControl;
|
|
15
13
|
this.getRevisionById = getRevisionById;
|
|
16
|
-
this.getLatestRevision = getLatestRevision;
|
|
17
14
|
this.eventPublisher = eventPublisher;
|
|
18
15
|
this.createEntryRevisionFromDataFactory = createEntryRevisionFromDataFactory;
|
|
19
16
|
}
|
|
@@ -23,16 +20,12 @@ class CreateEntryRevisionFromUseCaseImpl {
|
|
|
23
20
|
rwd: "w"
|
|
24
21
|
});
|
|
25
22
|
if (!canAccess) return Result.fail(EntryNotAuthorizedError.fromModel(model));
|
|
26
|
-
const { id: uniqueId } = parseIdentifier(sourceId);
|
|
27
23
|
const originalResult = await this.getRevisionById.execute(model, sourceId);
|
|
28
24
|
if (originalResult.isFail()) return Result.fail(originalResult.error);
|
|
29
25
|
const originalEntry = originalResult.value;
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
if (latestResult.isFail()) return Result.fail(latestResult.error);
|
|
34
|
-
const latestStorageEntry = latestResult.value;
|
|
35
|
-
const { entry, input } = await this.createEntryRevisionFromDataFactory.create(sourceId, model, rawInput, originalEntry, latestStorageEntry, options);
|
|
26
|
+
const dataResult = await this.createEntryRevisionFromDataFactory.create(sourceId, model, rawInput, originalEntry, options);
|
|
27
|
+
if (dataResult.isFail()) return Result.fail(dataResult.error);
|
|
28
|
+
const { entry, input } = dataResult.value;
|
|
36
29
|
const canAccessEntry = await this.accessControl.canAccessEntry({
|
|
37
30
|
model,
|
|
38
31
|
entry,
|
|
@@ -84,7 +77,6 @@ const CreateEntryRevisionFromUseCase_CreateEntryRevisionFromUseCase = createImpl
|
|
|
84
77
|
CreateEntryRevisionFromRepository,
|
|
85
78
|
AccessControl,
|
|
86
79
|
GetRevisionByIdUseCase,
|
|
87
|
-
GetLatestRevisionByEntryIdUseCase,
|
|
88
80
|
EventPublisher,
|
|
89
81
|
CreateEntryRevisionFromDataFactory
|
|
90
82
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js","sources":["../../../../src/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n CreateEntryRevisionFromRepository,\n CreateEntryRevisionFromUseCase as UseCaseAbstraction\n} from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport
|
|
1
|
+
{"version":3,"file":"features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js","sources":["../../../../src/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n CreateEntryRevisionFromRepository,\n CreateEntryRevisionFromUseCase as UseCaseAbstraction\n} from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport {\n EntryRevisionAfterCreateEvent,\n EntryRevisionBeforeCreateEvent,\n EntryRevisionCreateErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { CreateEntryRevisionFromDataFactory } from \"~/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/index.js\";\n\nclass CreateEntryRevisionFromUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: CreateEntryRevisionFromRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private createEntryRevisionFromDataFactory: CreateEntryRevisionFromDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n sourceId: string,\n rawInput: CreateCmsEntryInput<T>,\n options?: CreateCmsEntryOptionsInput\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const originalResult = await this.getRevisionById.execute<T>(model, sourceId);\n\n if (originalResult.isFail()) {\n return Result.fail(originalResult.error);\n }\n\n const originalEntry = originalResult.value;\n\n const dataResult = await this.createEntryRevisionFromDataFactory.create<T>(\n sourceId,\n model,\n rawInput,\n originalEntry,\n options\n );\n if (dataResult.isFail()) {\n return Result.fail(dataResult.error);\n }\n const { entry, input } = dataResult.value;\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry,\n rwd: \"w\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n try {\n await this.eventPublisher.publish(\n new EntryRevisionBeforeCreateEvent({\n entry,\n model,\n input,\n original: originalEntry\n })\n );\n\n const result = await this.repository.execute<T>(model, entry);\n\n if (result.isFail()) {\n await this.eventPublisher.publish(\n new EntryRevisionCreateErrorEvent({\n entry,\n model,\n input,\n original: originalEntry,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n const createdEntry = result.value;\n\n await this.eventPublisher.publish(\n new EntryRevisionAfterCreateEvent({\n entry: createdEntry,\n model,\n input,\n original: originalEntry\n })\n );\n\n return Result.ok(createdEntry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryRevisionCreateErrorEvent({\n entry,\n model,\n input,\n original: originalEntry,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const CreateEntryRevisionFromUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: CreateEntryRevisionFromUseCaseImpl,\n dependencies: [\n CreateEntryRevisionFromRepository,\n AccessControl,\n GetRevisionByIdUseCase,\n EventPublisher,\n CreateEntryRevisionFromDataFactory\n ]\n});\n"],"names":["CreateEntryRevisionFromUseCaseImpl","repository","accessControl","getRevisionById","eventPublisher","createEntryRevisionFromDataFactory","model","sourceId","rawInput","options","canAccess","Result","EntryNotAuthorizedError","originalResult","originalEntry","dataResult","entry","input","canAccessEntry","EntryRevisionBeforeCreateEvent","result","EntryRevisionCreateErrorEvent","createdEntry","EntryRevisionAfterCreateEvent","error","CreateEntryRevisionFromUseCase","createImplementation","UseCaseAbstraction","CreateEntryRevisionFromRepository","AccessControl","GetRevisionByIdUseCase","EventPublisher","CreateEntryRevisionFromDataFactory"],"mappings":";;;;;;;;AAuBA,MAAMA;IACF,YACYC,UAAuD,EACvDC,aAAsC,EACtCC,eAAiD,EACjDC,cAAwC,EACxCC,kCAAgF,CAC1F;aALUJ,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;aACAC,kCAAkC,GAAlCA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,QAAgB,EAChBC,QAAgC,EAChCC,OAAoC,EACkB;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEJ;YAAO,KAAK;QAAI;QAC5E,IAAI,CAACI,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACN;QAGzD,MAAMO,iBAAiB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIP,OAAOC;QAEpE,IAAIM,eAAe,MAAM,IACrB,OAAOF,OAAO,IAAI,CAACE,eAAe,KAAK;QAG3C,MAAMC,gBAAgBD,eAAe,KAAK;QAE1C,MAAME,aAAa,MAAM,IAAI,CAAC,kCAAkC,CAAC,MAAM,CACnER,UACAD,OACAE,UACAM,eACAL;QAEJ,IAAIM,WAAW,MAAM,IACjB,OAAOJ,OAAO,IAAI,CAACI,WAAW,KAAK;QAEvC,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF,WAAW,KAAK;QAEzC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DZ;YACAU;YACA,KAAK;QACT;QAEA,IAAI,CAACE,gBACD,OAAOP,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACN;QAGzD,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIa,+BAA+B;gBAC/BH;gBACAV;gBACAW;gBACA,UAAUH;YACd;YAGJ,MAAMM,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAId,OAAOU;YAEvD,IAAII,OAAO,MAAM,IAAI;gBACjB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,8BAA8B;oBAC9BL;oBACAV;oBACAW;oBACA,UAAUH;oBACV,OAAOM,OAAO,KAAK;gBACvB;gBAEJ,OAAOT,OAAO,IAAI,CAACS,OAAO,KAAK;YACnC;YAEA,MAAME,eAAeF,OAAO,KAAK;YAEjC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,8BAA8B;gBAC9B,OAAOD;gBACPhB;gBACAW;gBACA,UAAUH;YACd;YAGJ,OAAOH,OAAO,EAAE,CAACW;QACrB,EAAE,OAAOE,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,8BAA8B;gBAC9BL;gBACAV;gBACAW;gBACA,UAAUH;gBACV,OAAOU;YACX;YAEJ,OAAOb,OAAO,IAAI,CAACa;QACvB;IACJ;AACJ;AAEO,MAAMC,gEAAiCC,qBAAqB;IAC/D,aAAaC;IACb,gBAAgB3B;IAChB,cAAc;QACV4B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NotAuthorizedError } from "../../../utils/errors.js";
|
|
1
2
|
import { Result } from "@webiny/feature/api";
|
|
2
3
|
import type { CmsEntry, CmsEntryValues, CmsModel, CreateCmsEntryInput, CreateCmsEntryOptionsInput } from "../../../types/index.js";
|
|
3
4
|
import type { EntryNotAuthorizedError, EntryNotFoundError, EntryPersistenceError, EntryValidationError } from "../../../domain/contentEntry/errors.js";
|
|
@@ -12,6 +13,7 @@ export interface ICreateEntryRevisionFromUseCaseErrors {
|
|
|
12
13
|
notFound: EntryNotFoundError;
|
|
13
14
|
validation: EntryValidationError;
|
|
14
15
|
storage: EntryPersistenceError;
|
|
16
|
+
notAuthorizedStatus: NotAuthorizedError;
|
|
15
17
|
}
|
|
16
18
|
type UseCaseError = ICreateEntryRevisionFromUseCaseErrors[keyof ICreateEntryRevisionFromUseCaseErrors];
|
|
17
19
|
/** Create a new entry revision from an existing one. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/CreateEntryRevisionFrom/abstractions.js","sources":["../../../../src/features/contentEntry/CreateEntryRevisionFrom/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport type {\n EntryNotAuthorizedError,\n EntryNotFoundError,\n EntryPersistenceError,\n EntryValidationError\n} from \"~/domain/contentEntry/errors.js\";\n\n/**\n * CreateEntryRevisionFrom Use Case - Creates a new revision from an existing entry.\n */\nexport interface ICreateEntryRevisionFromUseCase {\n execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n sourceId: string,\n input: CreateCmsEntryInput<T>,\n options?: CreateCmsEntryOptionsInput\n ): Promise<Result<CmsEntry<T>, UseCaseError>>;\n}\n\nexport interface ICreateEntryRevisionFromUseCaseErrors {\n notAuthorized: EntryNotAuthorizedError;\n notFound: EntryNotFoundError;\n validation: EntryValidationError;\n storage: EntryPersistenceError;\n}\n\ntype UseCaseError =\n ICreateEntryRevisionFromUseCaseErrors[keyof ICreateEntryRevisionFromUseCaseErrors];\n\n/** Create a new entry revision from an existing one. */\nexport const CreateEntryRevisionFromUseCase = createAbstraction<ICreateEntryRevisionFromUseCase>(\n \"CreateEntryRevisionFromUseCase\"\n);\n\nexport namespace CreateEntryRevisionFromUseCase {\n export type Interface = ICreateEntryRevisionFromUseCase;\n export type Input<T extends CmsEntryValues = CmsEntryValues> = CreateCmsEntryInput<T>;\n export type Options = CreateCmsEntryOptionsInput;\n\n export type Return<T extends CmsEntryValues = CmsEntryValues> = Promise<\n Result<CmsEntry<T>, UseCaseError>\n >;\n export type Error = UseCaseError;\n}\n\n/**\n * Payload for before create revision event\n */\nexport interface EntryRevisionBeforeCreateEventPayload {\n entry: CmsEntry;\n model: CmsModel;\n input: CreateCmsEntryInput;\n original: CmsEntry;\n}\n\n/**\n * Payload for after create revision event\n */\nexport interface EntryRevisionAfterCreateEventPayload {\n entry: CmsEntry;\n model: CmsModel;\n input: CreateCmsEntryInput;\n original: CmsEntry;\n}\n\n/**\n * Payload for create revision error event\n */\nexport interface EntryRevisionCreateErrorEventPayload {\n entry: CmsEntry;\n model: CmsModel;\n input: CreateCmsEntryInput;\n original: CmsEntry;\n error: Error;\n}\n\n/**\n * CreateEntryRevisionFromRepository - Handles storage operations for creating entry revisions.\n */\nexport interface ICreateEntryRevisionFromRepository {\n execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n entry: CmsEntry<T>\n ): Promise<Result<CmsEntry<T>, RepositoryError>>;\n}\n\nexport interface ICreateEntryRevisionFromRepositoryErrors {\n storage: EntryPersistenceError;\n}\n\ntype RepositoryError =\n ICreateEntryRevisionFromRepositoryErrors[keyof ICreateEntryRevisionFromRepositoryErrors];\n\nexport const CreateEntryRevisionFromRepository =\n createAbstraction<ICreateEntryRevisionFromRepository>(\"CreateEntryRevisionFromRepository\");\n\nexport namespace CreateEntryRevisionFromRepository {\n export type Interface = ICreateEntryRevisionFromRepository;\n export type Error = RepositoryError;\n}\n"],"names":["CreateEntryRevisionFromUseCase","createAbstraction","CreateEntryRevisionFromRepository"],"mappings":";
|
|
1
|
+
{"version":3,"file":"features/contentEntry/CreateEntryRevisionFrom/abstractions.js","sources":["../../../../src/features/contentEntry/CreateEntryRevisionFrom/abstractions.ts"],"sourcesContent":["import type { NotAuthorizedError } from \"~/utils/errors.js\";\nimport { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport type {\n EntryNotAuthorizedError,\n EntryNotFoundError,\n EntryPersistenceError,\n EntryValidationError\n} from \"~/domain/contentEntry/errors.js\";\n\n/**\n * CreateEntryRevisionFrom Use Case - Creates a new revision from an existing entry.\n */\nexport interface ICreateEntryRevisionFromUseCase {\n execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n sourceId: string,\n input: CreateCmsEntryInput<T>,\n options?: CreateCmsEntryOptionsInput\n ): Promise<Result<CmsEntry<T>, UseCaseError>>;\n}\n\nexport interface ICreateEntryRevisionFromUseCaseErrors {\n notAuthorized: EntryNotAuthorizedError;\n notFound: EntryNotFoundError;\n validation: EntryValidationError;\n storage: EntryPersistenceError;\n notAuthorizedStatus: NotAuthorizedError;\n}\n\ntype UseCaseError =\n ICreateEntryRevisionFromUseCaseErrors[keyof ICreateEntryRevisionFromUseCaseErrors];\n\n/** Create a new entry revision from an existing one. */\nexport const CreateEntryRevisionFromUseCase = createAbstraction<ICreateEntryRevisionFromUseCase>(\n \"CreateEntryRevisionFromUseCase\"\n);\n\nexport namespace CreateEntryRevisionFromUseCase {\n export type Interface = ICreateEntryRevisionFromUseCase;\n export type Input<T extends CmsEntryValues = CmsEntryValues> = CreateCmsEntryInput<T>;\n export type Options = CreateCmsEntryOptionsInput;\n\n export type Return<T extends CmsEntryValues = CmsEntryValues> = Promise<\n Result<CmsEntry<T>, UseCaseError>\n >;\n export type Error = UseCaseError;\n}\n\n/**\n * Payload for before create revision event\n */\nexport interface EntryRevisionBeforeCreateEventPayload {\n entry: CmsEntry;\n model: CmsModel;\n input: CreateCmsEntryInput;\n original: CmsEntry;\n}\n\n/**\n * Payload for after create revision event\n */\nexport interface EntryRevisionAfterCreateEventPayload {\n entry: CmsEntry;\n model: CmsModel;\n input: CreateCmsEntryInput;\n original: CmsEntry;\n}\n\n/**\n * Payload for create revision error event\n */\nexport interface EntryRevisionCreateErrorEventPayload {\n entry: CmsEntry;\n model: CmsModel;\n input: CreateCmsEntryInput;\n original: CmsEntry;\n error: Error;\n}\n\n/**\n * CreateEntryRevisionFromRepository - Handles storage operations for creating entry revisions.\n */\nexport interface ICreateEntryRevisionFromRepository {\n execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n entry: CmsEntry<T>\n ): Promise<Result<CmsEntry<T>, RepositoryError>>;\n}\n\nexport interface ICreateEntryRevisionFromRepositoryErrors {\n storage: EntryPersistenceError;\n}\n\ntype RepositoryError =\n ICreateEntryRevisionFromRepositoryErrors[keyof ICreateEntryRevisionFromRepositoryErrors];\n\nexport const CreateEntryRevisionFromRepository =\n createAbstraction<ICreateEntryRevisionFromRepository>(\"CreateEntryRevisionFromRepository\");\n\nexport namespace CreateEntryRevisionFromRepository {\n export type Interface = ICreateEntryRevisionFromRepository;\n export type Error = RepositoryError;\n}\n"],"names":["CreateEntryRevisionFromUseCase","createAbstraction","CreateEntryRevisionFromRepository"],"mappings":";AAwCO,MAAMA,iCAAiCC,kBAC1C;AA8DG,MAAMC,oCACTD,kBAAsD"}
|
|
@@ -4,17 +4,15 @@ import { PublishEntryUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
|
4
4
|
import { PublishEntryRepository } from "./abstractions.js";
|
|
5
5
|
import { AccessControl } from "../../../features/shared/abstractions.js";
|
|
6
6
|
import { GetRevisionByIdUseCase } from "../../../features/contentEntry/GetRevisionById/index.js";
|
|
7
|
-
import { GetLatestRevisionByEntryIdUseCase } from "../../../features/contentEntry/GetLatestRevisionByEntryId/index.js";
|
|
8
7
|
import type { CmsEntry, CmsEntryValues, CmsModel } from "../../../types/index.js";
|
|
9
8
|
import { CreatePublishEntryDataFactory } from "../../../features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/index.js";
|
|
10
9
|
declare class PublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
11
10
|
private repository;
|
|
12
11
|
private accessControl;
|
|
13
12
|
private getRevisionById;
|
|
14
|
-
private getLatestRevision;
|
|
15
13
|
private eventPublisher;
|
|
16
14
|
private createPublishEntryDataFactory;
|
|
17
|
-
constructor(repository: PublishEntryRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface,
|
|
15
|
+
constructor(repository: PublishEntryRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface, eventPublisher: EventPublisher.Interface, createPublishEntryDataFactory: CreatePublishEntryDataFactory.Interface);
|
|
18
16
|
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
|
|
19
17
|
}
|
|
20
18
|
export declare const PublishEntryUseCase: import("@webiny/di").Implementation<typeof PublishEntryUseCaseImpl>;
|
|
@@ -3,16 +3,14 @@ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.j
|
|
|
3
3
|
import { PublishEntryRepository, PublishEntryUseCase } from "./abstractions.js";
|
|
4
4
|
import { AccessControl } from "../../shared/abstractions.js";
|
|
5
5
|
import { GetRevisionByIdUseCase } from "../GetRevisionById/index.js";
|
|
6
|
-
import { GetLatestRevisionByEntryIdUseCase } from "../GetLatestRevisionByEntryId/index.js";
|
|
7
6
|
import { EntryAfterPublishEvent, EntryBeforePublishEvent, EntryPublishErrorEvent } from "./events.js";
|
|
8
7
|
import { EntryNotAuthorizedError, EntryNotFoundError } from "../../../domain/contentEntry/errors.js";
|
|
9
8
|
import { CreatePublishEntryDataFactory } from "../entryDataFactories/CreatePublishEntryDataFactory/index.js";
|
|
10
9
|
class PublishEntryUseCaseImpl {
|
|
11
|
-
constructor(repository, accessControl, getRevisionById,
|
|
10
|
+
constructor(repository, accessControl, getRevisionById, eventPublisher, createPublishEntryDataFactory){
|
|
12
11
|
this.repository = repository;
|
|
13
12
|
this.accessControl = accessControl;
|
|
14
13
|
this.getRevisionById = getRevisionById;
|
|
15
|
-
this.getLatestRevision = getLatestRevision;
|
|
16
14
|
this.eventPublisher = eventPublisher;
|
|
17
15
|
this.createPublishEntryDataFactory = createPublishEntryDataFactory;
|
|
18
16
|
}
|
|
@@ -31,12 +29,9 @@ class PublishEntryUseCaseImpl {
|
|
|
31
29
|
pw: "p"
|
|
32
30
|
});
|
|
33
31
|
if (!canAccessEntry) return Result.fail(EntryNotAuthorizedError.fromModel(model));
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
if (latestResult.isFail()) return Result.fail(latestResult.error);
|
|
38
|
-
const latestEntry = latestResult.value;
|
|
39
|
-
const { entry } = await this.createPublishEntryDataFactory.create(model, originalEntry, latestEntry);
|
|
32
|
+
const dataResult = await this.createPublishEntryDataFactory.create(model, originalEntry);
|
|
33
|
+
if (dataResult.isFail()) return Result.fail(dataResult.error);
|
|
34
|
+
const { entry } = dataResult.value;
|
|
40
35
|
try {
|
|
41
36
|
await this.eventPublisher.publish(new EntryBeforePublishEvent({
|
|
42
37
|
entry,
|
|
@@ -78,7 +73,6 @@ const PublishEntryUseCase_PublishEntryUseCase = createImplementation({
|
|
|
78
73
|
PublishEntryRepository,
|
|
79
74
|
AccessControl,
|
|
80
75
|
GetRevisionByIdUseCase,
|
|
81
|
-
GetLatestRevisionByEntryIdUseCase,
|
|
82
76
|
EventPublisher,
|
|
83
77
|
CreatePublishEntryDataFactory
|
|
84
78
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/PublishEntry/PublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/PublishEntry/PublishEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { PublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { PublishEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport
|
|
1
|
+
{"version":3,"file":"features/contentEntry/PublishEntry/PublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/PublishEntry/PublishEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { PublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { PublishEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport {\n EntryBeforePublishEvent,\n EntryAfterPublishEvent,\n EntryPublishErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError, EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { CreatePublishEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/index.js\";\n\nclass PublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: PublishEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private createPublishEntryDataFactory: CreatePublishEntryDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, pw: \"p\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const result = await this.getRevisionById.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n const originalEntry = result.value;\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry: originalEntry,\n pw: \"p\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const dataResult = await this.createPublishEntryDataFactory.create<T>(model, originalEntry);\n if (dataResult.isFail()) {\n return Result.fail(dataResult.error);\n }\n const { entry } = dataResult.value;\n\n try {\n await this.eventPublisher.publish(\n new EntryBeforePublishEvent({\n entry,\n original: originalEntry,\n model\n })\n );\n\n const repositoryResult = await this.repository.execute(model, entry);\n\n if (repositoryResult.isFail()) {\n await this.eventPublisher.publish(\n new EntryPublishErrorEvent({\n entry,\n original: originalEntry,\n model,\n error: repositoryResult.error\n })\n );\n return Result.fail(repositoryResult.error);\n }\n\n const publishedEntry = repositoryResult.value;\n\n await this.eventPublisher.publish(\n new EntryAfterPublishEvent({\n entry: publishedEntry,\n original: originalEntry,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryPublishErrorEvent({\n entry,\n original: originalEntry,\n model,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const PublishEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: PublishEntryUseCaseImpl,\n dependencies: [\n PublishEntryRepository,\n AccessControl,\n GetRevisionByIdUseCase,\n EventPublisher,\n CreatePublishEntryDataFactory\n ]\n});\n"],"names":["PublishEntryUseCaseImpl","repository","accessControl","getRevisionById","eventPublisher","createPublishEntryDataFactory","model","id","canAccess","Result","EntryNotAuthorizedError","result","EntryNotFoundError","originalEntry","canAccessEntry","dataResult","entry","EntryBeforePublishEvent","repositoryResult","EntryPublishErrorEvent","publishedEntry","EntryAfterPublishEvent","error","PublishEntryUseCase","createImplementation","UseCaseAbstraction","PublishEntryRepository","AccessControl","GetRevisionByIdUseCase","EventPublisher","CreatePublishEntryDataFactory"],"mappings":";;;;;;;;AAgBA,MAAMA;IACF,YACYC,UAA4C,EAC5CC,aAAsC,EACtCC,eAAiD,EACjDC,cAAwC,EACxCC,6BAAsE,CAChF;aALUJ,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;aACAC,6BAA6B,GAA7BA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EAC4C;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEF;YAAO,IAAI;QAAI;QAC3E,IAAI,CAACE,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMK,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIL,OAAOC;QAE5D,IAAII,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAAC,IAAIG,mBAAmBL;QAG9C,MAAMM,gBAAgBF,OAAO,KAAK;QAElC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DR;YACA,OAAOO;YACP,IAAI;QACR;QAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMS,aAAa,MAAM,IAAI,CAAC,6BAA6B,CAAC,MAAM,CAAIT,OAAOO;QAC7E,IAAIE,WAAW,MAAM,IACjB,OAAON,OAAO,IAAI,CAACM,WAAW,KAAK;QAEvC,MAAM,EAAEC,KAAK,EAAE,GAAGD,WAAW,KAAK;QAElC,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,wBAAwB;gBACxBD;gBACA,UAAUH;gBACVP;YACJ;YAGJ,MAAMY,mBAAmB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACZ,OAAOU;YAE9D,IAAIE,iBAAiB,MAAM,IAAI;gBAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,uBAAuB;oBACvBH;oBACA,UAAUH;oBACVP;oBACA,OAAOY,iBAAiB,KAAK;gBACjC;gBAEJ,OAAOT,OAAO,IAAI,CAACS,iBAAiB,KAAK;YAC7C;YAEA,MAAME,iBAAiBF,iBAAiB,KAAK;YAE7C,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,uBAAuB;gBACvB,OAAOD;gBACP,UAAUP;gBACVP;YACJ;YAGJ,OAAOG,OAAO,EAAE,CAACO;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,uBAAuB;gBACvBH;gBACA,UAAUH;gBACVP;gBACA,OAAOgB;YACX;YAEJ,OAAOb,OAAO,IAAI,CAACa;QACvB;IACJ;AACJ;AAEO,MAAMC,0CAAsBC,qBAAqB;IACpD,aAAaC;IACb,gBAAgBzB;IAChB,cAAc;QACV0B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -31,7 +31,9 @@ class RepublishEntryUseCaseImpl {
|
|
|
31
31
|
pw: "p"
|
|
32
32
|
});
|
|
33
33
|
if (!canAccessEntry) return Result.fail(EntryNotAuthorizedError.fromModel(model));
|
|
34
|
-
const
|
|
34
|
+
const dataResult = await this.createRepublishEntryDataFactory.create(model, originalEntry);
|
|
35
|
+
if (dataResult.isFail()) return Result.fail(dataResult.error);
|
|
36
|
+
const { entry } = dataResult.value;
|
|
35
37
|
try {
|
|
36
38
|
await this.eventPublisher.publish(new EntryBeforeRepublishEvent({
|
|
37
39
|
entry,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/RepublishEntry/RepublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/RepublishEntry/RepublishEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { RepublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { RepublishEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport {\n EntryBeforeRepublishEvent,\n EntryAfterRepublishEvent,\n EntryRepublishErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { CreateRepublishEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/index.js\";\n\nclass RepublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: RepublishEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private createRepublishEntryDataFactory: CreateRepublishEntryDataFactory.Interface\n ) {}\n\n public async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\", pw: \"p\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const result = await this.getRevisionById.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n const originalEntry = result.value;\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry: originalEntry,\n rwd: \"w\",\n pw: \"p\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const
|
|
1
|
+
{"version":3,"file":"features/contentEntry/RepublishEntry/RepublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/RepublishEntry/RepublishEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { RepublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { RepublishEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport {\n EntryBeforeRepublishEvent,\n EntryAfterRepublishEvent,\n EntryRepublishErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { CreateRepublishEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/index.js\";\n\nclass RepublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: RepublishEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private createRepublishEntryDataFactory: CreateRepublishEntryDataFactory.Interface\n ) {}\n\n public async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\", pw: \"p\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const result = await this.getRevisionById.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n const originalEntry = result.value;\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry: originalEntry,\n rwd: \"w\",\n pw: \"p\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const dataResult = await this.createRepublishEntryDataFactory.create<T>(\n model,\n originalEntry\n );\n if (dataResult.isFail()) {\n return Result.fail(dataResult.error);\n }\n const { entry } = dataResult.value;\n\n try {\n await this.eventPublisher.publish(\n new EntryBeforeRepublishEvent({\n entry,\n model\n })\n );\n\n const repositoryResult = await this.repository.execute<T>(model, entry);\n\n if (repositoryResult.isFail()) {\n await this.eventPublisher.publish(\n new EntryRepublishErrorEvent({\n entry,\n model,\n error: repositoryResult.error\n })\n );\n return Result.fail(repositoryResult.error);\n }\n\n const publishedEntry = repositoryResult.value;\n\n await this.eventPublisher.publish(\n new EntryAfterRepublishEvent({\n entry: publishedEntry,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryRepublishErrorEvent({\n entry,\n model,\n error: error as Error\n })\n );\n return Result.fail(error as any);\n }\n }\n}\n\nexport const RepublishEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: RepublishEntryUseCaseImpl,\n dependencies: [\n RepublishEntryRepository,\n AccessControl,\n GetRevisionByIdUseCase,\n EventPublisher,\n CreateRepublishEntryDataFactory\n ]\n});\n"],"names":["RepublishEntryUseCaseImpl","repository","accessControl","getRevisionById","eventPublisher","createRepublishEntryDataFactory","model","id","canAccess","Result","EntryNotAuthorizedError","result","EntryNotFoundError","originalEntry","canAccessEntry","dataResult","entry","EntryBeforeRepublishEvent","repositoryResult","EntryRepublishErrorEvent","publishedEntry","EntryAfterRepublishEvent","error","RepublishEntryUseCase","createImplementation","UseCaseAbstraction","RepublishEntryRepository","AccessControl","GetRevisionByIdUseCase","EventPublisher","CreateRepublishEntryDataFactory"],"mappings":";;;;;;;;AAiBA,MAAMA;IACF,YACYC,UAA8C,EAC9CC,aAAsC,EACtCC,eAAiD,EACjDC,cAAwC,EACxCC,+BAA0E,CACpF;aALUJ,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;aACAC,+BAA+B,GAA/BA;IACT;IAEH,MAAa,QACTC,KAAe,EACfC,EAAU,EAC4C;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEF;YAAO,KAAK;YAAK,IAAI;QAAI;QACrF,IAAI,CAACE,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMK,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIL,OAAOC;QAE5D,IAAII,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAAC,IAAIG,mBAAmBL;QAG9C,MAAMM,gBAAgBF,OAAO,KAAK;QAElC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DR;YACA,OAAOO;YACP,KAAK;YACL,IAAI;QACR;QAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMS,aAAa,MAAM,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAChET,OACAO;QAEJ,IAAIE,WAAW,MAAM,IACjB,OAAON,OAAO,IAAI,CAACM,WAAW,KAAK;QAEvC,MAAM,EAAEC,KAAK,EAAE,GAAGD,WAAW,KAAK;QAElC,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,0BAA0B;gBAC1BD;gBACAV;YACJ;YAGJ,MAAMY,mBAAmB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAIZ,OAAOU;YAEjE,IAAIE,iBAAiB,MAAM,IAAI;gBAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,yBAAyB;oBACzBH;oBACAV;oBACA,OAAOY,iBAAiB,KAAK;gBACjC;gBAEJ,OAAOT,OAAO,IAAI,CAACS,iBAAiB,KAAK;YAC7C;YAEA,MAAME,iBAAiBF,iBAAiB,KAAK;YAE7C,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,yBAAyB;gBACzB,OAAOD;gBACPd;YACJ;YAGJ,OAAOG,OAAO,EAAE,CAACO;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,yBAAyB;gBACzBH;gBACAV;gBACA,OAAOgB;YACX;YAEJ,OAAOb,OAAO,IAAI,CAACa;QACvB;IACJ;AACJ;AAEO,MAAMC,8CAAwBC,qBAAqB;IACtD,aAAaC;IACb,gBAAgBzB;IAChB,cAAc;QACV0B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -33,7 +33,9 @@ class UnpublishEntryUseCaseImpl {
|
|
|
33
33
|
pw: "u"
|
|
34
34
|
});
|
|
35
35
|
if (!canAccessEntry) return Result.fail(EntryNotAuthorizedError.fromModel(model));
|
|
36
|
-
const
|
|
36
|
+
const dataResult = await this.createUnpublishEntryDataFactory.create(model, originalEntry);
|
|
37
|
+
if (dataResult.isFail()) return Result.fail(dataResult.error);
|
|
38
|
+
const { entry } = dataResult.value;
|
|
37
39
|
try {
|
|
38
40
|
await this.eventPublisher.publish(new EntryBeforeUnpublishEvent({
|
|
39
41
|
entry,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.ts"],"sourcesContent":["import { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { UnpublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { UnpublishEntryRepository } from \"./abstractions.js\";\nimport { EntryBeforeUnpublishEvent } from \"./events.js\";\nimport { EntryAfterUnpublishEvent } from \"./events.js\";\nimport { EntryUnpublishErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetPublishedRevisionByEntryIdUseCase } from \"~/features/contentEntry/GetPublishedRevisionByEntryId/index.js\";\nimport type { CmsEntry, CmsEntryValues } from \"~/types/index.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryValidationError } from \"~/domain/contentEntry/errors.js\";\nimport { CreateUnpublishEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/index.js\";\n\nclass UnpublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: UnpublishEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getPublishedRevisionByEntryId: GetPublishedRevisionByEntryIdUseCase.Interface,\n private createUnpublishEntryDataFactory: CreateUnpublishEntryDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, pw: \"u\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const { id: entryId } = parseIdentifier(id);\n\n const publishedResult = await this.getPublishedRevisionByEntryId.execute<T>(model, entryId);\n\n if (publishedResult.isFail()) {\n return Result.fail(publishedResult.error);\n }\n\n const originalEntry = publishedResult.value;\n\n if (!originalEntry) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n if (originalEntry.id !== id) {\n return Result.fail(new EntryValidationError(`Entry is not published!`));\n }\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry: originalEntry,\n pw: \"u\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const
|
|
1
|
+
{"version":3,"file":"features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.ts"],"sourcesContent":["import { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { UnpublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { UnpublishEntryRepository } from \"./abstractions.js\";\nimport { EntryBeforeUnpublishEvent } from \"./events.js\";\nimport { EntryAfterUnpublishEvent } from \"./events.js\";\nimport { EntryUnpublishErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetPublishedRevisionByEntryIdUseCase } from \"~/features/contentEntry/GetPublishedRevisionByEntryId/index.js\";\nimport type { CmsEntry, CmsEntryValues } from \"~/types/index.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryValidationError } from \"~/domain/contentEntry/errors.js\";\nimport { CreateUnpublishEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/index.js\";\n\nclass UnpublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: UnpublishEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getPublishedRevisionByEntryId: GetPublishedRevisionByEntryIdUseCase.Interface,\n private createUnpublishEntryDataFactory: CreateUnpublishEntryDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, pw: \"u\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const { id: entryId } = parseIdentifier(id);\n\n const publishedResult = await this.getPublishedRevisionByEntryId.execute<T>(model, entryId);\n\n if (publishedResult.isFail()) {\n return Result.fail(publishedResult.error);\n }\n\n const originalEntry = publishedResult.value;\n\n if (!originalEntry) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n if (originalEntry.id !== id) {\n return Result.fail(new EntryValidationError(`Entry is not published!`));\n }\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry: originalEntry,\n pw: \"u\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const dataResult = await this.createUnpublishEntryDataFactory.create<T>(\n model,\n originalEntry\n );\n if (dataResult.isFail()) {\n return Result.fail(dataResult.error);\n }\n const { entry } = dataResult.value;\n\n try {\n await this.eventPublisher.publish(new EntryBeforeUnpublishEvent({ entry, model }));\n\n const unpublishResult = await this.repository.execute<T>(model, entry);\n if (unpublishResult.isFail()) {\n await this.eventPublisher.publish(\n new EntryUnpublishErrorEvent({ entry, model, error: unpublishResult.error })\n );\n return Result.fail(unpublishResult.error);\n }\n\n const storageEntry = unpublishResult.value;\n\n await this.eventPublisher.publish(\n new EntryAfterUnpublishEvent({\n entry,\n storageEntry,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryUnpublishErrorEvent({ entry, model, error: error as Error })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const UnpublishEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: UnpublishEntryUseCaseImpl,\n dependencies: [\n EventPublisher,\n UnpublishEntryRepository,\n AccessControl,\n GetPublishedRevisionByEntryIdUseCase,\n CreateUnpublishEntryDataFactory\n ]\n});\n"],"names":["UnpublishEntryUseCaseImpl","eventPublisher","repository","accessControl","getPublishedRevisionByEntryId","createUnpublishEntryDataFactory","model","id","canAccess","Result","EntryNotAuthorizedError","entryId","parseIdentifier","publishedResult","originalEntry","EntryNotFoundError","EntryValidationError","canAccessEntry","dataResult","entry","EntryBeforeUnpublishEvent","unpublishResult","EntryUnpublishErrorEvent","storageEntry","EntryAfterUnpublishEvent","error","UnpublishEntryUseCase","createImplementation","UseCaseAbstraction","EventPublisher","UnpublishEntryRepository","AccessControl","GetPublishedRevisionByEntryIdUseCase","CreateUnpublishEntryDataFactory"],"mappings":";;;;;;;;;AAkBA,MAAMA;IACF,YACYC,cAAwC,EACxCC,UAA8C,EAC9CC,aAAsC,EACtCC,6BAA6E,EAC7EC,+BAA0E,CACpF;aALUJ,cAAc,GAAdA;aACAC,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,6BAA6B,GAA7BA;aACAC,+BAA+B,GAA/BA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EAC4C;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEF;YAAO,IAAI;QAAI;QAC3E,IAAI,CAACE,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAM,EAAE,IAAIK,OAAO,EAAE,GAAGC,gBAAgBL;QAExC,MAAMM,kBAAkB,MAAM,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAIP,OAAOK;QAEnF,IAAIE,gBAAgB,MAAM,IACtB,OAAOJ,OAAO,IAAI,CAACI,gBAAgB,KAAK;QAG5C,MAAMC,gBAAgBD,gBAAgB,KAAK;QAE3C,IAAI,CAACC,eACD,OAAOL,OAAO,IAAI,CAAC,IAAIM,mBAAmBR;QAG9C,IAAIO,cAAc,EAAE,KAAKP,IACrB,OAAOE,OAAO,IAAI,CAAC,IAAIO,qBAAqB;QAGhD,MAAMC,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DX;YACA,OAAOQ;YACP,IAAI;QACR;QAEA,IAAI,CAACG,gBACD,OAAOR,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMY,aAAa,MAAM,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAChEZ,OACAQ;QAEJ,IAAII,WAAW,MAAM,IACjB,OAAOT,OAAO,IAAI,CAACS,WAAW,KAAK;QAEvC,MAAM,EAAEC,KAAK,EAAE,GAAGD,WAAW,KAAK;QAElC,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAIE,0BAA0B;gBAAED;gBAAOb;YAAM;YAE/E,MAAMe,kBAAkB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAIf,OAAOa;YAChE,IAAIE,gBAAgB,MAAM,IAAI;gBAC1B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,yBAAyB;oBAAEH;oBAAOb;oBAAO,OAAOe,gBAAgB,KAAK;gBAAC;gBAE9E,OAAOZ,OAAO,IAAI,CAACY,gBAAgB,KAAK;YAC5C;YAEA,MAAME,eAAeF,gBAAgB,KAAK;YAE1C,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,yBAAyB;gBACzBL;gBACAI;gBACAjB;YACJ;YAGJ,OAAOG,OAAO,EAAE,CAACU;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,yBAAyB;gBAAEH;gBAAOb;gBAAO,OAAOmB;YAAe;YAEvE,OAAOhB,OAAO,IAAI,CAACgB;QACvB;IACJ;AACJ;AAEO,MAAMC,8CAAwBC,qBAAqB;IACtD,aAAaC;IACb,gBAAgB5B;IAChB,cAAc;QACV6B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -25,7 +25,9 @@ class UpdateEntryUseCaseImpl {
|
|
|
25
25
|
if (result.isFail()) return Result.fail(result.error);
|
|
26
26
|
const originalEntry = result.value;
|
|
27
27
|
if (originalEntry.locked) return Result.fail(new EntryLockedError());
|
|
28
|
-
const
|
|
28
|
+
const dataResult = await this.updateEntryDataFactory.create(model, rawInput, originalEntry, options);
|
|
29
|
+
if (dataResult.isFail()) return Result.fail(dataResult.error);
|
|
30
|
+
const { entry, input } = dataResult.value;
|
|
29
31
|
const canAccessEntry = await this.accessControl.canAccessEntry({
|
|
30
32
|
model,
|
|
31
33
|
entry,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/UpdateEntry/UpdateEntryUseCase.js","sources":["../../../../src/features/contentEntry/UpdateEntry/UpdateEntryUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { UpdateEntryRepository, UpdateEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { EntryAfterUpdateEvent, EntryBeforeUpdateEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/abstractions.js\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n UpdateCmsEntryInput,\n UpdateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport { EntryLockedError, EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { UpdateEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/index.js\";\n\nclass UpdateEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: UpdateEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionByIdUseCase: GetRevisionByIdUseCase.Interface,\n private updateEntryDataFactory: UpdateEntryDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string,\n rawInput: UpdateCmsEntryInput<T>,\n options?: UpdateCmsEntryOptionsInput\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n try {\n const result = await this.getRevisionByIdUseCase.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const originalEntry = result.value;\n\n if (originalEntry.locked) {\n return Result.fail(new EntryLockedError());\n }\n\n const
|
|
1
|
+
{"version":3,"file":"features/contentEntry/UpdateEntry/UpdateEntryUseCase.js","sources":["../../../../src/features/contentEntry/UpdateEntry/UpdateEntryUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { UpdateEntryRepository, UpdateEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { EntryAfterUpdateEvent, EntryBeforeUpdateEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/abstractions.js\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n UpdateCmsEntryInput,\n UpdateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport { EntryLockedError, EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { UpdateEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/index.js\";\n\nclass UpdateEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: UpdateEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionByIdUseCase: GetRevisionByIdUseCase.Interface,\n private updateEntryDataFactory: UpdateEntryDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string,\n rawInput: UpdateCmsEntryInput<T>,\n options?: UpdateCmsEntryOptionsInput\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n try {\n const result = await this.getRevisionByIdUseCase.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const originalEntry = result.value;\n\n if (originalEntry.locked) {\n return Result.fail(new EntryLockedError());\n }\n\n const dataResult = await this.updateEntryDataFactory.create<T>(\n model,\n rawInput,\n originalEntry,\n options\n );\n if (dataResult.isFail()) {\n return Result.fail(dataResult.error);\n }\n const { entry, input } = dataResult.value;\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry,\n rwd: \"w\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n await this.eventPublisher.publish(\n new EntryBeforeUpdateEvent({ entry, original: originalEntry, input, model })\n );\n\n const updateResult = await this.repository.execute(model, entry);\n if (updateResult.isFail()) {\n return Result.fail(updateResult.error);\n }\n\n await this.eventPublisher.publish(\n new EntryAfterUpdateEvent({\n entry,\n original: originalEntry,\n input,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const UpdateEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: UpdateEntryUseCaseImpl,\n dependencies: [\n EventPublisher,\n UpdateEntryRepository,\n AccessControl,\n GetRevisionByIdUseCase,\n UpdateEntryDataFactory\n ]\n});\n"],"names":["UpdateEntryUseCaseImpl","eventPublisher","repository","accessControl","getRevisionByIdUseCase","updateEntryDataFactory","model","id","rawInput","options","canAccess","Result","EntryNotAuthorizedError","result","originalEntry","EntryLockedError","dataResult","entry","input","canAccessEntry","EntryBeforeUpdateEvent","updateResult","EntryAfterUpdateEvent","error","UpdateEntryUseCase","createImplementation","UseCaseAbstraction","EventPublisher","UpdateEntryRepository","AccessControl","GetRevisionByIdUseCase","UpdateEntryDataFactory"],"mappings":";;;;;;;;AAgBA,MAAMA;IACF,YACYC,cAAwC,EACxCC,UAA2C,EAC3CC,aAAsC,EACtCC,sBAAwD,EACxDC,sBAAwD,CAClE;aALUJ,cAAc,GAAdA;aACAC,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,sBAAsB,GAAtBA;aACAC,sBAAsB,GAAtBA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EACVC,QAAgC,EAChCC,OAAoC,EACkB;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEJ;YAAO,KAAK;QAAI;QAC5E,IAAI,CAACI,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACN;QAGzD,IAAI;YACA,MAAMO,SAAS,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAIP,OAAOC;YAEnE,IAAIM,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAACE,OAAO,KAAK;YAGnC,MAAMC,gBAAgBD,OAAO,KAAK;YAElC,IAAIC,cAAc,MAAM,EACpB,OAAOH,OAAO,IAAI,CAAC,IAAII;YAG3B,MAAMC,aAAa,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CACvDV,OACAE,UACAM,eACAL;YAEJ,IAAIO,WAAW,MAAM,IACjB,OAAOL,OAAO,IAAI,CAACK,WAAW,KAAK;YAEvC,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF,WAAW,KAAK;YAEzC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;gBAC3Db;gBACAW;gBACA,KAAK;YACT;YAEA,IAAI,CAACE,gBACD,OAAOR,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACN;YAGzD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIc,uBAAuB;gBAAEH;gBAAO,UAAUH;gBAAeI;gBAAOZ;YAAM;YAG9E,MAAMe,eAAe,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACf,OAAOW;YAC1D,IAAII,aAAa,MAAM,IACnB,OAAOV,OAAO,IAAI,CAACU,aAAa,KAAK;YAGzC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,sBAAsB;gBACtBL;gBACA,UAAUH;gBACVI;gBACAZ;YACJ;YAGJ,OAAOK,OAAO,EAAE,CAACM;QACrB,EAAE,OAAOM,OAAO;YACZ,OAAOZ,OAAO,IAAI,CAACY;QACvB;IACJ;AACJ;AAEO,MAAMC,wCAAqBC,qBAAqB;IACnD,aAAaC;IACb,gBAAgB1B;IAChB,cAAc;QACV2B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CreateEntryRevisionFromDataFactory as FactoryAbstraction, type ICreateEntryRevisionFromDataFactory } from "./abstractions.js";
|
|
2
2
|
import { AccessControl, CmsContext } from "../../../../features/shared/abstractions.js";
|
|
3
3
|
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
4
4
|
import type { CmsEntry, CmsEntryValues, CmsModel, CreateCmsEntryInput, CreateCmsEntryOptionsInput } from "../../../../types/index.js";
|
|
5
5
|
import { ModelToAstConverter } from "../../../../features/contentModel/ModelToAstConverter/abstractions.js";
|
|
6
|
+
import { GetLatestRevisionByEntryIdUseCase } from "../../../../features/contentEntry/GetLatestRevisionByEntryId/index.js";
|
|
6
7
|
declare class CreateEntryRevisionFromDataFactoryImpl implements ICreateEntryRevisionFromDataFactory {
|
|
7
8
|
private readonly cmsContext;
|
|
8
9
|
private readonly identityContext;
|
|
9
10
|
private readonly accessControl;
|
|
10
11
|
private readonly modelToAstConverter;
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
private readonly getLatestRevision;
|
|
13
|
+
constructor(cmsContext: CmsContext.Interface, identityContext: IdentityContext.Interface, accessControl: AccessControl.Interface, modelToAstConverter: ModelToAstConverter.Interface, getLatestRevision: GetLatestRevisionByEntryIdUseCase.Interface);
|
|
14
|
+
create<TValues extends CmsEntryValues = CmsEntryValues>(sourceId: string, model: CmsModel, rawInput: CreateCmsEntryInput<TValues>, originalEntry: CmsEntry<TValues>, options?: CreateCmsEntryOptionsInput): Promise<FactoryAbstraction.Return<TValues>>;
|
|
13
15
|
}
|
|
14
16
|
export declare const CreateEntryRevisionFromDataFactory: import("@webiny/di").Implementation<typeof CreateEntryRevisionFromDataFactoryImpl>;
|
|
15
17
|
export {};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { createImplementation } from "@webiny/feature/api";
|
|
1
|
+
import { Result, createImplementation } from "@webiny/feature/api";
|
|
2
2
|
import { CreateEntryRevisionFromDataFactory } from "./abstractions.js";
|
|
3
3
|
import { AccessControl, CmsContext } from "../../../shared/abstractions.js";
|
|
4
4
|
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
5
5
|
import { getDate } from "../../../../utils/date.js";
|
|
6
6
|
import { getIdentity } from "../../../../utils/identity.js";
|
|
7
7
|
import { mapAndCleanUpdatedInputData } from "../mapAndCleanUpdatedInputData.js";
|
|
8
|
-
import {
|
|
8
|
+
import { validateModelEntryData } from "../../../../crud/contentEntry/entryDataValidation.js";
|
|
9
|
+
import { EntryValidationError } from "../../../../domain/contentEntry/errors.js";
|
|
9
10
|
import { referenceFieldsMapping } from "../../../../crud/contentEntry/referenceFieldsMapping.js";
|
|
10
11
|
import { createIdentifier, parseIdentifier } from "@webiny/utils";
|
|
11
12
|
import error from "@webiny/error";
|
|
@@ -14,6 +15,8 @@ import { NotAuthorizedError } from "../../../../utils/errors.js";
|
|
|
14
15
|
import { getSystem } from "../system.js";
|
|
15
16
|
import { ModelToAstConverter } from "../../../contentModel/ModelToAstConverter/abstractions.js";
|
|
16
17
|
import { ensureItemIds } from "../../ensureItemIds.js";
|
|
18
|
+
import { hasEntryContentChanged } from "../hasEntryContentChanged.js";
|
|
19
|
+
import { GetLatestRevisionByEntryIdUseCase } from "../../GetLatestRevisionByEntryId/index.js";
|
|
17
20
|
const increaseEntryIdVersion = (id)=>{
|
|
18
21
|
const { id: entryId, version } = parseIdentifier(id);
|
|
19
22
|
if (!version) throw new error("Cannot increase version on the ID without the version part.", "WRONG_ID", {
|
|
@@ -29,26 +32,33 @@ const increaseEntryIdVersion = (id)=>{
|
|
|
29
32
|
};
|
|
30
33
|
};
|
|
31
34
|
class CreateEntryRevisionFromDataFactoryImpl {
|
|
32
|
-
constructor(cmsContext, identityContext, accessControl, modelToAstConverter){
|
|
35
|
+
constructor(cmsContext, identityContext, accessControl, modelToAstConverter, getLatestRevision){
|
|
33
36
|
this.cmsContext = cmsContext;
|
|
34
37
|
this.identityContext = identityContext;
|
|
35
38
|
this.accessControl = accessControl;
|
|
36
39
|
this.modelToAstConverter = modelToAstConverter;
|
|
40
|
+
this.getLatestRevision = getLatestRevision;
|
|
37
41
|
}
|
|
38
|
-
async create(sourceId, model, rawInput, originalEntry,
|
|
42
|
+
async create(sourceId, model, rawInput, originalEntry, options) {
|
|
43
|
+
const latestResult = await this.getLatestRevision.execute(model, {
|
|
44
|
+
id: originalEntry.entryId
|
|
45
|
+
});
|
|
46
|
+
if (latestResult.isFail()) return Result.fail(latestResult.error);
|
|
47
|
+
const latestStorageEntry = latestResult.value;
|
|
39
48
|
const initialValues = {
|
|
40
49
|
...originalEntry.values,
|
|
41
50
|
...mapAndCleanUpdatedInputData(model, rawInput.values)
|
|
42
51
|
};
|
|
43
52
|
const modelAst = this.modelToAstConverter.toAst(model);
|
|
44
53
|
await ensureItemIds(modelAst, initialValues);
|
|
45
|
-
await
|
|
54
|
+
const invalidFields = await validateModelEntryData({
|
|
46
55
|
context: this.cmsContext,
|
|
47
56
|
model,
|
|
48
57
|
values: initialValues,
|
|
49
58
|
entry: originalEntry,
|
|
50
59
|
skipValidation: options?.skipValidation
|
|
51
60
|
});
|
|
61
|
+
if (invalidFields.length > 0) return Result.fail(new EntryValidationError("Validation failed.", invalidFields));
|
|
52
62
|
const values = await referenceFieldsMapping({
|
|
53
63
|
context: this.cmsContext,
|
|
54
64
|
model,
|
|
@@ -66,13 +76,13 @@ class CreateEntryRevisionFromDataFactoryImpl {
|
|
|
66
76
|
model,
|
|
67
77
|
pw: "p"
|
|
68
78
|
});
|
|
69
|
-
if (!canPublish)
|
|
79
|
+
if (!canPublish) return Result.fail(new NotAuthorizedError(`Not allowed to access "${model.modelId}" entries.`));
|
|
70
80
|
} else if (status === STATUS_UNPUBLISHED) {
|
|
71
81
|
const canUnpublish = await this.accessControl.canAccessEntry({
|
|
72
82
|
model,
|
|
73
83
|
pw: "u"
|
|
74
84
|
});
|
|
75
|
-
if (!canUnpublish)
|
|
85
|
+
if (!canUnpublish) return Result.fail(new NotAuthorizedError(`Not allowed to access "${model.modelId}" entries.`));
|
|
76
86
|
}
|
|
77
87
|
}
|
|
78
88
|
const locked = status !== STATUS_DRAFT;
|
|
@@ -102,16 +112,31 @@ class CreateEntryRevisionFromDataFactoryImpl {
|
|
|
102
112
|
lastPublishedBy: getIdentity(rawInput.lastPublishedBy, currentIdentity)
|
|
103
113
|
};
|
|
104
114
|
}
|
|
115
|
+
const contentChanged = hasEntryContentChanged({
|
|
116
|
+
values,
|
|
117
|
+
baselineValues: latestStorageEntry.values
|
|
118
|
+
});
|
|
119
|
+
const entryLevelSaved = contentChanged ? {
|
|
120
|
+
savedOn: currentDateTime,
|
|
121
|
+
modifiedOn: currentDateTime,
|
|
122
|
+
savedBy: currentIdentity,
|
|
123
|
+
modifiedBy: currentIdentity
|
|
124
|
+
} : {
|
|
125
|
+
savedOn: latestStorageEntry.savedOn,
|
|
126
|
+
modifiedOn: latestStorageEntry.modifiedOn,
|
|
127
|
+
savedBy: latestStorageEntry.savedBy,
|
|
128
|
+
modifiedBy: latestStorageEntry.modifiedBy
|
|
129
|
+
};
|
|
105
130
|
const entry = {
|
|
106
131
|
...originalEntry,
|
|
107
132
|
id,
|
|
108
133
|
version: nextVersion,
|
|
109
134
|
createdOn: getDate(rawInput.createdOn, latestStorageEntry.createdOn),
|
|
110
|
-
savedOn: getDate(rawInput.savedOn,
|
|
111
|
-
modifiedOn: getDate(rawInput.modifiedOn,
|
|
135
|
+
savedOn: getDate(rawInput.savedOn, entryLevelSaved.savedOn),
|
|
136
|
+
modifiedOn: getDate(rawInput.modifiedOn, entryLevelSaved.modifiedOn),
|
|
112
137
|
createdBy: getIdentity(rawInput.createdBy, latestStorageEntry.createdBy),
|
|
113
|
-
savedBy: getIdentity(rawInput.savedBy,
|
|
114
|
-
modifiedBy: getIdentity(rawInput.modifiedBy,
|
|
138
|
+
savedBy: getIdentity(rawInput.savedBy, entryLevelSaved.savedBy),
|
|
139
|
+
modifiedBy: getIdentity(rawInput.modifiedBy, entryLevelSaved.modifiedBy),
|
|
115
140
|
...entryLevelPublishingMetaFields,
|
|
116
141
|
revisionCreatedOn: getDate(rawInput.revisionCreatedOn, currentDateTime),
|
|
117
142
|
revisionSavedOn: getDate(rawInput.revisionSavedOn, currentDateTime),
|
|
@@ -131,13 +156,13 @@ class CreateEntryRevisionFromDataFactoryImpl {
|
|
|
131
156
|
live: originalEntry.live,
|
|
132
157
|
expiresAt: null
|
|
133
158
|
};
|
|
134
|
-
return {
|
|
159
|
+
return Result.ok({
|
|
135
160
|
entry,
|
|
136
161
|
input: {
|
|
137
162
|
...rawInput,
|
|
138
163
|
values: structuredClone(values)
|
|
139
164
|
}
|
|
140
|
-
};
|
|
165
|
+
});
|
|
141
166
|
}
|
|
142
167
|
}
|
|
143
168
|
const CreateEntryRevisionFromDataFactory_CreateEntryRevisionFromDataFactory = createImplementation({
|
|
@@ -147,7 +172,8 @@ const CreateEntryRevisionFromDataFactory_CreateEntryRevisionFromDataFactory = cr
|
|
|
147
172
|
CmsContext,
|
|
148
173
|
IdentityContext,
|
|
149
174
|
AccessControl,
|
|
150
|
-
ModelToAstConverter
|
|
175
|
+
ModelToAstConverter,
|
|
176
|
+
GetLatestRevisionByEntryIdUseCase
|
|
151
177
|
]
|
|
152
178
|
});
|
|
153
179
|
export { CreateEntryRevisionFromDataFactory_CreateEntryRevisionFromDataFactory as CreateEntryRevisionFromDataFactory };
|