message.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package model
  2. import (
  3. "errors"
  4. "message-pusher/common"
  5. "time"
  6. )
  7. type Message struct {
  8. Id int `json:"id"`
  9. UserId int `json:"user_id" gorm:"index"`
  10. Title string `json:"title"`
  11. Description string `json:"description"`
  12. Content string `json:"content"`
  13. URL string `json:"url" gorm:"column:url"`
  14. Channel string `json:"channel"`
  15. Token string `json:"token" gorm:"-:all"`
  16. HTMLContent string `json:"html_content" gorm:"-:all"`
  17. Timestamp int64 `json:"timestamp" gorm:"type:bigint"`
  18. Link string `json:"link" gorm:"unique;index"`
  19. To string `json:"to" gorm:"column:to"` // if specified, will send to this user(s)
  20. Status int `json:"status" gorm:"default:0;index"` // pending, sent, failed
  21. OpenId string `json:"openid" gorm:"-:all"` // alias for to
  22. Desp string `json:"desp" gorm:"-:all"` // alias for content
  23. Short string `json:"short" gorm:"-:all"` // alias for description
  24. Async bool `json:"async" gorm:"-"` // if true, will send message asynchronously
  25. RenderMode string `json:"render_mode" gorm:"raw"` // markdown (default), code, raw
  26. }
  27. func GetMessageByIds(id int, userId int) (*Message, error) {
  28. if id == 0 || userId == 0 {
  29. return nil, errors.New("id 或 userId 为空!")
  30. }
  31. message := Message{Id: id, UserId: userId}
  32. err := DB.Where(message).First(&message).Error
  33. return &message, err
  34. }
  35. func GetMessageById(id int) (*Message, error) {
  36. if id == 0 {
  37. return nil, errors.New("id 为空!")
  38. }
  39. message := Message{Id: id}
  40. err := DB.Where(message).First(&message).Error
  41. return &message, err
  42. }
  43. func GetAsyncPendingMessageIds() (ids []int, err error) {
  44. err = DB.Model(&Message{}).Where("status = ?", common.MessageSendStatusAsyncPending).Pluck("id", &ids).Error
  45. return ids, err
  46. }
  47. func GetMessageByLink(link string) (*Message, error) {
  48. if link == "" {
  49. return nil, errors.New("link 为空!")
  50. }
  51. message := Message{Link: link}
  52. err := DB.Where(message).First(&message).Error
  53. return &message, err
  54. }
  55. func GetMessageStatusByLink(link string) (int, error) {
  56. if link == "" {
  57. return common.MessageSendStatusUnknown, errors.New("link 为空!")
  58. }
  59. message := Message{}
  60. err := DB.Where("link = ?", link).Select("status").First(&message).Error
  61. return message.Status, err
  62. }
  63. func GetMessagesByUserId(userId int, startIdx int, num int) (messages []*Message, err error) {
  64. err = DB.Select([]string{"id", "title", "channel", "timestamp", "status"}).
  65. Where("user_id = ?", userId).Order("id desc").Limit(num).Offset(startIdx).Find(&messages).Error
  66. return messages, err
  67. }
  68. func SearchMessages(keyword string) (messages []*Message, err error) {
  69. err = DB.Select([]string{"id", "title", "channel", "timestamp", "status"}).
  70. Where("id = ? or title LIKE ? or description LIKE ? or content LIKE ?", keyword, keyword+"%", keyword+"%", keyword+"%").
  71. Order("id desc").
  72. Find(&messages).Error
  73. return messages, err
  74. }
  75. func DeleteMessageById(id int, userId int) (err error) {
  76. // Why we need userId here? In case user want to delete other's message.
  77. if id == 0 || userId == 0 {
  78. return errors.New("id 或 userId 为空!")
  79. }
  80. message := Message{Id: id, UserId: userId}
  81. err = DB.Where(message).First(&message).Error
  82. if err != nil {
  83. return err
  84. }
  85. return message.Delete()
  86. }
  87. func DeleteAllMessages() error {
  88. return DB.Exec("DELETE FROM messages").Error
  89. }
  90. func (message *Message) UpdateAndInsert(userId int) error {
  91. message.Timestamp = time.Now().Unix()
  92. message.UserId = userId
  93. message.Status = common.MessageSendStatusPending
  94. var err error
  95. err = DB.Create(message).Error
  96. return err
  97. }
  98. func (message *Message) UpdateStatus(status int) error {
  99. err := DB.Model(message).Update("status", status).Error
  100. return err
  101. }
  102. func (message *Message) Delete() error {
  103. err := DB.Delete(message).Error
  104. return err
  105. }