Add announcement and read-tracking models with active/unread query helpers for the operations announcement system.
93 lines
2.6 KiB
Go
93 lines
2.6 KiB
Go
package model
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type Announcement struct {
|
|
Id int `json:"id" gorm:"primaryKey;autoIncrement"`
|
|
Title string `json:"title" gorm:"type:varchar(255);not null"`
|
|
Content string `json:"content" gorm:"type:text;not null"`
|
|
ContentHtml string `json:"content_html" gorm:"type:text"`
|
|
Status string `json:"status" gorm:"type:varchar(16);not null;default:'draft';index"`
|
|
NotifyMode string `json:"notify_mode" gorm:"type:varchar(16);not null;default:'silent'"`
|
|
JsonRules string `json:"json_rules" gorm:"type:text"`
|
|
StartsAt *time.Time `json:"starts_at" gorm:"index"`
|
|
EndsAt *time.Time `json:"ends_at" gorm:"index"`
|
|
CreatedBy int `json:"created_by" gorm:"not null;default:0"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
func (Announcement) TableName() string {
|
|
return "announcements"
|
|
}
|
|
|
|
func (a *Announcement) Insert() error {
|
|
return DB.Create(a).Error
|
|
}
|
|
|
|
func (a *Announcement) Update() error {
|
|
return DB.Save(a).Error
|
|
}
|
|
|
|
func GetAnnouncementByID(id int) (*Announcement, error) {
|
|
var announcement Announcement
|
|
err := DB.First(&announcement, "id = ?", id).Error
|
|
return &announcement, err
|
|
}
|
|
|
|
func GetAnnouncements(page int, pageSize int, status string) ([]Announcement, int64, error) {
|
|
var announcements []Announcement
|
|
var total int64
|
|
query := DB.Model(&Announcement{})
|
|
if status != "" {
|
|
query = query.Where("status = ?", status)
|
|
}
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
if page < 1 {
|
|
page = 1
|
|
}
|
|
if pageSize < 1 {
|
|
pageSize = 20
|
|
}
|
|
err := query.Order("id DESC").Offset((page - 1) * pageSize).Limit(pageSize).Find(&announcements).Error
|
|
return announcements, total, err
|
|
}
|
|
|
|
func GetActiveAnnouncements() ([]Announcement, error) {
|
|
var announcements []Announcement
|
|
err := activeAnnouncementQuery().
|
|
Order("id DESC").
|
|
Find(&announcements).Error
|
|
return announcements, err
|
|
}
|
|
|
|
func GetUnreadAnnouncements(userId int) ([]Announcement, error) {
|
|
var announcements []Announcement
|
|
readSubQuery := DB.Model(&AnnouncementRead{}).
|
|
Select("announcement_id").
|
|
Where("user_id = ?", userId)
|
|
err := activeAnnouncementQuery().
|
|
Where("id NOT IN (?)", readSubQuery).
|
|
Order("id DESC").
|
|
Find(&announcements).Error
|
|
return announcements, err
|
|
}
|
|
|
|
func DeleteAnnouncementByID(id int) error {
|
|
return DB.Delete(&Announcement{}, id).Error
|
|
}
|
|
|
|
func activeAnnouncementQuery() *gorm.DB {
|
|
now := time.Now()
|
|
return DB.Model(&Announcement{}).
|
|
Where("status = ?", "active").
|
|
Where("(starts_at IS NULL OR starts_at <= ?)", now).
|
|
Where("(ends_at IS NULL OR ends_at >= ?)", now)
|
|
}
|