1- import { getSessionUserId } from "@/app/(auth)/api/auth/[...nextauth]/session" ;
2- import prisma from "./prisma" ;
3- import { FSRSParameters , fsrs } from "ts-fsrs" ;
4- import { Card , State } from "@prisma/client" ;
1+ import { getSessionUserId } from '@/app/(auth)/api/auth/[...nextauth]/session' ;
2+ import prisma from './prisma' ;
3+ import {
4+ FSRSHistory ,
5+ FSRSParameters ,
6+ TypeConvert ,
7+ fsrs ,
8+ Card as FSRSCard ,
9+ } from 'ts-fsrs' ;
10+ import { Card , Revlog , State } from '@prisma/client' ;
511
612export async function reschedule (
713 parameters : FSRSParameters ,
@@ -12,27 +18,51 @@ export async function reschedule(
1218 }
1319 if ( ! uid ) return false ;
1420
15- // get all card
21+ // get all card and logs
1622 const cards = await prisma . card . findMany ( {
1723 where : {
1824 note : {
1925 uid : uid ,
2026 } ,
2127 state : State . Review ,
2228 } ,
29+ include : {
30+ logs : true ,
31+ } ,
2332 orderBy : {
24- last_review : " asc" ,
33+ last_review : ' asc' ,
2534 } ,
2635 } ) ;
36+
2737 return _reschedule ( parameters , cards ) ;
2838}
2939
30- export async function _reschedule ( parameters : FSRSParameters , cards : Card [ ] ) {
40+ export async function _reschedule (
41+ parameters : FSRSParameters ,
42+ cards : ( Card & { logs : Revlog [ ] } ) [ ]
43+ ) {
3144 if ( cards . length === 0 ) {
3245 return false ;
3346 }
3447 const f = fsrs ( parameters ) ;
35- const rescheduled_cards = f . reschedule ( cards ) ;
48+
49+ const rescheduled_cards : ( FSRSCard & { cid : number } ) [ ] = [ ] ;
50+ for ( const card of cards ) {
51+ const logs : FSRSHistory [ ] = card . logs . map ( ( log ) => {
52+ return {
53+ rating : TypeConvert . rating ( log . grade ) ,
54+ review : log . review ,
55+ due : log . due ,
56+ state : TypeConvert . state ( log . state ) ,
57+ } ;
58+ } ) ;
59+ const record = f . reschedule ( card , logs ) ;
60+ if ( record . reschedule_item ) {
61+ rescheduled_cards . push (
62+ record . reschedule_item . card as FSRSCard & { cid : number }
63+ ) ;
64+ }
65+ }
3666 if ( rescheduled_cards . length === 0 ) {
3767 return true ;
3868 }
@@ -41,7 +71,11 @@ export async function _reschedule(parameters: FSRSParameters, cards: Card[]) {
4171 rescheduled_cards . map ( ( data ) =>
4272 prisma . card . update ( {
4373 where : { cid : data . cid } ,
44- data : data ,
74+ data : {
75+ stability : data . stability ,
76+ difficulty : data . difficulty ,
77+ due : data . due ,
78+ } ,
4579 } )
4680 )
4781 ) ;
@@ -57,7 +91,7 @@ type Query = {
5791 due ?: Date ;
5892} ;
5993
60- export async function _findCardsByUid ( { uid, page, pageSize, due } : Query ) {
94+ export async function _findCardsByUid ( { uid, page, pageSize, due } : Query ) : Promise < ( Card & { logs : Revlog [ ] } ) [ ] > {
6195 return prisma . card . findMany ( {
6296 where : {
6397 note : {
@@ -72,8 +106,11 @@ export async function _findCardsByUid({ uid, page, pageSize, due }: Query) {
72106 } ,
73107 take : pageSize ,
74108 skip : pageSize * ( page - 1 ) ,
109+ include : {
110+ logs : true ,
111+ } ,
75112 orderBy : {
76- last_review : " asc" ,
113+ last_review : ' asc' ,
77114 } ,
78115 } ) ;
79116}
0 commit comments