diff --git a/src/lib/server/db/repository.ts b/src/lib/server/db/repository.ts new file mode 100644 index 0000000..44a80b4 --- /dev/null +++ b/src/lib/server/db/repository.ts @@ -0,0 +1,68 @@ +import { eq, desc } from 'drizzle-orm'; +import { db } from './index'; +import { entries, type Entry, type NewEntry } from './schema'; +import { nanoid } from 'nanoid'; + +export interface EntryRepository { + create(entry: Omit): Entry; + getById(id: string): Entry | undefined; + getAll(options?: { limit?: number; offset?: number }): Entry[]; + update(id: string, updates: Partial>): Entry | undefined; + delete(id: string): boolean; + count(): number; +} + +class SQLiteEntryRepository implements EntryRepository { + create(entry: Omit): Entry { + const now = new Date().toISOString(); + const newEntry: NewEntry = { + ...entry, + id: nanoid(), + createdAt: now, + updatedAt: now + }; + + db.insert(entries).values(newEntry).run(); + return this.getById(newEntry.id)!; + } + + getById(id: string): Entry | undefined { + return db.select().from(entries).where(eq(entries.id, id)).get(); + } + + getAll(options: { limit?: number; offset?: number } = {}): Entry[] { + const { limit = 100, offset = 0 } = options; + return db.select().from(entries).orderBy(desc(entries.createdAt)).limit(limit).offset(offset).all(); + } + + update(id: string, updates: Partial>): Entry | undefined { + const existing = this.getById(id); + if (!existing) return undefined; + + db.update(entries) + .set({ + ...updates, + updatedAt: new Date().toISOString() + }) + .where(eq(entries.id, id)) + .run(); + + return this.getById(id); + } + + delete(id: string): boolean { + const existing = this.getById(id); + if (!existing) return false; + + db.delete(entries).where(eq(entries.id, id)).run(); + return true; + } + + count(): number { + const result = db.select().from(entries).all(); + return result.length; + } +} + +// Singleton instance +export const entryRepository: EntryRepository = new SQLiteEntryRepository();