website/pkg/models/message.go

90 lines
2.1 KiB
Go
Raw Normal View History

2022-08-14 00:42:42 +00:00
package models
import (
"time"
)
// Message table.
type Message struct {
ID uint64 `gorm:"primaryKey"`
SourceUserID uint64 `gorm:"index"`
TargetUserID uint64 `gorm:"index"`
Read bool `gorm:"index"`
Message string
CreatedAt time.Time
UpdatedAt time.Time
}
// GetMessage by ID.
func GetMessage(id uint64) (*Message, error) {
m := &Message{}
result := DB.First(&m, id)
return m, result.Error
}
// GetMessages for a user.
func GetMessages(userID uint64, sent bool, pager *Pagination) ([]*Message, error) {
var (
m = []*Message{}
where = "target_user_id = ?"
)
if sent {
where = "source_user_id"
}
query := DB.Where(
where, userID,
).Order(pager.Sort)
query.Model(&Message{}).Count(&pager.Total)
result := query.Offset(pager.GetOffset()).Limit(pager.PerPage).Find(&m)
return m, result.Error
}
// GetMessageThread returns paginated message history between two people.
func GetMessageThread(sourceUserID, targetUserID uint64, pager *Pagination) ([]*Message, error) {
var m = []*Message{}
query := DB.Where(
"(source_user_id = ? AND target_user_id = ?) OR (source_user_id = ? AND target_user_id = ?)",
sourceUserID, targetUserID,
targetUserID, sourceUserID,
).Order(pager.Sort)
query.Model(&Message{}).Count(&pager.Total)
result := query.Offset(pager.GetOffset()).Limit(pager.PerPage).Find(&m)
return m, result.Error
}
// CountUnreadMessages gets the count of unread messages for a user.
func CountUnreadMessages(userID uint64) (int64, error) {
query := DB.Where(
"target_user_id = ? AND read = ?",
userID,
false,
)
var count int64
result := query.Model(&Message{}).Count(&count)
return count, result.Error
}
// SendMessage from a source to a target user.
func SendMessage(sourceUserID, targetUserID uint64, message string) (*Message, error) {
m := &Message{
SourceUserID: sourceUserID,
TargetUserID: targetUserID,
Message: message,
Read: false,
}
result := DB.Create(m)
return m, result.Error
}
// Save message.
func (m *Message) Save() error {
result := DB.Save(m)
return result.Error
}