aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/repositories
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/repositories')
-rw-r--r--src/server/repositories/note.ts110
1 files changed, 28 insertions, 82 deletions
diff --git a/src/server/repositories/note.ts b/src/server/repositories/note.ts
index 6f607cf..22c760d 100644
--- a/src/server/repositories/note.ts
+++ b/src/server/repositories/note.ts
@@ -1,7 +1,7 @@
import { and, eq, isNull, sql } from "drizzle-orm";
+import { generateCardsForNote } from "../../shared/card-generator.js";
import { db } from "../db/index.js";
import {
- CardState,
cards,
noteFieldTypes,
noteFieldValues,
@@ -122,27 +122,15 @@ export const noteRepository: NoteRepository = {
}
const createdCards: Card[] = [];
-
- const normalCard = await createCardForNote(
- deckId,
- note.id,
- noteType[0],
- fieldValuesResult,
+ const generatedCards = generateCardsForNote({
+ noteType: noteType[0],
fieldTypes,
- false,
- );
- createdCards.push(normalCard);
+ fieldValues: fieldValuesResult,
+ });
- if (noteType[0].isReversible) {
- const reversedCard = await createCardForNote(
- deckId,
- note.id,
- noteType[0],
- fieldValuesResult,
- fieldTypes,
- true,
- );
- createdCards.push(reversedCard);
+ for (const generated of generatedCards) {
+ const card = await insertGeneratedCard(deckId, note.id, generated);
+ createdCards.push(card);
}
return {
@@ -357,26 +345,13 @@ export const noteRepository: NoteRepository = {
}
}
- // Create normal card
- await createCardForNote(
- deckId,
- note.id,
- cached.noteType,
- fieldValuesResult,
- cached.fieldTypes,
- false,
- );
-
- // Create reversed card if reversible
- if (cached.noteType.isReversible) {
- await createCardForNote(
- deckId,
- note.id,
- cached.noteType,
- fieldValuesResult,
- cached.fieldTypes,
- true,
- );
+ const generatedCards = generateCardsForNote({
+ noteType: cached.noteType,
+ fieldTypes: cached.fieldTypes,
+ fieldValues: fieldValuesResult,
+ });
+ for (const generated of generatedCards) {
+ await insertGeneratedCard(deckId, note.id, generated);
}
created++;
@@ -392,48 +367,27 @@ export const noteRepository: NoteRepository = {
},
};
-async function createCardForNote(
+async function insertGeneratedCard(
deckId: string,
noteId: string,
- noteType: { frontTemplate: string; backTemplate: string },
- fieldValues: NoteFieldValue[],
- fieldTypes: { id: string; name: string }[],
- isReversed: boolean,
+ generated: ReturnType<typeof generateCardsForNote>[number],
): Promise<Card> {
- const fieldMap = new Map<string, string>();
- for (const fv of fieldValues) {
- const fieldType = fieldTypes.find((ft) => ft.id === fv.noteFieldTypeId);
- if (fieldType) {
- fieldMap.set(fieldType.name, fv.value);
- }
- }
-
- const frontTemplate = isReversed
- ? noteType.backTemplate
- : noteType.frontTemplate;
- const backTemplate = isReversed
- ? noteType.frontTemplate
- : noteType.backTemplate;
-
- const front = renderTemplate(frontTemplate, fieldMap);
- const back = renderTemplate(backTemplate, fieldMap);
-
const [card] = await db
.insert(cards)
.values({
deckId,
noteId,
- isReversed,
- front,
- back,
- state: CardState.New,
- due: new Date(),
- stability: 0,
- difficulty: 0,
- elapsedDays: 0,
- scheduledDays: 0,
- reps: 0,
- lapses: 0,
+ isReversed: generated.isReversed,
+ front: generated.front,
+ back: generated.back,
+ state: generated.state,
+ due: generated.due,
+ stability: generated.stability,
+ difficulty: generated.difficulty,
+ elapsedDays: generated.elapsedDays,
+ scheduledDays: generated.scheduledDays,
+ reps: generated.reps,
+ lapses: generated.lapses,
})
.returning();
@@ -443,11 +397,3 @@ async function createCardForNote(
return card;
}
-
-function renderTemplate(template: string, fields: Map<string, string>): string {
- let result = template;
- for (const [name, value] of fields) {
- result = result.replace(new RegExp(`\\{\\{${name}\\}\\}`, "g"), value);
- }
- return result;
-}