123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package model
- import (
- "errors"
- "message-pusher/common"
- "time"
- )
- type Message struct {
- Id int `json:"id"`
- UserId int `json:"user_id" gorm:"index"`
- Title string `json:"title"`
- Description string `json:"description"`
- Content string `json:"content"`
- URL string `json:"url" gorm:"column:url"`
- Channel string `json:"channel"`
- Token string `json:"token" gorm:"-:all"`
- HTMLContent string `json:"html_content" gorm:"-:all"`
- Timestamp int64 `json:"timestamp" gorm:"type:bigint"`
- Link string `json:"link" gorm:"unique;index"`
- To string `json:"to" gorm:"column:to"` // if specified, will send to this user(s)
- Status int `json:"status" gorm:"default:0;index"` // pending, sent, failed
- OpenId string `json:"openid" gorm:"-:all"` // alias for to
- Desp string `json:"desp" gorm:"-:all"` // alias for content
- Short string `json:"short" gorm:"-:all"` // alias for description
- Async bool `json:"async" gorm:"-"` // if true, will send message asynchronously
- RenderMode string `json:"render_mode" gorm:"raw"` // markdown (default), code, raw
- }
- func GetMessageByIds(id int, userId int) (*Message, error) {
- if id == 0 || userId == 0 {
- return nil, errors.New("id 或 userId 为空!")
- }
- message := Message{Id: id, UserId: userId}
- err := DB.Where(message).First(&message).Error
- return &message, err
- }
- func GetMessageById(id int) (*Message, error) {
- if id == 0 {
- return nil, errors.New("id 为空!")
- }
- message := Message{Id: id}
- err := DB.Where(message).First(&message).Error
- return &message, err
- }
- func GetAsyncPendingMessageIds() (ids []int, err error) {
- err = DB.Model(&Message{}).Where("status = ?", common.MessageSendStatusAsyncPending).Pluck("id", &ids).Error
- return ids, err
- }
- func GetMessageByLink(link string) (*Message, error) {
- if link == "" {
- return nil, errors.New("link 为空!")
- }
- message := Message{Link: link}
- err := DB.Where(message).First(&message).Error
- return &message, err
- }
- func GetMessageStatusByLink(link string) (int, error) {
- if link == "" {
- return common.MessageSendStatusUnknown, errors.New("link 为空!")
- }
- message := Message{}
- err := DB.Where("link = ?", link).Select("status").First(&message).Error
- return message.Status, err
- }
- func GetMessagesByUserId(userId int, startIdx int, num int) (messages []*Message, err error) {
- err = DB.Select([]string{"id", "title", "channel", "timestamp", "status"}).
- Where("user_id = ?", userId).Order("id desc").Limit(num).Offset(startIdx).Find(&messages).Error
- return messages, err
- }
- func SearchMessages(keyword string) (messages []*Message, err error) {
- err = DB.Select([]string{"id", "title", "channel", "timestamp", "status"}).
- Where("id = ? or title LIKE ? or description LIKE ? or content LIKE ?", keyword, keyword+"%", keyword+"%", keyword+"%").
- Order("id desc").
- Find(&messages).Error
- return messages, err
- }
- func DeleteMessageById(id int, userId int) (err error) {
- // Why we need userId here? In case user want to delete other's message.
- if id == 0 || userId == 0 {
- return errors.New("id 或 userId 为空!")
- }
- message := Message{Id: id, UserId: userId}
- err = DB.Where(message).First(&message).Error
- if err != nil {
- return err
- }
- return message.Delete()
- }
- func DeleteAllMessages() error {
- return DB.Exec("DELETE FROM messages").Error
- }
- func (message *Message) UpdateAndInsert(userId int) error {
- message.Timestamp = time.Now().Unix()
- message.UserId = userId
- message.Status = common.MessageSendStatusPending
- var err error
- err = DB.Create(message).Error
- return err
- }
- func (message *Message) UpdateStatus(status int) error {
- err := DB.Model(message).Update("status", status).Error
- return err
- }
- func (message *Message) Delete() error {
- err := DB.Delete(message).Error
- return err
- }
|