journal-media-vue/src/services/read-api.ts
gcch 0f52ff0cef 2025-02-23
2025-02-24
2025-02-24 00:18:53 +01:00

25 lines
894 B
TypeScript

import { DiaryEntries } from "@/db/schemas";
import { singleResultOrFail } from "@/libs/utils/effects";
import { desc } from "drizzle-orm";
import { Data, Effect } from "effect";
import { LocalSqlite } from "./db";
class ReadApiError extends Data.TaggedError("ReadApiError")<{ cause: unknown }> {}
export class ReadApi extends Effect.Service<ReadApi>()("ReadApi", {
dependencies: [LocalSqlite.Default],
effect: Effect.gen(function*() {
const { query } = yield* LocalSqlite;
yield* Effect.logDebug("--- READ-API ---");
return {
getAllEntries: () => query(_ => _.select().from(DiaryEntries)),
getLastAddedEntry: () =>
query(_ => _.select().from(DiaryEntries).limit(1).orderBy(desc(DiaryEntries.dateCreated))).pipe(
singleResultOrFail(() => new ReadApiError({ cause: "Aucune entrée n'a encore été ajoutée." })),
),
};
}),
}) {}