Some checks failed
Build docker and publish / build (20.15.1) (push) Failing after 6m27s
feat: 添加版本和构建时间变量 fix: 修正短信队列类型注释错误 style: 清理未使用的代码和测试文件 docs: 更新安装文档中的下载链接 chore: 迁移数据库脚本添加日志和订阅配置
152 lines
3.9 KiB
Go
152 lines
3.9 KiB
Go
package task
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
type Type int8
|
|
|
|
const (
|
|
Undefined Type = -1
|
|
TypeEmail = iota
|
|
TypeQuota
|
|
)
|
|
|
|
type Task struct {
|
|
Id int64 `gorm:"primaryKey;autoIncrement;comment:ID"`
|
|
Type int8 `gorm:"not null;comment:Task Type"`
|
|
Scope string `gorm:"type:text;comment:Task Scope"`
|
|
Content string `gorm:"type:text;comment:Task Content"`
|
|
Status int8 `gorm:"not null;default:0;comment:Task Status: 0: Pending, 1: In Progress, 2: Completed, 3: Failed"`
|
|
Errors string `gorm:"type:text;comment:Task Errors"`
|
|
Total uint64 `gorm:"column:total;not null;default:0;comment:Total Number"`
|
|
Current uint64 `gorm:"column:current;not null;default:0;comment:Current Number"`
|
|
CreatedAt time.Time `gorm:"<-:create;comment:Creation Time"`
|
|
UpdatedAt time.Time `gorm:"comment:Update Time"`
|
|
}
|
|
|
|
func (Task) TableName() string {
|
|
return "task"
|
|
}
|
|
|
|
type ScopeType int8
|
|
|
|
const (
|
|
ScopeAll ScopeType = iota + 1 // All users
|
|
ScopeActive // Active users
|
|
ScopeExpired // Expired users
|
|
ScopeNone // No Subscribe
|
|
ScopeSkip // Skip user filtering
|
|
)
|
|
|
|
func (t ScopeType) Int8() int8 {
|
|
return int8(t)
|
|
}
|
|
|
|
type EmailScope struct {
|
|
Type int8 `gorm:"not null;comment:Scope Type"`
|
|
RegisterStartTime int64 `json:"register_start_time"`
|
|
RegisterEndTime int64 `json:"register_end_time"`
|
|
Recipients []string `json:"recipients"` // list of email addresses
|
|
Additional []string `json:"additional"` // additional email addresses
|
|
Scheduled int64 `json:"scheduled"` // scheduled time (unix timestamp)
|
|
Interval uint8 `json:"interval"` // interval in seconds
|
|
Limit uint64 `json:"limit"` // daily send limit
|
|
}
|
|
|
|
func (s *EmailScope) Marshal() ([]byte, error) {
|
|
type Alias EmailScope
|
|
return json.Marshal(&struct {
|
|
*Alias
|
|
}{
|
|
Alias: (*Alias)(s),
|
|
})
|
|
}
|
|
|
|
func (s *EmailScope) Unmarshal(data []byte) error {
|
|
type Alias EmailScope
|
|
aux := (*Alias)(s)
|
|
return json.Unmarshal(data, &aux)
|
|
}
|
|
|
|
type EmailContent struct {
|
|
Subject string `json:"subject"`
|
|
Content string `json:"content"`
|
|
}
|
|
|
|
func (c *EmailContent) Marshal() ([]byte, error) {
|
|
type Alias EmailContent
|
|
return json.Marshal(&struct {
|
|
*Alias
|
|
}{
|
|
Alias: (*Alias)(c),
|
|
})
|
|
}
|
|
|
|
func (c *EmailContent) Unmarshal(data []byte) error {
|
|
type Alias EmailContent
|
|
aux := (*Alias)(c)
|
|
return json.Unmarshal(data, &aux)
|
|
}
|
|
|
|
type QuotaScope struct {
|
|
Subscribers []int64 `json:"subscribers"` // Subscribe IDs
|
|
IsActive *bool `json:"is_active"` // filter by active status
|
|
StartTime int64 `json:"start_time"` // filter by subscription start time
|
|
EndTime int64 `json:"end_time"` // filter by subscription end time
|
|
Objects []int64 `json:"recipients"` // list of user subs IDs
|
|
}
|
|
|
|
func (s *QuotaScope) Marshal() ([]byte, error) {
|
|
type Alias QuotaScope
|
|
return json.Marshal(&struct {
|
|
*Alias
|
|
}{
|
|
Alias: (*Alias)(s),
|
|
})
|
|
}
|
|
|
|
func (s *QuotaScope) Unmarshal(data []byte) error {
|
|
type Alias QuotaScope
|
|
aux := (*Alias)(s)
|
|
return json.Unmarshal(data, &aux)
|
|
}
|
|
|
|
type QuotaContent struct {
|
|
ResetTraffic bool `json:"reset_traffic"` // whether to reset traffic
|
|
Days uint64 `json:"days,omitempty"` // days to add
|
|
GiftType uint8 `json:"gift_type,omitempty"` // 1: Fixed, 2: Ratio
|
|
GiftValue uint64 `json:"gift_value,omitempty"` // value of the gift type
|
|
}
|
|
|
|
func (c *QuotaContent) Marshal() ([]byte, error) {
|
|
type Alias QuotaContent
|
|
return json.Marshal(&struct {
|
|
*Alias
|
|
}{
|
|
Alias: (*Alias)(c),
|
|
})
|
|
}
|
|
|
|
func (c *QuotaContent) Unmarshal(data []byte) error {
|
|
type Alias QuotaContent
|
|
aux := (*Alias)(c)
|
|
return json.Unmarshal(data, &aux)
|
|
}
|
|
|
|
func ParseScopeType(t int8) ScopeType {
|
|
switch t {
|
|
case 1:
|
|
return ScopeAll
|
|
case 2:
|
|
return ScopeActive
|
|
case 3:
|
|
return ScopeExpired
|
|
case 4:
|
|
return ScopeNone
|
|
default:
|
|
return ScopeSkip
|
|
}
|
|
}
|