aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/repositories/card.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/repositories/card.ts')
-rw-r--r--src/server/repositories/card.ts62
1 files changed, 60 insertions, 2 deletions
diff --git a/src/server/repositories/card.ts b/src/server/repositories/card.ts
index 76c9d30..830b2f7 100644
--- a/src/server/repositories/card.ts
+++ b/src/server/repositories/card.ts
@@ -1,7 +1,7 @@
import { and, eq, isNull, lte, sql } from "drizzle-orm";
import { db } from "../db/index.js";
-import { CardState, cards } from "../db/schema.js";
-import type { Card, CardRepository } from "./types.js";
+import { CardState, cards, noteFieldValues, notes } from "../db/schema.js";
+import type { Card, CardRepository, CardWithNoteData } from "./types.js";
export const cardRepository: CardRepository = {
async findByDeckId(deckId: string): Promise<Card[]> {
@@ -26,6 +26,50 @@ export const cardRepository: CardRepository = {
return result[0];
},
+ async findByIdWithNoteData(
+ id: string,
+ deckId: string,
+ ): Promise<CardWithNoteData | undefined> {
+ const card = await this.findById(id, deckId);
+ if (!card) {
+ return undefined;
+ }
+
+ if (!card.noteId) {
+ return {
+ ...card,
+ note: null,
+ fieldValues: [],
+ };
+ }
+
+ const noteResult = await db
+ .select()
+ .from(notes)
+ .where(and(eq(notes.id, card.noteId), isNull(notes.deletedAt)));
+
+ const note = noteResult[0] ?? null;
+
+ const fieldValuesResult = await db
+ .select()
+ .from(noteFieldValues)
+ .where(eq(noteFieldValues.noteId, card.noteId));
+
+ return {
+ ...card,
+ note,
+ fieldValues: fieldValuesResult,
+ };
+ },
+
+ async findByNoteId(noteId: string): Promise<Card[]> {
+ const result = await db
+ .select()
+ .from(cards)
+ .where(and(eq(cards.noteId, noteId), isNull(cards.deletedAt)));
+ return result;
+ },
+
async create(
deckId: string,
data: {
@@ -100,6 +144,20 @@ export const cardRepository: CardRepository = {
return result.length > 0;
},
+ async softDeleteByNoteId(noteId: string): Promise<boolean> {
+ const now = new Date();
+ const result = await db
+ .update(cards)
+ .set({
+ deletedAt: now,
+ updatedAt: now,
+ syncVersion: sql`${cards.syncVersion} + 1`,
+ })
+ .where(and(eq(cards.noteId, noteId), isNull(cards.deletedAt)))
+ .returning({ id: cards.id });
+ return result.length > 0;
+ },
+
async findDueCards(
deckId: string,
now: Date,