From f936d7e631c0e7517ecfb301eb2024db8d78eda2 Mon Sep 17 00:00:00 2001 From: Tomek Date: Wed, 22 Sep 2021 20:01:35 +0200 Subject: [PATCH 1/5] chore: add idea folder to the gitignore list Refs: #230 --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index d1a58db5..3c5667f7 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,6 @@ packages/ui/src/icons # Database data/ + +#IDE +.idea From e0c60f6ee96fdf2545e3af56204df2aabd6e8a26 Mon Sep 17 00:00:00 2001 From: Tomek Date: Sat, 16 Oct 2021 21:34:48 +0200 Subject: [PATCH 2/5] feat: create slice uncomplete task -> task was uncompleted Refs: #230 --- .../uncomplete-task.application-command.ts | 4 + .../uncomplete-task.domain-command.ts | 4 + .../complete-task.command-handler.ts | 3 +- .../uncomplete-task.command-handler.ts | 29 ++++++ .../domain/complete-task.spec.ts | 90 ++++++++++++++----- .../domain/complete-task.ts | 6 +- .../domain/uncomplete-task.spec.ts | 59 ++++++++++++ .../domain/uncomplete-task.ts | 42 +++++++++ ...rning-materials-tasks.write-module.spec.ts | 83 ++++++++++++----- .../learning-materials-tasks.write-module.ts | 16 ++-- .../rest/process-st-events.rest-controller.ts | 9 ++ 11 files changed, 293 insertions(+), 52 deletions(-) create mode 100644 packages/api/src/module/shared/commands/uncomplete-task.application-command.ts create mode 100644 packages/api/src/module/shared/commands/uncomplete-task.domain-command.ts create mode 100644 packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts create mode 100644 packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts create mode 100644 packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts diff --git a/packages/api/src/module/shared/commands/uncomplete-task.application-command.ts b/packages/api/src/module/shared/commands/uncomplete-task.application-command.ts new file mode 100644 index 00000000..fa368f78 --- /dev/null +++ b/packages/api/src/module/shared/commands/uncomplete-task.application-command.ts @@ -0,0 +1,4 @@ +import { AbstractApplicationCommand } from "@/module/application-command-events"; +import { UncompleteTask } from "@/commands/uncomplete-task.domain-command"; + +export class UncompleteTaskApplicationCommand extends AbstractApplicationCommand {} diff --git a/packages/api/src/module/shared/commands/uncomplete-task.domain-command.ts b/packages/api/src/module/shared/commands/uncomplete-task.domain-command.ts new file mode 100644 index 00000000..b0a99c49 --- /dev/null +++ b/packages/api/src/module/shared/commands/uncomplete-task.domain-command.ts @@ -0,0 +1,4 @@ +export type UncompleteTask = { + type: 'UncompleteTask'; + data: { learningMaterialsId: string; taskId: string }; +}; diff --git a/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts b/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts index 3bf718c2..fb741f27 100644 --- a/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts +++ b/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts @@ -7,6 +7,7 @@ import { APPLICATION_SERVICE, ApplicationService } from '@/write/shared/applicat import { EventStreamName } from '@/write/shared/application/event-stream-name.value-object'; import { completeTask } from '../domain/complete-task'; +import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; @CommandHandler(CompleteTaskApplicationCommand) export class CompleteTaskCommandHandler implements ICommandHandler { @@ -18,7 +19,7 @@ export class CompleteTaskCommandHandler implements ICommandHandler { const eventStream = EventStreamName.from('LearningMaterialsTasks', command.data.learningMaterialsId); - await this.applicationService.execute( + await this.applicationService.execute( eventStream, { causationId: command.id, diff --git a/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts b/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts new file mode 100644 index 00000000..998a96da --- /dev/null +++ b/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts @@ -0,0 +1,29 @@ +import { CommandHandler, ICommandHandler } from "@nestjs/cqrs"; +import { Inject } from "@nestjs/common"; +import { APPLICATION_SERVICE, ApplicationService } from "@/write/shared/application/application-service"; +import { EventStreamName } from "@/write/shared/application/event-stream-name.value-object"; +import { TaskWasCompleted } from "@/events/task-was-completed.domain-event"; +import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; +import { UncompleteTaskApplicationCommand } from "@/module/commands/uncomplete-task.application-command"; +import { uncompleteTask } from "@/write/learning-materials-tasks/domain/uncomplete-task"; + +@CommandHandler(UncompleteTaskApplicationCommand) +export class UncompleteTaskCommandHandler implements ICommandHandler { + constructor( + @Inject(APPLICATION_SERVICE) + private readonly applicationService: ApplicationService, + ) {} + + async execute(command: UncompleteTaskApplicationCommand): Promise { + const eventStream = EventStreamName.from('LearningMaterialsTasks', command.data.learningMaterialsId); + + await this.applicationService.execute( + eventStream, + { + causationId: command.id, + correlationId: command.metadata.correlationId, + }, + (pastEvents) => uncompleteTask(pastEvents, command), + ); + } +} diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts index f9e2e2fe..1a31abcc 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts @@ -1,15 +1,16 @@ -import { CompleteTask } from '@/module/commands/complete-task.domain-command'; -import { TaskWasCompleted } from '@/module/events/task-was-completed.domain-event'; +import { CompleteTask } from "@/module/commands/complete-task.domain-command"; +import { TaskWasCompleted } from "@/module/events/task-was-completed.domain-event"; -import { completeTask } from './complete-task'; +import { completeTask } from "./complete-task"; +import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; -describe('complete task', () => { +describe("complete task", () => { const command: CompleteTask = { - type: 'CompleteTask', - data: { learningMaterialsId: 'sbAPITNMsl2wW6j2cg1H2A', taskId: 'L9EXtwmBNBXgo_qh0uzbq' }, + type: "CompleteTask", + data: { learningMaterialsId: "sbAPITNMsl2wW6j2cg1H2A", taskId: "L9EXtwmBNBXgo_qh0uzbq" } }; - it('should return task was completed', () => { + it("should return task was completed", () => { // Given const pastEvents: TaskWasCompleted[] = []; @@ -19,19 +20,19 @@ describe('complete task', () => { // Then expect(events).toStrictEqual([ { - type: 'TaskWasCompleted', - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, - }, + type: "TaskWasCompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + } ]); }); - it('should return task was completed if other tasks are completed', () => { + it("should return task was completed if other tasks are completed", () => { // Given const pastEvents: TaskWasCompleted[] = [ { - type: 'TaskWasCompleted', - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: 'BIt23CR3dLKkHn_a2IM4V' }, - }, + type: "TaskWasCompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: "BIt23CR3dLKkHn_a2IM4V" } + } ]; // When @@ -40,25 +41,70 @@ describe('complete task', () => { // Then expect(events).toStrictEqual([ { - type: 'TaskWasCompleted', - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, - }, + type: "TaskWasCompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + } ]); }); - it('should throw exception if task was already completed', () => { + it("should throw exception if task was already completed", () => { // Given const pastEvents: TaskWasCompleted[] = [ { - type: 'TaskWasCompleted', - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, - }, + type: "TaskWasCompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + } ]; // When const events = () => completeTask(pastEvents, command); // Then - expect(events).toThrowError('Task was already completed'); + expect(events).toThrowError("Task was already completed"); + }); + + it("should complete uncompleted task", () => { + //given + const pastEvents: TaskWasUncompleted[] = [ + { + type: "TaskWasUncompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + } + ]; + + //when + const events = completeTask(pastEvents, command); + + //then + expect(events).toStrictEqual([ + { + type: "TaskWasCompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + } + ]); + }); + it("should complete task if task was completed and then uncompleted", () => { + //given + const pastEvents: (TaskWasCompleted | TaskWasUncompleted)[] = [ + { + type: "TaskWasCompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + }, + { + type: "TaskWasUncompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + } + ]; + + //when + const events = completeTask(pastEvents, command); + + //then + expect(events).toStrictEqual([ + { + type: "TaskWasCompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + } + ]); }); }); diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts index 0d03642b..d7efb67e 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts @@ -1,8 +1,9 @@ import { TaskWasCompleted } from '@/events/task-was-completed.domain-event'; import { CompleteTask } from '@/module/commands/complete-task.domain-command'; +import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; export function completeTask( - pastEvents: TaskWasCompleted[], + pastEvents: (TaskWasCompleted | TaskWasUncompleted)[], { data: { learningMaterialsId, taskId } }: CompleteTask, ): TaskWasCompleted[] { const state = pastEvents @@ -13,6 +14,9 @@ export function completeTask( case 'TaskWasCompleted': { return { completed: true }; } + case 'TaskWasUncompleted': { + return { completed: false }; + } default: { return acc; } diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts new file mode 100644 index 00000000..a7d74baf --- /dev/null +++ b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts @@ -0,0 +1,59 @@ +import { UncompleteTask } from "@/commands/uncomplete-task.domain-command"; +import { TaskWasCompleted } from "@/events/task-was-completed.domain-event"; +import { uncompleteTask } from "@/write/learning-materials-tasks/domain/uncomplete-task"; +import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; + +describe("uncomplete task", () => { + const command: UncompleteTask = { + type: "UncompleteTask", + data: { learningMaterialsId: "sbAPITNMsl2wW6j2cg1H2A", taskId: "L9EXtwmBNBXgo_qh0uzbq" } + }; + + it("should uncomplete completed task", () => { + // Given + const pastEvents: TaskWasCompleted[] = [ + { + type: "TaskWasCompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: "L9EXtwmBNBXgo_qh0uzbq" } + } + ]; + + // When + const events = uncompleteTask(pastEvents, command); + + // Then + expect(events).toStrictEqual([ + { + type: "TaskWasUncompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + } + ]); + }); + + it("should throw an error if try to uncomplete uncompleted task", () => { + // given + const pastEvents: TaskWasUncompleted[] = [ + { + type: "TaskWasUncompleted", + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + } + ]; + + // when + const events = () => uncompleteTask(pastEvents, command); + + // then + expect(events).toThrowError('Can not uncomplete uncompleted task'); + }); + + it('should throw an error if try to uncomplete task that was neither completed nor uncompleted yet', () => { + // given + const pastEvents: (TaskWasCompleted | TaskWasUncompleted)[] = []; + + // when + const events = () => uncompleteTask(pastEvents, command); + + // then + expect(events).toThrowError('Can not uncomplete uncompleted task'); + }); +}); diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts new file mode 100644 index 00000000..8f58acf3 --- /dev/null +++ b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts @@ -0,0 +1,42 @@ +import { TaskWasCompleted } from "@/events/task-was-completed.domain-event"; +import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; +import { UncompleteTask } from "@/commands/uncomplete-task.domain-command"; + +export function uncompleteTask( + pastEvents: (TaskWasCompleted | TaskWasUncompleted)[], + { data: { learningMaterialsId, taskId } }: UncompleteTask, +): TaskWasUncompleted[] { + const state = pastEvents + .filter(({ data }) => data.taskId === taskId) + .reduce<{ completed: boolean }>( + (acc, event) => { + switch (event.type) { + case 'TaskWasCompleted': { + return { completed: true }; + } + case 'TaskWasUncompleted': { + return { completed: false }; + } + default: { + return acc; + } + } + }, + { completed: false }, + ); + + if (!state.completed) { + throw new Error('Can not uncomplete task that was not completed yet.'); + } + + const newEvent: TaskWasUncompleted = { + type: 'TaskWasUncompleted', + data: { + taskId, + learningMaterialsId, + }, + }; + + return [newEvent]; +} + diff --git a/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts b/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts index 72ba47df..c2b28ac4 100644 --- a/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts +++ b/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts @@ -1,40 +1,60 @@ -import { AsyncReturnType } from 'type-fest'; +import { AsyncReturnType } from "type-fest"; -import { CompleteTaskApplicationCommand } from '@/module/commands/complete-task.application-command'; -import { TaskWasCompleted } from '@/module/events/task-was-completed.domain-event'; +import { CompleteTaskApplicationCommand } from "@/module/commands/complete-task.application-command"; +import { TaskWasCompleted } from "@/module/events/task-was-completed.domain-event"; -import { EventStreamName } from '../shared/application/event-stream-name.value-object'; -import { learningMaterialsTasksTestModule } from './learning-materials-tasks.test-module'; +import { EventStreamName } from "../shared/application/event-stream-name.value-object"; +import { learningMaterialsTasksTestModule } from "./learning-materials-tasks.test-module"; +import { UncompleteTaskApplicationCommand } from "@/commands/uncomplete-task.application-command"; +import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; +import { uncompleteTask } from "@/write/learning-materials-tasks/domain/uncomplete-task"; -describe('learning materials tasks', () => { +enum CommandType { + COMPLETE_TASK = "Complete Task", + UNCOMPLETE_TASK = "Uncomplete Task", +} + +describe("learning materials tasks", () => { let module: AsyncReturnType; - const commandBuilder = (taskId = 'VmkxXnPG02CaUNV8Relzk', learningMaterialsId = 'ZpMpw2eh1llFCGKZJEN6r') => ({ - class: CompleteTaskApplicationCommand, - type: 'CompleteTask', - data: { taskId, learningMaterialsId }, + const commandBuilder = ( + type: string, + taskId = "VmkxXnPG02CaUNV8Relzk", + learningMaterialsId = "ZpMpw2eh1llFCGKZJEN6r" + ) => ({ + class: type === CommandType.COMPLETE_TASK ? CompleteTaskApplicationCommand : UncompleteTaskApplicationCommand, + type, + data: { taskId, learningMaterialsId } + }); + + beforeEach(async () => { + module = await learningMaterialsTasksTestModule(); + }); + + afterEach(async () => { + await module.close(); }); - it('should change state of the task to complete', async () => { + it("should change state of the task to complete", async () => { // Given - const command = commandBuilder(); + const command = commandBuilder(CommandType.COMPLETE_TASK); // When await module.executeCommand(() => command); // Then await module.expectEventPublishedLastly({ - type: 'TaskWasCompleted', + type: "TaskWasCompleted", data: { learningMaterialsId: command.data.learningMaterialsId, - taskId: command.data.taskId, + taskId: command.data.taskId }, - streamName: EventStreamName.from('LearningMaterialsTasks', command.data.learningMaterialsId), + streamName: EventStreamName.from("LearningMaterialsTasks", command.data.learningMaterialsId) }); }); - it('should not change task state if task is already completed', async () => { + it("should not change task state if task is already completed", async () => { // Given - const command = commandBuilder(); + const command = commandBuilder(CommandType.COMPLETE_TASK); // When await module.executeCommand(() => command); @@ -43,11 +63,32 @@ describe('learning materials tasks', () => { await expect(() => module.executeCommand(() => command)).rejects.toThrow(); }); - beforeEach(async () => { - module = await learningMaterialsTasksTestModule(); + it("should change state of the task to uncomplete when task was completed already", async () => { + // Given + const completeCommand = commandBuilder(CommandType.COMPLETE_TASK); + const uncompleteCommand = commandBuilder(CommandType.UNCOMPLETE_TASK); + + await module.executeCommand(() => completeCommand); + + // When + await module.executeCommand(() => uncompleteCommand); + + // Then + module.expectEventPublishedLastly({ + type: "TaskWasUncompleted", + data: { + learningMaterialsId: uncompleteCommand.data.learningMaterialsId, + taskId: uncompleteCommand.data.taskId + }, + streamName: EventStreamName.from("LearningMaterialsTasks", uncompleteCommand.data.learningMaterialsId) + }); }); - afterEach(async () => { - await module.close(); + it("should not change state of the task to uncomplete if task was not completed before", async () => { + // Given + const uncompleteCommand = commandBuilder(CommandType.UNCOMPLETE_TASK); + + // When&Then + await expect(() => module.executeCommand(() => uncompleteCommand)).rejects.toThrow('Can not uncomplete task that was not completed yet.'); }); }); diff --git a/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.ts b/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.ts index acdd9c64..9a58d499 100644 --- a/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.ts +++ b/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.ts @@ -1,12 +1,14 @@ -import { Module } from '@nestjs/common'; +import { Module } from "@nestjs/common"; -import { SharedModule } from '../shared/shared.module'; -import { CompleteTaskCommandHandler } from './application/complete-task.command-handler'; -import { LearningMaterialsTaskRestController } from './presentation/rest/process-st-events.rest-controller'; +import { SharedModule } from "../shared/shared.module"; +import { CompleteTaskCommandHandler } from "./application/complete-task.command-handler"; +import { LearningMaterialsTaskRestController } from "./presentation/rest/process-st-events.rest-controller"; +import { UncompleteTaskCommandHandler } from "@/write/learning-materials-tasks/application/uncomplete-task.command-handler"; @Module({ imports: [SharedModule], - providers: [CompleteTaskCommandHandler], - controllers: [LearningMaterialsTaskRestController], + providers: [CompleteTaskCommandHandler, UncompleteTaskCommandHandler], + controllers: [LearningMaterialsTaskRestController] }) -export class LearningMaterialsTasksModule {} +export class LearningMaterialsTasksModule { +} diff --git a/packages/api/src/module/write/learning-materials-tasks/presentation/rest/process-st-events.rest-controller.ts b/packages/api/src/module/write/learning-materials-tasks/presentation/rest/process-st-events.rest-controller.ts index 49a44dc1..d2faf1d0 100644 --- a/packages/api/src/module/write/learning-materials-tasks/presentation/rest/process-st-events.rest-controller.ts +++ b/packages/api/src/module/write/learning-materials-tasks/presentation/rest/process-st-events.rest-controller.ts @@ -5,6 +5,7 @@ import { CompleteTaskApplicationCommand } from '@/module/commands/complete-task. import { ApplicationCommandFactory } from '@/write/shared/application/application-command.factory'; import { TaskCompletedRequestBody } from '../../types/taskCompletedRequestBody'; +import { UncompleteTaskApplicationCommand } from "@/commands/uncomplete-task.application-command"; @Controller('process-st/events') export class LearningMaterialsTaskRestController { @@ -24,5 +25,13 @@ export class LearningMaterialsTaskRestController { await this.commandBus.execute(command); } + + const command = this.commandFactory.applicationCommand(() => ({ + class: UncompleteTaskApplicationCommand, + type: 'UncompleteTask', + data: { learningMaterialsId, taskId }, + })); + + await this.commandBus.execute(command); } } From d58510342ffcffbb0a3a2c4c8b1a911a4d356ac9 Mon Sep 17 00:00:00 2001 From: Tomek Date: Sat, 16 Oct 2021 22:11:56 +0200 Subject: [PATCH 3/5] fix: fix tests cases and delete unused imports Refs: #230 --- .../learning-materials-tasks/domain/uncomplete-task.spec.ts | 4 ++-- .../learning-materials-tasks.write-module.spec.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts index a7d74baf..dd7dbcdc 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts @@ -43,7 +43,7 @@ describe("uncomplete task", () => { const events = () => uncompleteTask(pastEvents, command); // then - expect(events).toThrowError('Can not uncomplete uncompleted task'); + expect(events).toThrowError('Can not uncomplete task that was not completed yet.'); }); it('should throw an error if try to uncomplete task that was neither completed nor uncompleted yet', () => { @@ -54,6 +54,6 @@ describe("uncomplete task", () => { const events = () => uncompleteTask(pastEvents, command); // then - expect(events).toThrowError('Can not uncomplete uncompleted task'); + expect(events).toThrowError('Can not uncomplete task that was not completed yet.'); }); }); diff --git a/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts b/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts index c2b28ac4..fc7e9a80 100644 --- a/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts +++ b/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts @@ -7,7 +7,6 @@ import { EventStreamName } from "../shared/application/event-stream-name.value-o import { learningMaterialsTasksTestModule } from "./learning-materials-tasks.test-module"; import { UncompleteTaskApplicationCommand } from "@/commands/uncomplete-task.application-command"; import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; -import { uncompleteTask } from "@/write/learning-materials-tasks/domain/uncomplete-task"; enum CommandType { COMPLETE_TASK = "Complete Task", From aa208b42bdd79d754b005213952a77eb7543d89d Mon Sep 17 00:00:00 2001 From: Mateusz Nowak Date: Fri, 22 Oct 2021 12:00:20 +0200 Subject: [PATCH 4/5] #230 Run 'yarn lint:fix' to format code --- .../uncomplete-task.application-command.ts | 4 +- .../complete-task.command-handler.ts | 2 +- .../uncomplete-task.command-handler.ts | 17 ++-- .../domain/complete-task.spec.ts | 91 ++++++++++--------- .../domain/complete-task.ts | 2 +- .../domain/uncomplete-task.spec.ts | 36 ++++---- .../domain/uncomplete-task.ts | 7 +- ...rning-materials-tasks.write-module.spec.ts | 50 +++++----- .../learning-materials-tasks.write-module.ts | 16 ++-- .../rest/process-st-events.rest-controller.ts | 4 +- 10 files changed, 116 insertions(+), 113 deletions(-) diff --git a/packages/api/src/module/shared/commands/uncomplete-task.application-command.ts b/packages/api/src/module/shared/commands/uncomplete-task.application-command.ts index fa368f78..ea28dad3 100644 --- a/packages/api/src/module/shared/commands/uncomplete-task.application-command.ts +++ b/packages/api/src/module/shared/commands/uncomplete-task.application-command.ts @@ -1,4 +1,4 @@ -import { AbstractApplicationCommand } from "@/module/application-command-events"; -import { UncompleteTask } from "@/commands/uncomplete-task.domain-command"; +import { UncompleteTask } from '@/commands/uncomplete-task.domain-command'; +import { AbstractApplicationCommand } from '@/module/application-command-events'; export class UncompleteTaskApplicationCommand extends AbstractApplicationCommand {} diff --git a/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts b/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts index fb741f27..86b4849c 100644 --- a/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts +++ b/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts @@ -2,12 +2,12 @@ import { Inject } from '@nestjs/common'; import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; import { CompleteTaskApplicationCommand } from '@/commands/complete-task.application-command'; +import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; import { TaskWasCompleted } from '@/module/events/task-was-completed.domain-event'; import { APPLICATION_SERVICE, ApplicationService } from '@/write/shared/application/application-service'; import { EventStreamName } from '@/write/shared/application/event-stream-name.value-object'; import { completeTask } from '../domain/complete-task'; -import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; @CommandHandler(CompleteTaskApplicationCommand) export class CompleteTaskCommandHandler implements ICommandHandler { diff --git a/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts b/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts index 998a96da..96d04c61 100644 --- a/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts +++ b/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts @@ -1,11 +1,12 @@ -import { CommandHandler, ICommandHandler } from "@nestjs/cqrs"; -import { Inject } from "@nestjs/common"; -import { APPLICATION_SERVICE, ApplicationService } from "@/write/shared/application/application-service"; -import { EventStreamName } from "@/write/shared/application/event-stream-name.value-object"; -import { TaskWasCompleted } from "@/events/task-was-completed.domain-event"; -import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; -import { UncompleteTaskApplicationCommand } from "@/module/commands/uncomplete-task.application-command"; -import { uncompleteTask } from "@/write/learning-materials-tasks/domain/uncomplete-task"; +import { Inject } from '@nestjs/common'; +import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; + +import { TaskWasCompleted } from '@/events/task-was-completed.domain-event'; +import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; +import { UncompleteTaskApplicationCommand } from '@/module/commands/uncomplete-task.application-command'; +import { uncompleteTask } from '@/write/learning-materials-tasks/domain/uncomplete-task'; +import { APPLICATION_SERVICE, ApplicationService } from '@/write/shared/application/application-service'; +import { EventStreamName } from '@/write/shared/application/event-stream-name.value-object'; @CommandHandler(UncompleteTaskApplicationCommand) export class UncompleteTaskCommandHandler implements ICommandHandler { diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts index 1a31abcc..f0427806 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts @@ -1,16 +1,16 @@ -import { CompleteTask } from "@/module/commands/complete-task.domain-command"; -import { TaskWasCompleted } from "@/module/events/task-was-completed.domain-event"; +import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; +import { CompleteTask } from '@/module/commands/complete-task.domain-command'; +import { TaskWasCompleted } from '@/module/events/task-was-completed.domain-event'; -import { completeTask } from "./complete-task"; -import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; +import { completeTask } from './complete-task'; -describe("complete task", () => { +describe('complete task', () => { const command: CompleteTask = { - type: "CompleteTask", - data: { learningMaterialsId: "sbAPITNMsl2wW6j2cg1H2A", taskId: "L9EXtwmBNBXgo_qh0uzbq" } + type: 'CompleteTask', + data: { learningMaterialsId: 'sbAPITNMsl2wW6j2cg1H2A', taskId: 'L9EXtwmBNBXgo_qh0uzbq' }, }; - it("should return task was completed", () => { + it('should return task was completed', () => { // Given const pastEvents: TaskWasCompleted[] = []; @@ -20,19 +20,19 @@ describe("complete task", () => { // Then expect(events).toStrictEqual([ { - type: "TaskWasCompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } - } + type: 'TaskWasCompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, + }, ]); }); - it("should return task was completed if other tasks are completed", () => { + it('should return task was completed if other tasks are completed', () => { // Given const pastEvents: TaskWasCompleted[] = [ { - type: "TaskWasCompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: "BIt23CR3dLKkHn_a2IM4V" } - } + type: 'TaskWasCompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: 'BIt23CR3dLKkHn_a2IM4V' }, + }, ]; // When @@ -41,70 +41,71 @@ describe("complete task", () => { // Then expect(events).toStrictEqual([ { - type: "TaskWasCompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } - } + type: 'TaskWasCompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, + }, ]); }); - it("should throw exception if task was already completed", () => { + it('should throw exception if task was already completed', () => { // Given const pastEvents: TaskWasCompleted[] = [ { - type: "TaskWasCompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } - } + type: 'TaskWasCompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, + }, ]; // When const events = () => completeTask(pastEvents, command); // Then - expect(events).toThrowError("Task was already completed"); + expect(events).toThrowError('Task was already completed'); }); - it("should complete uncompleted task", () => { - //given + it('should complete uncompleted task', () => { + // given const pastEvents: TaskWasUncompleted[] = [ { - type: "TaskWasUncompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } - } + type: 'TaskWasUncompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, + }, ]; - //when + // when const events = completeTask(pastEvents, command); - //then + // then expect(events).toStrictEqual([ { - type: "TaskWasCompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } - } + type: 'TaskWasCompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, + }, ]); }); - it("should complete task if task was completed and then uncompleted", () => { - //given + + it('should complete task if task was completed and then uncompleted', () => { + // given const pastEvents: (TaskWasCompleted | TaskWasUncompleted)[] = [ { - type: "TaskWasCompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } + type: 'TaskWasCompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, }, { - type: "TaskWasUncompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } - } + type: 'TaskWasUncompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, + }, ]; - //when + // when const events = completeTask(pastEvents, command); - //then + // then expect(events).toStrictEqual([ { - type: "TaskWasCompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } - } + type: 'TaskWasCompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, + }, ]); }); }); diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts index d7efb67e..1501ad40 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts @@ -1,6 +1,6 @@ import { TaskWasCompleted } from '@/events/task-was-completed.domain-event'; -import { CompleteTask } from '@/module/commands/complete-task.domain-command'; import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; +import { CompleteTask } from '@/module/commands/complete-task.domain-command'; export function completeTask( pastEvents: (TaskWasCompleted | TaskWasUncompleted)[], diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts index dd7dbcdc..9b4cc321 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts @@ -1,21 +1,21 @@ -import { UncompleteTask } from "@/commands/uncomplete-task.domain-command"; -import { TaskWasCompleted } from "@/events/task-was-completed.domain-event"; -import { uncompleteTask } from "@/write/learning-materials-tasks/domain/uncomplete-task"; -import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; +import { UncompleteTask } from '@/commands/uncomplete-task.domain-command'; +import { TaskWasCompleted } from '@/events/task-was-completed.domain-event'; +import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; +import { uncompleteTask } from '@/write/learning-materials-tasks/domain/uncomplete-task'; -describe("uncomplete task", () => { +describe('uncomplete task', () => { const command: UncompleteTask = { - type: "UncompleteTask", - data: { learningMaterialsId: "sbAPITNMsl2wW6j2cg1H2A", taskId: "L9EXtwmBNBXgo_qh0uzbq" } + type: 'UncompleteTask', + data: { learningMaterialsId: 'sbAPITNMsl2wW6j2cg1H2A', taskId: 'L9EXtwmBNBXgo_qh0uzbq' }, }; - it("should uncomplete completed task", () => { + it('should uncomplete completed task', () => { // Given const pastEvents: TaskWasCompleted[] = [ { - type: "TaskWasCompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: "L9EXtwmBNBXgo_qh0uzbq" } - } + type: 'TaskWasCompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: 'L9EXtwmBNBXgo_qh0uzbq' }, + }, ]; // When @@ -24,19 +24,19 @@ describe("uncomplete task", () => { // Then expect(events).toStrictEqual([ { - type: "TaskWasUncompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } - } + type: 'TaskWasUncompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, + }, ]); }); - it("should throw an error if try to uncomplete uncompleted task", () => { + it('should throw an error if try to uncomplete uncompleted task', () => { // given const pastEvents: TaskWasUncompleted[] = [ { - type: "TaskWasUncompleted", - data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId } - } + type: 'TaskWasUncompleted', + data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, + }, ]; // when diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts index 8f58acf3..bdf81502 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts @@ -1,6 +1,6 @@ -import { TaskWasCompleted } from "@/events/task-was-completed.domain-event"; -import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; -import { UncompleteTask } from "@/commands/uncomplete-task.domain-command"; +import { UncompleteTask } from '@/commands/uncomplete-task.domain-command'; +import { TaskWasCompleted } from '@/events/task-was-completed.domain-event'; +import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; export function uncompleteTask( pastEvents: (TaskWasCompleted | TaskWasUncompleted)[], @@ -39,4 +39,3 @@ export function uncompleteTask( return [newEvent]; } - diff --git a/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts b/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts index fc7e9a80..d80d63ab 100644 --- a/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts +++ b/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.spec.ts @@ -1,28 +1,28 @@ -import { AsyncReturnType } from "type-fest"; +import { AsyncReturnType } from 'type-fest'; -import { CompleteTaskApplicationCommand } from "@/module/commands/complete-task.application-command"; -import { TaskWasCompleted } from "@/module/events/task-was-completed.domain-event"; +import { UncompleteTaskApplicationCommand } from '@/commands/uncomplete-task.application-command'; +import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; +import { CompleteTaskApplicationCommand } from '@/module/commands/complete-task.application-command'; +import { TaskWasCompleted } from '@/module/events/task-was-completed.domain-event'; -import { EventStreamName } from "../shared/application/event-stream-name.value-object"; -import { learningMaterialsTasksTestModule } from "./learning-materials-tasks.test-module"; -import { UncompleteTaskApplicationCommand } from "@/commands/uncomplete-task.application-command"; -import { TaskWasUncompleted } from "@/events/task-was-uncompleted-event.domain-event"; +import { EventStreamName } from '../shared/application/event-stream-name.value-object'; +import { learningMaterialsTasksTestModule } from './learning-materials-tasks.test-module'; enum CommandType { - COMPLETE_TASK = "Complete Task", - UNCOMPLETE_TASK = "Uncomplete Task", + COMPLETE_TASK = 'Complete Task', + UNCOMPLETE_TASK = 'Uncomplete Task', } -describe("learning materials tasks", () => { +describe('learning materials tasks', () => { let module: AsyncReturnType; const commandBuilder = ( type: string, - taskId = "VmkxXnPG02CaUNV8Relzk", - learningMaterialsId = "ZpMpw2eh1llFCGKZJEN6r" + taskId = 'VmkxXnPG02CaUNV8Relzk', + learningMaterialsId = 'ZpMpw2eh1llFCGKZJEN6r', ) => ({ class: type === CommandType.COMPLETE_TASK ? CompleteTaskApplicationCommand : UncompleteTaskApplicationCommand, type, - data: { taskId, learningMaterialsId } + data: { taskId, learningMaterialsId }, }); beforeEach(async () => { @@ -33,7 +33,7 @@ describe("learning materials tasks", () => { await module.close(); }); - it("should change state of the task to complete", async () => { + it('should change state of the task to complete', async () => { // Given const command = commandBuilder(CommandType.COMPLETE_TASK); @@ -42,16 +42,16 @@ describe("learning materials tasks", () => { // Then await module.expectEventPublishedLastly({ - type: "TaskWasCompleted", + type: 'TaskWasCompleted', data: { learningMaterialsId: command.data.learningMaterialsId, - taskId: command.data.taskId + taskId: command.data.taskId, }, - streamName: EventStreamName.from("LearningMaterialsTasks", command.data.learningMaterialsId) + streamName: EventStreamName.from('LearningMaterialsTasks', command.data.learningMaterialsId), }); }); - it("should not change task state if task is already completed", async () => { + it('should not change task state if task is already completed', async () => { // Given const command = commandBuilder(CommandType.COMPLETE_TASK); @@ -62,7 +62,7 @@ describe("learning materials tasks", () => { await expect(() => module.executeCommand(() => command)).rejects.toThrow(); }); - it("should change state of the task to uncomplete when task was completed already", async () => { + it('should change state of the task to uncomplete when task was completed already', async () => { // Given const completeCommand = commandBuilder(CommandType.COMPLETE_TASK); const uncompleteCommand = commandBuilder(CommandType.UNCOMPLETE_TASK); @@ -74,20 +74,22 @@ describe("learning materials tasks", () => { // Then module.expectEventPublishedLastly({ - type: "TaskWasUncompleted", + type: 'TaskWasUncompleted', data: { learningMaterialsId: uncompleteCommand.data.learningMaterialsId, - taskId: uncompleteCommand.data.taskId + taskId: uncompleteCommand.data.taskId, }, - streamName: EventStreamName.from("LearningMaterialsTasks", uncompleteCommand.data.learningMaterialsId) + streamName: EventStreamName.from('LearningMaterialsTasks', uncompleteCommand.data.learningMaterialsId), }); }); - it("should not change state of the task to uncomplete if task was not completed before", async () => { + it('should not change state of the task to uncomplete if task was not completed before', async () => { // Given const uncompleteCommand = commandBuilder(CommandType.UNCOMPLETE_TASK); // When&Then - await expect(() => module.executeCommand(() => uncompleteCommand)).rejects.toThrow('Can not uncomplete task that was not completed yet.'); + await expect(() => module.executeCommand(() => uncompleteCommand)).rejects.toThrow( + 'Can not uncomplete task that was not completed yet.', + ); }); }); diff --git a/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.ts b/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.ts index 9a58d499..f071a7c0 100644 --- a/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.ts +++ b/packages/api/src/module/write/learning-materials-tasks/learning-materials-tasks.write-module.ts @@ -1,14 +1,14 @@ -import { Module } from "@nestjs/common"; +import { Module } from '@nestjs/common'; -import { SharedModule } from "../shared/shared.module"; -import { CompleteTaskCommandHandler } from "./application/complete-task.command-handler"; -import { LearningMaterialsTaskRestController } from "./presentation/rest/process-st-events.rest-controller"; -import { UncompleteTaskCommandHandler } from "@/write/learning-materials-tasks/application/uncomplete-task.command-handler"; +import { UncompleteTaskCommandHandler } from '@/write/learning-materials-tasks/application/uncomplete-task.command-handler'; + +import { SharedModule } from '../shared/shared.module'; +import { CompleteTaskCommandHandler } from './application/complete-task.command-handler'; +import { LearningMaterialsTaskRestController } from './presentation/rest/process-st-events.rest-controller'; @Module({ imports: [SharedModule], providers: [CompleteTaskCommandHandler, UncompleteTaskCommandHandler], - controllers: [LearningMaterialsTaskRestController] + controllers: [LearningMaterialsTaskRestController], }) -export class LearningMaterialsTasksModule { -} +export class LearningMaterialsTasksModule {} diff --git a/packages/api/src/module/write/learning-materials-tasks/presentation/rest/process-st-events.rest-controller.ts b/packages/api/src/module/write/learning-materials-tasks/presentation/rest/process-st-events.rest-controller.ts index d2faf1d0..ca9dbfb1 100644 --- a/packages/api/src/module/write/learning-materials-tasks/presentation/rest/process-st-events.rest-controller.ts +++ b/packages/api/src/module/write/learning-materials-tasks/presentation/rest/process-st-events.rest-controller.ts @@ -1,11 +1,11 @@ import { Body, Controller, HttpCode, Post } from '@nestjs/common'; import { CommandBus } from '@nestjs/cqrs'; +import { UncompleteTaskApplicationCommand } from '@/commands/uncomplete-task.application-command'; import { CompleteTaskApplicationCommand } from '@/module/commands/complete-task.application-command'; import { ApplicationCommandFactory } from '@/write/shared/application/application-command.factory'; import { TaskCompletedRequestBody } from '../../types/taskCompletedRequestBody'; -import { UncompleteTaskApplicationCommand } from "@/commands/uncomplete-task.application-command"; @Controller('process-st/events') export class LearningMaterialsTaskRestController { @@ -28,7 +28,7 @@ export class LearningMaterialsTaskRestController { const command = this.commandFactory.applicationCommand(() => ({ class: UncompleteTaskApplicationCommand, - type: 'UncompleteTask', + type: 'UncompleteTask', data: { learningMaterialsId, taskId }, })); From afe0aac070605787dadf3ddd37824f3686a00e27 Mon Sep 17 00:00:00 2001 From: Mateusz Nowak Date: Fri, 22 Oct 2021 20:33:00 +0200 Subject: [PATCH 5/5] #230 Add type LearningMaterialsTasksDomainEvent = TaskWasCompleted | TaskWasUncompleted --- .../application/complete-task.command-handler.ts | 5 ++--- .../application/uncomplete-task.command-handler.ts | 5 ++--- .../learning-materials-tasks/domain/complete-task.spec.ts | 3 ++- .../write/learning-materials-tasks/domain/complete-task.ts | 4 ++-- .../module/write/learning-materials-tasks/domain/events.ts | 4 ++++ .../learning-materials-tasks/domain/uncomplete-task.spec.ts | 3 ++- .../write/learning-materials-tasks/domain/uncomplete-task.ts | 4 ++-- 7 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 packages/api/src/module/write/learning-materials-tasks/domain/events.ts diff --git a/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts b/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts index 86b4849c..20c74d9a 100644 --- a/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts +++ b/packages/api/src/module/write/learning-materials-tasks/application/complete-task.command-handler.ts @@ -2,8 +2,7 @@ import { Inject } from '@nestjs/common'; import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; import { CompleteTaskApplicationCommand } from '@/commands/complete-task.application-command'; -import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; -import { TaskWasCompleted } from '@/module/events/task-was-completed.domain-event'; +import { LearningMaterialsTasksDomainEvent } from '@/write/learning-materials-tasks/domain/events'; import { APPLICATION_SERVICE, ApplicationService } from '@/write/shared/application/application-service'; import { EventStreamName } from '@/write/shared/application/event-stream-name.value-object'; @@ -19,7 +18,7 @@ export class CompleteTaskCommandHandler implements ICommandHandler { const eventStream = EventStreamName.from('LearningMaterialsTasks', command.data.learningMaterialsId); - await this.applicationService.execute( + await this.applicationService.execute( eventStream, { causationId: command.id, diff --git a/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts b/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts index 96d04c61..d793717c 100644 --- a/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts +++ b/packages/api/src/module/write/learning-materials-tasks/application/uncomplete-task.command-handler.ts @@ -1,9 +1,8 @@ import { Inject } from '@nestjs/common'; import { CommandHandler, ICommandHandler } from '@nestjs/cqrs'; -import { TaskWasCompleted } from '@/events/task-was-completed.domain-event'; -import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; import { UncompleteTaskApplicationCommand } from '@/module/commands/uncomplete-task.application-command'; +import { LearningMaterialsTasksDomainEvent } from '@/write/learning-materials-tasks/domain/events'; import { uncompleteTask } from '@/write/learning-materials-tasks/domain/uncomplete-task'; import { APPLICATION_SERVICE, ApplicationService } from '@/write/shared/application/application-service'; import { EventStreamName } from '@/write/shared/application/event-stream-name.value-object'; @@ -18,7 +17,7 @@ export class UncompleteTaskCommandHandler implements ICommandHandler { const eventStream = EventStreamName.from('LearningMaterialsTasks', command.data.learningMaterialsId); - await this.applicationService.execute( + await this.applicationService.execute( eventStream, { causationId: command.id, diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts index f0427806..5c664c72 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.spec.ts @@ -1,6 +1,7 @@ import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; import { CompleteTask } from '@/module/commands/complete-task.domain-command'; import { TaskWasCompleted } from '@/module/events/task-was-completed.domain-event'; +import { LearningMaterialsTasksDomainEvent } from '@/write/learning-materials-tasks/domain/events'; import { completeTask } from './complete-task'; @@ -86,7 +87,7 @@ describe('complete task', () => { it('should complete task if task was completed and then uncompleted', () => { // given - const pastEvents: (TaskWasCompleted | TaskWasUncompleted)[] = [ + const pastEvents: LearningMaterialsTasksDomainEvent[] = [ { type: 'TaskWasCompleted', data: { learningMaterialsId: command.data.learningMaterialsId, taskId: command.data.taskId }, diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts index 1501ad40..352fa6a9 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/complete-task.ts @@ -1,9 +1,9 @@ import { TaskWasCompleted } from '@/events/task-was-completed.domain-event'; -import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; import { CompleteTask } from '@/module/commands/complete-task.domain-command'; +import { LearningMaterialsTasksDomainEvent } from '@/write/learning-materials-tasks/domain/events'; export function completeTask( - pastEvents: (TaskWasCompleted | TaskWasUncompleted)[], + pastEvents: LearningMaterialsTasksDomainEvent[], { data: { learningMaterialsId, taskId } }: CompleteTask, ): TaskWasCompleted[] { const state = pastEvents diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/events.ts b/packages/api/src/module/write/learning-materials-tasks/domain/events.ts new file mode 100644 index 00000000..30e33d52 --- /dev/null +++ b/packages/api/src/module/write/learning-materials-tasks/domain/events.ts @@ -0,0 +1,4 @@ +import { TaskWasCompleted } from '@/events/task-was-completed.domain-event'; +import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; + +export type LearningMaterialsTasksDomainEvent = TaskWasCompleted | TaskWasUncompleted; diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts index 9b4cc321..6882769a 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.spec.ts @@ -1,6 +1,7 @@ import { UncompleteTask } from '@/commands/uncomplete-task.domain-command'; import { TaskWasCompleted } from '@/events/task-was-completed.domain-event'; import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; +import { LearningMaterialsTasksDomainEvent } from '@/write/learning-materials-tasks/domain/events'; import { uncompleteTask } from '@/write/learning-materials-tasks/domain/uncomplete-task'; describe('uncomplete task', () => { @@ -48,7 +49,7 @@ describe('uncomplete task', () => { it('should throw an error if try to uncomplete task that was neither completed nor uncompleted yet', () => { // given - const pastEvents: (TaskWasCompleted | TaskWasUncompleted)[] = []; + const pastEvents: LearningMaterialsTasksDomainEvent[] = []; // when const events = () => uncompleteTask(pastEvents, command); diff --git a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts index bdf81502..2ddd058a 100644 --- a/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts +++ b/packages/api/src/module/write/learning-materials-tasks/domain/uncomplete-task.ts @@ -1,9 +1,9 @@ import { UncompleteTask } from '@/commands/uncomplete-task.domain-command'; -import { TaskWasCompleted } from '@/events/task-was-completed.domain-event'; import { TaskWasUncompleted } from '@/events/task-was-uncompleted-event.domain-event'; +import { LearningMaterialsTasksDomainEvent } from '@/write/learning-materials-tasks/domain/events'; export function uncompleteTask( - pastEvents: (TaskWasCompleted | TaskWasUncompleted)[], + pastEvents: LearningMaterialsTasksDomainEvent[], { data: { learningMaterialsId, taskId } }: UncompleteTask, ): TaskWasUncompleted[] { const state = pastEvents