Add deck generation and study flow improvements
All checks were successful
Automated Container Build / build-and-push (push) Successful in 1m22s
All checks were successful
Automated Container Build / build-and-push (push) Successful in 1m22s
This commit is contained in:
parent
d6f3502cb1
commit
7b90409f2e
36 changed files with 8683 additions and 31 deletions
|
|
@ -0,0 +1,64 @@
|
|||
-- CreateTable
|
||||
CREATE TABLE "SpacedRepetitionSet" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"classId" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"newCardsPerDay" INTEGER NOT NULL DEFAULT 30,
|
||||
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "SpacedRepetitionSet_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "SpacedRepetitionSetDeck" (
|
||||
"setId" TEXT NOT NULL,
|
||||
"deckId" TEXT NOT NULL,
|
||||
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
||||
"addedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
PRIMARY KEY ("setId", "deckId"),
|
||||
CONSTRAINT "SpacedRepetitionSetDeck_setId_fkey" FOREIGN KEY ("setId") REFERENCES "SpacedRepetitionSet" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "SpacedRepetitionSetDeck_deckId_fkey" FOREIGN KEY ("deckId") REFERENCES "Deck" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "SpacedRepetitionCardState" (
|
||||
"id" TEXT NOT NULL PRIMARY KEY,
|
||||
"setId" TEXT NOT NULL,
|
||||
"flashcardId" TEXT NOT NULL,
|
||||
"due" DATETIME NOT NULL,
|
||||
"stability" REAL NOT NULL,
|
||||
"difficulty" REAL NOT NULL,
|
||||
"elapsedDays" INTEGER NOT NULL,
|
||||
"scheduledDays" INTEGER NOT NULL,
|
||||
"learningSteps" INTEGER NOT NULL DEFAULT 0,
|
||||
"reps" INTEGER NOT NULL,
|
||||
"lapses" INTEGER NOT NULL,
|
||||
"state" INTEGER NOT NULL,
|
||||
"firstReviewedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"lastReview" DATETIME,
|
||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" DATETIME NOT NULL,
|
||||
CONSTRAINT "SpacedRepetitionCardState_setId_fkey" FOREIGN KEY ("setId") REFERENCES "SpacedRepetitionSet" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT "SpacedRepetitionCardState_flashcardId_fkey" FOREIGN KEY ("flashcardId") REFERENCES "Flashcard" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "SpacedRepetitionSet_classId_sortOrder_idx" ON "SpacedRepetitionSet"("classId", "sortOrder");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "SpacedRepetitionSetDeck_deckId_idx" ON "SpacedRepetitionSetDeck"("deckId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "SpacedRepetitionCardState_setId_due_idx" ON "SpacedRepetitionCardState"("setId", "due");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "SpacedRepetitionCardState_setId_firstReviewedAt_idx" ON "SpacedRepetitionCardState"("setId", "firstReviewedAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "SpacedRepetitionCardState_flashcardId_idx" ON "SpacedRepetitionCardState"("flashcardId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "SpacedRepetitionCardState_setId_flashcardId_key" ON "SpacedRepetitionCardState"("setId", "flashcardId");
|
||||
|
|
@ -14,9 +14,10 @@ model Class {
|
|||
sortOrder Int @default(0)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
decks Deck[]
|
||||
quizSets QuizSet[]
|
||||
materialGroups MaterialGroup[]
|
||||
decks Deck[]
|
||||
quizSets QuizSet[]
|
||||
materialGroups MaterialGroup[]
|
||||
spacedRepetitionSets SpacedRepetitionSet[]
|
||||
}
|
||||
|
||||
model Deck {
|
||||
|
|
@ -27,12 +28,13 @@ model Deck {
|
|||
sortOrder Int @default(0)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
|
||||
groupId String?
|
||||
group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)
|
||||
cards Flashcard[]
|
||||
shareLink ShareLink?
|
||||
progress StudyProgress[]
|
||||
class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
|
||||
groupId String?
|
||||
group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)
|
||||
cards Flashcard[]
|
||||
shareLink ShareLink?
|
||||
progress StudyProgress[]
|
||||
spacedRepetitionMemberships SpacedRepetitionSetDeck[]
|
||||
}
|
||||
|
||||
model Flashcard {
|
||||
|
|
@ -42,7 +44,8 @@ model Flashcard {
|
|||
back String
|
||||
sortOrder Int @default(0)
|
||||
|
||||
deck Deck @relation(fields: [deckId], references: [id], onDelete: Cascade)
|
||||
deck Deck @relation(fields: [deckId], references: [id], onDelete: Cascade)
|
||||
spacedRepetitionStates SpacedRepetitionCardState[]
|
||||
}
|
||||
|
||||
model QuizSet {
|
||||
|
|
@ -53,9 +56,9 @@ model QuizSet {
|
|||
sortOrder Int @default(0)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
|
||||
class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
|
||||
groupId String?
|
||||
group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)
|
||||
group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)
|
||||
questions Question[]
|
||||
attempts QuizAttempt[]
|
||||
shareLink ShareLink?
|
||||
|
|
@ -153,12 +156,69 @@ model MaterialGroup {
|
|||
id String @id @default(uuid())
|
||||
classId String
|
||||
name String
|
||||
type String // "DECK" | "QUIZ"
|
||||
type String // "DECK" | "QUIZ"
|
||||
sortOrder Int @default(0)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
|
||||
class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
|
||||
decks Deck[]
|
||||
quizSets QuizSet[]
|
||||
shareLink ShareLink?
|
||||
}
|
||||
|
||||
model SpacedRepetitionSet {
|
||||
id String @id @default(uuid())
|
||||
classId String
|
||||
name String
|
||||
description String?
|
||||
newCardsPerDay Int @default(30)
|
||||
sortOrder Int @default(0)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
|
||||
decks SpacedRepetitionSetDeck[]
|
||||
cardStates SpacedRepetitionCardState[]
|
||||
|
||||
@@index([classId, sortOrder])
|
||||
}
|
||||
|
||||
model SpacedRepetitionSetDeck {
|
||||
setId String
|
||||
deckId String
|
||||
sortOrder Int @default(0)
|
||||
addedAt DateTime @default(now())
|
||||
|
||||
set SpacedRepetitionSet @relation(fields: [setId], references: [id], onDelete: Cascade)
|
||||
deck Deck @relation(fields: [deckId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@id([setId, deckId])
|
||||
@@index([deckId])
|
||||
}
|
||||
|
||||
model SpacedRepetitionCardState {
|
||||
id String @id @default(uuid())
|
||||
setId String
|
||||
flashcardId String
|
||||
due DateTime
|
||||
stability Float
|
||||
difficulty Float
|
||||
elapsedDays Int
|
||||
scheduledDays Int
|
||||
learningSteps Int @default(0)
|
||||
reps Int
|
||||
lapses Int
|
||||
state Int
|
||||
firstReviewedAt DateTime @default(now())
|
||||
lastReview DateTime?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
set SpacedRepetitionSet @relation(fields: [setId], references: [id], onDelete: Cascade)
|
||||
flashcard Flashcard @relation(fields: [flashcardId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([setId, flashcardId])
|
||||
@@index([setId, due])
|
||||
@@index([setId, firstReviewedAt])
|
||||
@@index([flashcardId])
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue