words.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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(word *Word) ([]WordResult, error) {
  35. result := []WordResult{}
  36. if err := global.DB.Model(&Word{}).Find(&result, word, "dict_id").Error; err != nil {
  37. return nil, err
  38. }
  39. return result, nil
  40. }
  41. // 创建单词
  42. func CreateWord(word *Word) (*WordResult, error) {
  43. if err := global.DB.Model(&Word{}).Take(&struct{ ID uint }{}, word, "value", "dict_id").Error; !errors.Is(err, gorm.ErrRecordNotFound) {
  44. if err != nil {
  45. return nil, err
  46. }
  47. return nil, ErrWordAlreadyExists
  48. }
  49. if err := global.DB.Select("value", "meaning", "extra", "dict_id").Create(word).Error; err != nil {
  50. return nil, err
  51. }
  52. return &WordResult{
  53. ID: word.ID,
  54. Value: word.Value,
  55. Meaning: word.Meaning,
  56. Extra: word.Extra,
  57. }, nil
  58. }
  59. // 更新单词
  60. func UpdateWord(word *Word) (*WordResult, error) {
  61. dictID := &struct{ DictID uint }{}
  62. if err := global.DB.Model(&Word{}).Take(dictID, word, "id").Error; err != nil {
  63. if errors.Is(err, gorm.ErrRecordNotFound) {
  64. return nil, ErrWordNotFound
  65. }
  66. return nil, err
  67. }
  68. 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) {
  69. if err != nil {
  70. return nil, err
  71. }
  72. return nil, ErrWordAlreadyExists
  73. }
  74. if err := global.DB.Model(word).Select("value", "meaning", "extra", "star").Updates(word).Error; err != nil {
  75. return nil, err
  76. }
  77. return &WordResult{
  78. ID: word.ID,
  79. Value: word.Value,
  80. Meaning: word.Meaning,
  81. Extra: word.Extra,
  82. Star: word.Star,
  83. }, nil
  84. }
  85. // 删除单词
  86. func DeleteWord(word *Word) error {
  87. if err := global.DB.Model(&Word{}).Take(&struct{ ID uint }{}, word, "id").Error; err != nil {
  88. if errors.Is(err, gorm.ErrRecordNotFound) {
  89. return ErrWordNotFound
  90. }
  91. return err
  92. }
  93. return global.DB.Delete(word).Error
  94. }