Skip to content

Commit

Permalink
Bulldoze in final wiring for OCC
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Haarhoff committed May 23, 2024
1 parent bfd905b commit c80667c
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 10 deletions.
9 changes: 7 additions & 2 deletions src/commands/persist-or-no-op.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@ import {DomainEvent} from '../types';
import * as O from 'fp-ts/Option';
import {StatusCodes} from 'http-status-codes';
import {Dependencies} from '../dependencies';
import {Resource} from '../types/resource';

export const persistOrNoOp =
(commitEvent: Dependencies['commitEvent']) =>
(
commitEvent: Dependencies['commitEvent'],
resource: Resource,
version: number
) =>
(toPersist: O.Option<DomainEvent>) =>
pipe(
toPersist,
Expand All @@ -16,6 +21,6 @@ export const persistOrNoOp =
status: StatusCodes.OK,
message: 'No new events raised',
}),
commitEvent({id: '', type: ''}, 0)
commitEvent(resource, version)
)
);
28 changes: 25 additions & 3 deletions src/http/api-post.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export const apiPost =
await pipe(
{
actor: getActorFrom(req.headers.authorization, conf),
command: getCommandFrom(req.body, command),
formPayload: getCommandFrom(req.body, command),
events: deps.getAllEvents(),
},
sequenceS(TE.ApplySeq),
Expand All @@ -60,8 +60,30 @@ export const apiPost =
StatusCodes.UNAUTHORIZED
)()
),
TE.map(command.process),
TE.chainW(persistOrNoOp(deps.commitEvent)),
TE.chain(({formPayload}) =>
pipe(
{
resource: TE.right(command.resource(formPayload)),
resourceState: deps.getResourceEvents(
command.resource(formPayload)
),
formPayload: TE.right(formPayload),
},
sequenceS(TE.ApplyPar)
)
),
TE.chainW(input =>
persistOrNoOp(
deps.commitEvent,
input.resource,
input.resourceState.version
)(
command.process({
events: input.resourceState.events,
command: input.formPayload,
})
)
),
TE.match(
({status, message, payload}) =>
res.status(status).send({message, payload}),
Expand Down
28 changes: 25 additions & 3 deletions src/http/form-post.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export const formPost =
await pipe(
{
actor: getActorFrom(req.session, deps),
command: getCommandFrom(req.body, command),
formPayload: getCommandFrom(req.body, command),
events: deps.getAllEvents(),
},
sequenceS(TE.ApplySeq),
Expand All @@ -50,8 +50,30 @@ export const formPost =
StatusCodes.UNAUTHORIZED
)()
),
TE.map(command.process),
TE.chainW(persistOrNoOp(deps.commitEvent)),
TE.chain(({formPayload}) =>
pipe(
{
resource: TE.right(command.resource(formPayload)),
resourceState: deps.getResourceEvents(
command.resource(formPayload)
),
formPayload: TE.right(formPayload),
},
sequenceS(TE.ApplyPar)
)
),
TE.chainW(input =>
persistOrNoOp(
deps.commitEvent,
input.resource,
input.resourceState.version
)(
command.process({
events: input.resourceState.events,
command: input.formPayload,
})
)
),
TE.mapLeft(failure => {
deps.logger.warn(
{...failure, url: req.originalUrl},
Expand Down
9 changes: 7 additions & 2 deletions tests/read-models/test-framework.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import {persistOrNoOp} from '../../src/commands/persist-or-no-op';
import {getRightOrFail} from '../helpers';
import * as libsqlClient from '@libsql/client';
import {randomUUID} from 'crypto';
import {Resource} from '../../src/types/resource';
import {getResourceEvents} from '../../src/init-dependencies/event-store/get-resource-events';

type ToFrameworkCommands<T> = {
[K in keyof T]: {
Expand All @@ -34,14 +36,17 @@ export const initTestFramework = async (): Promise<TestFramework> => {
await ensureEventTableExists(dbClient)();
const frameworkGetAllEvents = () =>
pipe(getAllEvents(dbClient)(), T.map(getRightOrFail))();
const frameworkGetResourceEvents = (resource: Resource) =>
pipe(getResourceEvents(dbClient)(resource), T.map(getRightOrFail))();

const frameworkify =
<T>(command: Command<T>) =>
async (commandPayload: T) => {
const events = await frameworkGetAllEvents();
const resource = command.resource(commandPayload);
const {events, version} = await frameworkGetResourceEvents(resource);
await pipe(
command.process({command: commandPayload, events}),
persistOrNoOp(frameworkCommitEvent)
persistOrNoOp(frameworkCommitEvent, resource, version)
)();
};

Expand Down

0 comments on commit c80667c

Please sign in to comment.