words.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. // 所属词库 ID
  24. DictID uint
  25. }
  26. type WordResult struct {
  27. ID uint `json:"id"`
  28. Value string `json:"value"`
  29. Meaning string `json:"meaning"`
  30. Extra string `json:"extra"`
  31. Star bool `json:"star"`
  32. }
  33. // 列出所有单词
  34. func ListWords(dictID uint) ([]WordResult, error) {
  35. result := []WordResult{}
  36. if err := global.DB.Model(&Word{}).Order("id desc").Find(&result, "dict_id = ?", dictID).Error; err != nil {
  37. return nil, err
  38. }
  39. return result, nil
  40. }
  41. // 获取单词
  42. func GetWord(id, userID uint) (*WordResult, error) {
  43. result := &WordResult{}
  44. if err := global.DB.Model(&Word{}).Take(result, "id = ? AND (?) = ?", id, global.DB.Model(&Dict{}).Select("user_id").Where("id = dict_id"), userID).Error; err != nil {
  45. if errors.Is(err, gorm.ErrRecordNotFound) {
  46. return nil, ErrWordNotFound
  47. }
  48. return nil, err
  49. }
  50. return result, nil
  51. }
  52. // 创建单词
  53. func CreateWord(value, meaning, extra string, dictID uint) (*WordResult, error) {
  54. if err := global.DB.Model(&Word{}).Take(&struct{ ID uint }{}, "value = ? AND dict_id = ?", value, dictID).Error; !errors.Is(err, gorm.ErrRecordNotFound) {
  55. if err != nil {
  56. return nil, err
  57. }
  58. return nil, ErrWordAlreadyExists
  59. }
  60. word := &Word{
  61. Value: value,
  62. Meaning: meaning,
  63. Extra: extra,
  64. DictID: dictID,
  65. }
  66. if err := global.DB.Select("value", "meaning", "extra", "dict_id").Create(word).Error; err != nil {
  67. return nil, err
  68. }
  69. return &WordResult{
  70. ID: word.ID,
  71. Value: word.Value,
  72. Meaning: word.Meaning,
  73. Extra: word.Extra,
  74. }, nil
  75. }
  76. // 更新单词
  77. func UpdateWord(id uint, value, meaning, extra string, star bool) (*WordResult, error) {
  78. 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) {
  79. if err != nil {
  80. return nil, err
  81. }
  82. return nil, ErrWordAlreadyExists
  83. }
  84. word := &Word{
  85. Model: &gorm.Model{
  86. ID: id,
  87. },
  88. Value: value,
  89. Meaning: meaning,
  90. Extra: extra,
  91. Star: star,
  92. }
  93. if err := global.DB.Model(word).Select("value", "meaning", "extra", "star").Updates(word).Error; err != nil {
  94. return nil, err
  95. }
  96. return &WordResult{
  97. ID: word.ID,
  98. Value: word.Value,
  99. Meaning: word.Meaning,
  100. Extra: word.Extra,
  101. Star: word.Star,
  102. }, nil
  103. }
  104. // 删除单词
  105. func DeleteWord(id uint) error {
  106. return global.DB.Delete(&Word{}, "id = ?", id).Error
  107. }