From 73ec3714ccd631e0e83dcdee08319d05a85fc47d Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Mon, 27 Feb 2023 09:46:39 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E6=94=AF=E6=8C=81=E7=AC=94=E8=AE=B0?= =?UTF-8?q?=E6=9C=AC=E7=BA=A7=E9=97=AA=E5=8D=A1=E5=A4=8D=E4=B9=A0=20https:?= =?UTF-8?q?//github.com/siyuan-note/siyuan/issues/7496?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/api/riff.go | 20 +++++++ kernel/api/router.go | 1 + kernel/model/flashcard.go | 108 ++++++++++++++++++++++++++------------ 3 files changed, 96 insertions(+), 33 deletions(-) diff --git a/kernel/api/riff.go b/kernel/api/riff.go index 08888645f..1799e1daf 100644 --- a/kernel/api/riff.go +++ b/kernel/api/riff.go @@ -85,6 +85,26 @@ func reviewRiffCard(c *gin.Context) { } } +func getNotebookRiffDueCards(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + notebookID := arg["notebook"].(string) + cards, err := model.GetNotebookDueFlashcards(notebookID) + if nil != err { + ret.Code = -1 + ret.Msg = err.Error() + return + } + + ret.Data = cards +} + func getTreeRiffDueCards(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index 84cfd2191..14140f39a 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -312,6 +312,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/riff/removeRiffCards", model.CheckAuth, removeRiffCards) ginServer.Handle("POST", "/api/riff/getRiffDueCards", model.CheckAuth, getRiffDueCards) ginServer.Handle("POST", "/api/riff/getTreeRiffDueCards", model.CheckAuth, getTreeRiffDueCards) + ginServer.Handle("POST", "/api/riff/getNotebookRiffDueCards", model.CheckAuth, getNotebookRiffDueCards) ginServer.Handle("POST", "/api/riff/reviewRiffCard", model.CheckAuth, reviewRiffCard) ginServer.Handle("POST", "/api/riff/getRiffCards", model.CheckAuth, getRiffCards) ginServer.Handle("POST", "/api/riff/getTreeRiffCards", model.CheckAuth, getTreeRiffCards) diff --git a/kernel/model/flashcard.go b/kernel/model/flashcard.go index 372a7fdb5..158406157 100644 --- a/kernel/model/flashcard.go +++ b/kernel/model/flashcard.go @@ -180,6 +180,78 @@ type Flashcard struct { NextDues map[riff.Rating]string `json:"nextDues"` } +func newFlashcard(card riff.Card, blockID, deckID string, now time.Time) *Flashcard { + nextDues := map[riff.Rating]string{} + for rating, due := range card.NextDues() { + nextDues[rating] = strings.TrimSpace(util.HumanizeRelTime(due, now, Conf.Lang)) + } + + return &Flashcard{ + DeckID: deckID, + CardID: card.ID(), + BlockID: blockID, + NextDues: nextDues, + } +} + +func GetNotebookDueFlashcards(boxID string) (ret []*Flashcard, err error) { + deckLock.Lock() + defer deckLock.Unlock() + + if syncingStorages { + err = errors.New(Conf.Language(81)) + return + } + + entries, err := os.ReadDir(filepath.Join(util.DataDir, boxID)) + if nil != err { + logging.LogErrorf("read dir failed: %s", err) + return + } + + var rootIDs []string + for _, entry := range entries { + if entry.IsDir() { + continue + } + + if !strings.HasSuffix(entry.Name(), ".sy") { + continue + } + + rootIDs = append(rootIDs, strings.TrimSuffix(entry.Name(), ".sy")) + } + + treeBlockIDs := map[string]bool{} + for _, rootID := range rootIDs { + blockIDs := getTreeSubTreeChildBlocks(rootID) + for blockID, _ := range blockIDs { + treeBlockIDs[blockID] = true + } + } + + deck := Decks[builtinDeckID] + if nil == deck { + logging.LogWarnf("builtin deck not found") + return + } + + cards := deck.Dues() + now := time.Now() + for _, card := range cards { + blockID := card.BlockID() + if !treeBlockIDs[blockID] { + continue + } + + ret = append(ret, newFlashcard(card, blockID, builtinDeckID, now)) + } + if 1 > len(ret) { + ret = []*Flashcard{} + } + return +} + func GetTreeDueFlashcards(rootID string) (ret []*Flashcard, err error) { deckLock.Lock() defer deckLock.Unlock() @@ -204,17 +276,7 @@ func GetTreeDueFlashcards(rootID string) (ret []*Flashcard, err error) { continue } - nextDues := map[riff.Rating]string{} - for rating, due := range card.NextDues() { - nextDues[rating] = strings.TrimSpace(util.HumanizeRelTime(due, now, Conf.Lang)) - } - - ret = append(ret, &Flashcard{ - DeckID: builtinDeckID, - CardID: card.ID(), - BlockID: blockID, - NextDues: nextDues, - }) + ret = append(ret, newFlashcard(card, blockID, builtinDeckID, now)) } if 1 > len(ret) { ret = []*Flashcard{} @@ -294,17 +356,7 @@ func getDueFlashcards(deckID string) (ret []*Flashcard) { continue } - nextDues := map[riff.Rating]string{} - for rating, due := range card.NextDues() { - nextDues[rating] = strings.TrimSpace(util.HumanizeRelTime(due, now, Conf.Lang)) - } - - ret = append(ret, &Flashcard{ - DeckID: deckID, - CardID: card.ID(), - BlockID: blockID, - NextDues: nextDues, - }) + ret = append(ret, newFlashcard(card, blockID, deckID, now)) } if 1 > len(ret) { ret = []*Flashcard{} @@ -322,17 +374,7 @@ func getAllDueFlashcards() (ret []*Flashcard) { continue } - nextDues := map[riff.Rating]string{} - for rating, due := range card.NextDues() { - nextDues[rating] = strings.TrimSpace(util.HumanizeRelTime(due, now, Conf.Lang)) - } - - ret = append(ret, &Flashcard{ - DeckID: deck.ID, - CardID: card.ID(), - BlockID: blockID, - NextDues: nextDues, - }) + ret = append(ret, newFlashcard(card, blockID, deck.ID, now)) } } if 1 > len(ret) {