refactor: introduce repositories and expose study api client

This commit is contained in:
2026-02-27 11:19:13 +08:00
parent eb88494c5a
commit 9a5e8cb58f
5 changed files with 160 additions and 45 deletions

View File

@@ -0,0 +1,65 @@
package repository
import (
"time"
"memora-api/internal/model"
"gorm.io/gorm"
)
type MemoryRepository struct {
db *gorm.DB
}
func NewMemoryRepository(db *gorm.DB) *MemoryRepository {
return &MemoryRepository{db: db}
}
func (r *MemoryRepository) Create(record *model.MemoryRecord) error {
return r.db.Create(record).Error
}
func (r *MemoryRepository) FindByWord(userID, wordID int64) (*model.MemoryRecord, error) {
var record model.MemoryRecord
if err := r.db.Where("word_id = ? AND user_id = ?", wordID, userID).First(&record).Error; err != nil {
return nil, err
}
return &record, nil
}
func (r *MemoryRepository) FindByID(userID, recordID int64) (*model.MemoryRecord, error) {
var record model.MemoryRecord
if err := r.db.Preload("Word").Where("id = ? AND user_id = ?", recordID, userID).First(&record).Error; err != nil {
return nil, err
}
return &record, nil
}
func (r *MemoryRepository) Save(record *model.MemoryRecord) error {
return r.db.Save(record).Error
}
func (r *MemoryRepository) Due(userID int64, limit int) ([]model.MemoryRecord, error) {
var records []model.MemoryRecord
if err := r.db.Preload("Word").Where("user_id = ? AND (next_review_at <= ? OR next_review_at IS NULL)", userID, time.Now()).Limit(limit).Find(&records).Error; err != nil {
return nil, err
}
return records, nil
}
func (r *MemoryRepository) ListByUser(userID int64, limit int) ([]model.MemoryRecord, error) {
var records []model.MemoryRecord
if err := r.db.Preload("Word").Where("user_id = ?", userID).Limit(limit).Find(&records).Error; err != nil {
return nil, err
}
return records, nil
}
func (r *MemoryRepository) CountOverview(userID int64) (total, mastered, needReview, todayReviewed int64) {
r.db.Model(&model.MemoryRecord{}).Where("user_id = ?", userID).Count(&total)
r.db.Model(&model.MemoryRecord{}).Where("user_id = ? AND mastery_level >= 4", userID).Count(&mastered)
r.db.Model(&model.MemoryRecord{}).Where("user_id = ? AND next_review_at <= ?", userID, time.Now()).Count(&needReview)
r.db.Model(&model.MemoryRecord{}).Where("user_id = ? AND last_reviewed_at >= ?", userID, time.Now().Format("2006-01-02")).Count(&todayReviewed)
return
}

View File

@@ -0,0 +1,45 @@
package repository
import (
"memora-api/internal/model"
"gorm.io/gorm"
)
type WordRepository struct {
db *gorm.DB
}
func NewWordRepository(db *gorm.DB) *WordRepository {
return &WordRepository{db: db}
}
func (r *WordRepository) FindByWord(word string) (*model.Word, error) {
var w model.Word
if err := r.db.Where("word = ?", word).First(&w).Error; err != nil {
return nil, err
}
return &w, nil
}
func (r *WordRepository) Create(word *model.Word) error {
return r.db.Create(word).Error
}
func (r *WordRepository) List(limit, offset int) ([]model.Word, int64, error) {
var words []model.Word
var total int64
r.db.Model(&model.Word{}).Count(&total)
if err := r.db.Limit(limit).Offset(offset).Order("created_at DESC").Find(&words).Error; err != nil {
return nil, 0, err
}
return words, total, nil
}
func (r *WordRepository) Latest(limit int) ([]model.Word, error) {
var words []model.Word
if err := r.db.Order("created_at DESC").Limit(limit).Find(&words).Error; err != nil {
return nil, err
}
return words, nil
}