words.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package model
  2. import (
  3. "errors"
  4. "fmt"
  5. "woord-core-service/global"
  6. "gorm.io/gorm"
  7. )
  8. var (
  9. ErrWordNotFound = fmt.Errorf("单词不存在")
  10. ErrWordAlreadyExists = fmt.Errorf("单词已存在")
  11. )
  12. // 单词
  13. type Word struct {
  14. *gorm.Model
  15. // 单词
  16. Value string `gorm:"index"`
  17. // 词义
  18. Meaning string
  19. // 附加
  20. Extra string
  21. // 是否为易错词
  22. Star bool
  23. // 单词所有复习记录
  24. Memos []Memo
  25. // 所属词库 ID
  26. DictID uint
  27. }
  28. type WordResult struct {
  29. ID uint `json:"id"`
  30. Value string `json:"value"`
  31. Meaning string `json:"meaning"`
  32. Extra string `json:"extra"`
  33. Star bool `json:"star"`
  34. MemosCount uint `json:"memosCount"`
  35. }
  36. // 列出所有单词
  37. func ListWords(dictID uint) ([]WordResult, error) {
  38. result := []WordResult{}
  39. if err := global.DB.Model(&Word{}).Select("*, (?) AS memos_count", global.DB.Model(&Memo{}).Select("COUNT()").Where("word_id = words.id")).Order("id desc").Find(&result, "dict_id = ?", dictID).Error; err != nil {
  40. return nil, err
  41. }
  42. return result, nil
  43. }
  44. // 获取单词
  45. func GetWord(id, userID uint) (*WordResult, error) {
  46. result := &WordResult{}
  47. if err := global.DB.Model(&Word{}).Select("*, (?) AS memos_count", global.DB.Model(&Memo{}).Select("COUNT()").Where("word_id = words.id")).Take(result, "id = ? AND (?) = ?", id, global.DB.Model(&Dict{}).Select("user_id").Where("id = dict_id"), userID).Error; err != nil {
  48. if errors.Is(err, gorm.ErrRecordNotFound) {
  49. return nil, ErrWordNotFound
  50. }
  51. return nil, err
  52. }
  53. return result, nil
  54. }
  55. // 创建单词
  56. func CreateWord(value, meaning, extra string, dictID uint) (*WordResult, error) {
  57. if err := global.DB.Model(&Word{}).Take(&struct{ ID uint }{}, "value = ? AND dict_id = ?", value, dictID).Error; !errors.Is(err, gorm.ErrRecordNotFound) {
  58. if err != nil {
  59. return nil, err
  60. }
  61. return nil, ErrWordAlreadyExists
  62. }
  63. word := &Word{
  64. Value: value,
  65. Meaning: meaning,
  66. Extra: extra,
  67. DictID: dictID,
  68. }
  69. if err := global.DB.Select("value", "meaning", "extra", "dict_id").Create(word).Error; err != nil {
  70. return nil, err
  71. }
  72. return &WordResult{
  73. ID: word.ID,
  74. Value: word.Value,
  75. Meaning: word.Meaning,
  76. Extra: word.Extra,
  77. }, nil
  78. }
  79. // 更新单词
  80. func UpdateWord(id uint, value, meaning, extra string, star bool) (*WordResult, error) {
  81. if err := global.DB.Model(&Word{}).Take(&struct{ ID uint }{}, "id <> ? AND value = ? AND dict_id = (?)", id, value, global.DB.Model(&Word{}).Select("dict_id").Where("id = ?", id)).Error; !errors.Is(err, gorm.ErrRecordNotFound) {
  82. if err != nil {
  83. return nil, err
  84. }
  85. return nil, ErrWordAlreadyExists
  86. }
  87. count := int64(0)
  88. if err := global.DB.Model(&Memo{}).Where("word_id = ?", id).Count(&count).Error; err != nil {
  89. return nil, err
  90. }
  91. word := &Word{
  92. Value: value,
  93. Meaning: meaning,
  94. Extra: extra,
  95. Star: star,
  96. }
  97. if err := global.DB.Where("id = ?", id).Select("value", "meaning", "extra", "star").Updates(word).Error; err != nil {
  98. return nil, err
  99. }
  100. return &WordResult{
  101. ID: word.ID,
  102. Value: word.Value,
  103. Meaning: word.Meaning,
  104. Extra: word.Extra,
  105. Star: word.Star,
  106. MemosCount: uint(count),
  107. }, nil
  108. }
  109. // 删除单词
  110. func DeleteWord(id uint) error {
  111. return global.DB.Delete(&Word{}, "id = ?", id).Error
  112. }