| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- package model
- import (
- "errors"
- "fmt"
- "woord-core-service/global"
- "gorm.io/gorm"
- )
- var (
- ErrWordNotFound = fmt.Errorf("单词不存在")
- ErrWordAlreadyExists = fmt.Errorf("单词已存在")
- )
- // 单词
- type Word struct {
- *gorm.Model
- // 单词
- Value string `gorm:"index"`
- // 词义
- Meaning string
- // 附加
- Extra string
- // 是否为易错词
- Star bool
- // 所属词库 ID
- DictID uint
- }
- type WordResult struct {
- ID uint `json:"id"`
- Value string `json:"value"`
- Meaning string `json:"meaning"`
- Extra string `json:"extra"`
- Star bool `json:"star"`
- }
- // 列出所有单词
- func ListWords(word *Word) ([]WordResult, error) {
- result := []WordResult{}
- if err := global.DB.Model(&Word{}).Find(&result, word, "dict_id").Error; err != nil {
- return nil, err
- }
- return result, nil
- }
- // 创建单词
- func CreateWord(word *Word) (*WordResult, error) {
- if err := global.DB.Model(&Word{}).Take(&struct{ ID uint }{}, word, "value", "dict_id").Error; !errors.Is(err, gorm.ErrRecordNotFound) {
- if err != nil {
- return nil, err
- }
- return nil, ErrWordAlreadyExists
- }
- if err := global.DB.Select("value", "meaning", "extra", "dict_id").Create(word).Error; err != nil {
- return nil, err
- }
- return &WordResult{
- ID: word.ID,
- Value: word.Value,
- Meaning: word.Meaning,
- Extra: word.Extra,
- }, nil
- }
- // 更新单词
- func UpdateWord(word *Word) (*WordResult, error) {
- dictID := &struct{ DictID uint }{}
- if err := global.DB.Model(&Word{}).Take(dictID, word, "id").Error; err != nil {
- if errors.Is(err, gorm.ErrRecordNotFound) {
- return nil, ErrWordNotFound
- }
- return nil, err
- }
- if err := global.DB.Model(&Word{}).Where("id <> ? AND value = ?", word.ID, word.Value).Take(&struct{ ID uint }{}, dictID, "dict_id").Error; !errors.Is(err, gorm.ErrRecordNotFound) {
- if err != nil {
- return nil, err
- }
- return nil, ErrWordAlreadyExists
- }
- if err := global.DB.Model(word).Select("value", "meaning", "extra", "star").Updates(word).Error; err != nil {
- return nil, err
- }
- return &WordResult{
- ID: word.ID,
- Value: word.Value,
- Meaning: word.Meaning,
- Extra: word.Extra,
- Star: word.Star,
- }, nil
- }
- // 删除单词
- func DeleteWord(word *Word) error {
- if err := global.DB.Model(&Word{}).Take(&struct{ ID uint }{}, word, "id").Error; err != nil {
- if errors.Is(err, gorm.ErrRecordNotFound) {
- return ErrWordNotFound
- }
- return err
- }
- return global.DB.Delete(word).Error
- }
|