Repository navigation
Expand file tree
/
Copy pathCreatePageRevisionFromUseCase.ts
More file actions
77 lines (65 loc) · 2.66 KB
/
Copy pathCreatePageRevisionFromUseCase.ts
File metadata and controls
77 lines (65 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { Result } from "@webiny/feature/api";
import {
EventPublisher,
EventPublisher as EventPublisherAbstraction
} from "@webiny/api-core/features/eventPublisher/index.js";
import {
CreatePageRevisionFromUseCase as UseCaseAbstraction,
CreatePageRevisionFromRepository
} from "./abstractions.js";
import { PageBeforeCreateRevisionFromEvent, PageAfterCreateRevisionFromEvent } from "./events.js";
import { GetPageByIdUseCase } from "~/features/pages/GetPageById/index.js";
import { WbPermissions } from "~/features/permissions/abstractions.js";
import { PageNotAuthorizedError } from "~/domain/page/errors.js";
import { PageToEntryValuesMapper } from "~/domain/page/PageToEntryValuesMapper.js";
class CreatePageRevisionFromUseCaseImpl implements UseCaseAbstraction.Interface {
constructor(
private permissions: WbPermissions.Interface,
private eventPublisher: EventPublisherAbstraction.Interface,
private getPageById: GetPageByIdUseCase.Interface,
private repository: CreatePageRevisionFromRepository.Interface
) {}
async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return {
const hasPermission = await this.permissions.canCreate("page");
if (!hasPermission) {
return Result.fail(new PageNotAuthorizedError());
}
// Verify ownership of the source page
const getResult = await this.getPageById.execute(params.id);
if (getResult.isFail()) {
return getResult;
}
// Publish before event. Handlers can edit `page`, and that object is what the revision is created from.
const original = getResult.value;
const pageToCreate = structuredClone(original);
const beforeEvent = new PageBeforeCreateRevisionFromEvent({
params,
original,
page: pageToCreate
});
await this.eventPublisher.publish(beforeEvent);
const result = await this.repository.execute({
id: params.id,
values: PageToEntryValuesMapper.toValues(pageToCreate)
});
if (result.isFail()) {
return result;
}
const page = result.value;
// Publish after event
const afterEvent = new PageAfterCreateRevisionFromEvent({
page
});
await this.eventPublisher.publish(afterEvent);
return Result.ok(page);
}
}
export const CreatePageRevisionFromUseCase = UseCaseAbstraction.createImplementation({
implementation: CreatePageRevisionFromUseCaseImpl,
dependencies: [
WbPermissions,
EventPublisher,
GetPageByIdUseCase,
CreatePageRevisionFromRepository
]
});