From b49b4b19dcb71c06b7c7a67ed13dadf07b53b3c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 27 Jun 2024 21:55:22 +0200 Subject: [PATCH] TodoRepository work --- packages/common/package.json | 3 +- packages/common/src/data/Todo.class.ts | 32 +++++++++++++++++++ packages/common/src/data/Todo.ts | 28 ---------------- packages/common/src/data/index.ts | 2 +- .../common/src/traits/Identifiable.trait.ts | 22 +++++++++++++ packages/common/src/traits/index.ts | 1 + packages/server/src/TodoRepository.ts | 26 ++++++++++++++- 7 files changed, 83 insertions(+), 31 deletions(-) create mode 100644 packages/common/src/data/Todo.class.ts delete mode 100644 packages/common/src/data/Todo.ts create mode 100644 packages/common/src/traits/Identifiable.trait.ts create mode 100644 packages/common/src/traits/index.ts diff --git a/packages/common/package.json b/packages/common/package.json index f5f5fd3..9914bb3 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -2,7 +2,8 @@ "name": "@todo-tests/common", "type": "module", "exports": { - "./data": "./src/data/index.ts" + "./data": "./src/data/index.ts", + "./traits": "./src/traits/index.ts" }, "private": true, "dependencies": { diff --git a/packages/common/src/data/Todo.class.ts b/packages/common/src/data/Todo.class.ts new file mode 100644 index 0000000..a12d40e --- /dev/null +++ b/packages/common/src/data/Todo.class.ts @@ -0,0 +1,32 @@ +import { Schema as S } from "@effect/schema" +import { Jsonifiable, Kind, Tag } from "@thilawyn/thilalib/effect/schema" +import { Class } from "@thilawyn/thilalib/effect/schema/class" +import type { Identifiable } from "../traits" + + +export class Todo + extends Class("Todo")({ + _kind: Kind("Todo"), + _tag: Tag("Todo"), + + id: S.String, + title: S.String, + content: S.String, + + due: S.OptionFromSelf(S.DateFromSelf), + completed: S.Boolean, + + createdAt: S.DateFromSelf, + updatedAt: S.DateFromSelf, + }) + implements Identifiable<"Todo", string> +{} + + +export const JsonifiableTodo = Todo.pipe(Jsonifiable(S.Struct({ + ...Todo.fields, + + due: S.OptionFromNullOr(S.DateFromString), + createdAt: S.DateFromString, + updatedAt: S.DateFromString, +}))) diff --git a/packages/common/src/data/Todo.ts b/packages/common/src/data/Todo.ts deleted file mode 100644 index d37e293..0000000 --- a/packages/common/src/data/Todo.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Schema as S } from "@effect/schema" -import { Jsonifiable, Kind, Tag } from "@thilawyn/thilalib/effect/schema" -import { Class } from "@thilawyn/thilalib/effect/schema/class" - - -export class Todo extends Class("Todo")({ - _kind: Kind("Todo"), - _tag: Tag("Todo"), - - id: S.String, - title: S.String, - content: S.String, - - due: S.OptionFromSelf(S.DateFromSelf), - completed: S.Boolean, - - createdAt: S.DateFromSelf, - updatedAt: S.DateFromSelf, -}) {} - - -export const JsonifiableTodo = Todo.pipe(Jsonifiable(S.Struct({ - ...Todo.fields, - - due: S.OptionFromNullOr(S.DateFromString), - createdAt: S.DateFromString, - updatedAt: S.DateFromString, -}))) diff --git a/packages/common/src/data/index.ts b/packages/common/src/data/index.ts index d5dbbf5..5dcc9d8 100644 --- a/packages/common/src/data/index.ts +++ b/packages/common/src/data/index.ts @@ -1 +1 @@ -export * from "./Todo" +export * from "./Todo.class" diff --git a/packages/common/src/traits/Identifiable.trait.ts b/packages/common/src/traits/Identifiable.trait.ts new file mode 100644 index 0000000..9a5972a --- /dev/null +++ b/packages/common/src/traits/Identifiable.trait.ts @@ -0,0 +1,22 @@ +import { Equal } from "effect" + + +export interface Identifiable< + Kind extends string, + ID, +> { + readonly _kind: Kind + readonly id: ID +} + +export module Identifiable { + export function equals< + Kind extends string, + ID, + >( + that: Identifiable, + to: Identifiable, + ): boolean { + return Equal.equals(that.id, to.id) + } +} diff --git a/packages/common/src/traits/index.ts b/packages/common/src/traits/index.ts new file mode 100644 index 0000000..26ec471 --- /dev/null +++ b/packages/common/src/traits/index.ts @@ -0,0 +1 @@ +export * from "./Identifiable.trait" diff --git a/packages/server/src/TodoRepository.ts b/packages/server/src/TodoRepository.ts index 8845b2c..c532ac3 100644 --- a/packages/server/src/TodoRepository.ts +++ b/packages/server/src/TodoRepository.ts @@ -1,9 +1,33 @@ import { Todo } from "@todo-tests/common/data" -import { Array, Context, Effect, Option, Ref } from "effect" +import { Array, Context, Effect, Option, Ref, SubscriptionRef } from "effect" export class TodoRepository extends Context.Tag("TodoRepository")>() {} +export class TodoRepositoryService { + constructor( + readonly ref: SubscriptionRef.SubscriptionRef + ) {} + + get(id: string) { + return this.ref.get.pipe( + Effect.map(Array.findFirst(todo => todo.id === id)) + ) + } + getIndex(id: string) { + return this.ref.get.pipe( + Effect.map(Array.findFirstIndex(todo => todo.id === id)) + ) + } + + update(todo: Todo) { + return Effect.gen(this, function*() { + const todoWithSameIDIndex = yield* this.getIndex(todo.id) + + }) + } +} + export const createDefaultTodos = TodoRepository.pipe(Effect.flatMap(repo => Ref.update(repo, todos =>