From bcc2fc250c3c86ebb78cfe7df2b1d3e531ed6d82 Mon Sep 17 00:00:00 2001 From: Daniel Haarhoff Date: Thu, 5 Sep 2024 16:22:30 +0100 Subject: [PATCH] Keep track of when people where recorded as owners #59 --- src/read-models/shared-state/get-member.ts | 1 + src/read-models/shared-state/return-types.ts | 1 + src/read-models/shared-state/state.ts | 6 +++++- src/read-models/shared-state/update-state.ts | 6 +++++- tests/read-models/shared-state/get-member.test.ts | 10 +++++++++- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/read-models/shared-state/get-member.ts b/src/read-models/shared-state/get-member.ts index 71a0a49..d6f0252 100644 --- a/src/read-models/shared-state/get-member.ts +++ b/src/read-models/shared-state/get-member.ts @@ -43,6 +43,7 @@ export const getMember = .select({ id: ownersTable.areaId, name: areasTable.name, + ownershipRecordedAt: ownersTable.ownershipRecordedAt, }) .from(ownersTable) .leftJoin(areasTable, eq(areasTable.id, ownersTable.areaId)) diff --git a/src/read-models/shared-state/return-types.ts b/src/read-models/shared-state/return-types.ts index b2cf364..863fb51 100644 --- a/src/read-models/shared-state/return-types.ts +++ b/src/read-models/shared-state/return-types.ts @@ -17,6 +17,7 @@ type TrainedOn = { type OwnerOf = { id: string; name: string; + ownershipRecordedAt: Date; }; export type Member = { diff --git a/src/read-models/shared-state/state.ts b/src/read-models/shared-state/state.ts index d165481..2811c2b 100644 --- a/src/read-models/shared-state/state.ts +++ b/src/read-models/shared-state/state.ts @@ -102,12 +102,16 @@ export const ownersTable = sqliteTable('owners', { areaId: text('areaId') .notNull() .references(() => areasTable.id), + ownershipRecordedAt: blob('ownershipRecordedAt', {mode: 'json'}) + .notNull() + .$type(), }); const createOwnersTable = sql` CREATE TABLE IF NOT EXISTS owners ( memberNumber INTEGER, - areaId TEXT + areaId TEXT, + ownershipRecordedAt BLOB ) `; diff --git a/src/read-models/shared-state/update-state.ts b/src/read-models/shared-state/update-state.ts index 854ca55..c872c8e 100644 --- a/src/read-models/shared-state/update-state.ts +++ b/src/read-models/shared-state/update-state.ts @@ -105,7 +105,11 @@ export const updateState = break; case 'OwnerAdded': db.insert(ownersTable) - .values({memberNumber: event.memberNumber, areaId: event.areaId}) + .values({ + memberNumber: event.memberNumber, + areaId: event.areaId, + ownershipRecordedAt: event.recordedAt, + }) .run(); break; diff --git a/tests/read-models/shared-state/get-member.test.ts b/tests/read-models/shared-state/get-member.test.ts index ccef4ea..8249803 100644 --- a/tests/read-models/shared-state/get-member.test.ts +++ b/tests/read-models/shared-state/get-member.test.ts @@ -221,8 +221,11 @@ describe('get-via-shared-read-model', () => { name: faker.company.buzzNoun() as NonEmptyString, id: faker.string.uuid() as UUID, }; + const recordedAt = faker.date.future(); + recordedAt.setMilliseconds(0); beforeEach(async () => { await framework.commands.area.create(createArea); + advanceTo(recordedAt); await framework.commands.area.addOwner({ memberNumber: memberNumber, areaId: createArea.id, @@ -236,7 +239,12 @@ describe('get-via-shared-read-model', () => { expect(result.ownerOf[0].name).toStrictEqual(createArea.name); }); - it.todo('returns when they became an owner'); + it('returns when they became an owner', () => { + const result = runQuery(); + expect(result.ownerOf[0].ownershipRecordedAt).toStrictEqual( + recordedAt.toISOString() + ); + }); }); }); });