You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.6 KiB
150 lines
4.6 KiB
package model |
|
|
|
import ( |
|
"net/url" |
|
|
|
xtime "go-common/library/time" |
|
) |
|
|
|
// Chall is the row view for every challenge |
|
type Chall struct { |
|
Cid int64 `json:"cid" gorm:"column:id"` |
|
Gid int64 `json:"gid" gorm:"column:gid"` |
|
Oid int64 `json:"oid" gorm:"column:oid"` |
|
OidStr string `json:"oid_str" gorm:"-"` |
|
Business int8 `json:"business" gorm:"column:business"` |
|
Mid int64 `json:"mid" gorm:"column:mid"` |
|
MName string `json:"m_name" gorm:"-"` |
|
Tid int64 `json:"tid" gorm:"column:tid"` |
|
State int8 `json:"state"` |
|
BusinessState int8 `json:"business_state"` |
|
DispatchState uint32 `json:"-" gorm:"column:dispatch_state"` |
|
DispatchTime xtime.Time `json:"dispatch_time" gorm:"column:dispatch_time"` |
|
Description string `json:"description" gorm:"column:description"` |
|
Metadata string `json:"metadata" gorm:"column:metadata"` |
|
CTime xtime.Time `json:"ctime" gorm:"column:ctime"` |
|
MTime xtime.Time `json:"mtime" gorm:"column:mtime"` |
|
BusinessObject *Business `json:"business_object,omitempty" gorm:"-"` |
|
AssigneeAdminID int64 `json:"assignee_adminid" gorm:"column:assignee_adminid"` |
|
AdminID int64 `json:"adminid" gorm:"column:adminid"` |
|
AssigneeAdminName string `json:"assignee_admin_name" gorm:"-"` |
|
AdminName string `json:"admin_name" gorm:"-"` |
|
TotalStates string `json:"total_states" gorm:"-"` |
|
|
|
// tag related fields |
|
Tag string `json:"tag" gorm:"-"` |
|
Round int8 `json:"round" gorm:"-"` |
|
|
|
// log related |
|
LastLog string `json:"last_log" gorm:"-"` |
|
// event related |
|
LastEvent *Event `json:"last_event" gorm:"-"` |
|
|
|
// Attachments |
|
Attachments []string `json:"attachments" gorm:"-"` |
|
|
|
// linked group object |
|
Group *Group `json:"group,omitempty" gorm:"-"` |
|
|
|
Meta interface{} `json:"meta" gorm:"-"` |
|
AuditLog interface{} `json:"audit_log" gorm:"-"` |
|
Producer *Account `json:"producer" gorm:"-"` //举报人 |
|
|
|
// business table |
|
Title string `json:"title,omitempty" gorm:"-"` |
|
TypeID int64 `json:"type_id,omitempty" gorm:"-"` |
|
} |
|
|
|
// TinyChall is the tiny row view for every challenge |
|
type TinyChall struct { |
|
Cid int64 `json:"cid" gorm:"column:id"` |
|
Gid int64 `json:"gid" gorm:"column:gid"` |
|
Mid int64 `json:"mid" gorm:"column:mid"` |
|
CTime xtime.Time `json:"ctime" gorm:"column:ctime"` |
|
State int8 `json:"state" gorm:"-"` |
|
Title string `json:"title" gorm:"-"` |
|
} |
|
|
|
// ChallTagSlice is the slice to ChallTag |
|
type ChallTagSlice []*ChallTag |
|
|
|
// ChallTag is the model to retrive user submitted tags in group view |
|
type ChallTag struct { |
|
ID int64 `json:"id"` |
|
Tag string `json:"tag"` |
|
Round int8 `json:"round"` |
|
Count int64 `json:"count"` |
|
Percent int32 `json:"percent"` |
|
} |
|
|
|
// TableName is used to identify chall table name in gorm |
|
func (Chall) TableName() string { |
|
return "workflow_chall" |
|
} |
|
|
|
func (c ChallTagSlice) Len() int { |
|
return len(c) |
|
} |
|
|
|
func (c ChallTagSlice) Swap(i, j int) { |
|
c[i], c[j] = c[j], c[i] |
|
} |
|
|
|
func (c ChallTagSlice) Less(i, j int) bool { |
|
return c[i].Percent < c[j].Percent |
|
} |
|
|
|
// FixAttachments will fix attachments url as user friendly |
|
// ignore https case |
|
// FIXME: this should be removed after attachment url is be normed |
|
func (c *Chall) FixAttachments() { |
|
if c.Attachments == nil { |
|
return |
|
} |
|
fixed := make([]string, 0, len(c.Attachments)) |
|
for _, a := range c.Attachments { |
|
u, err := url.Parse(a) |
|
if err != nil { |
|
continue |
|
} |
|
u.Scheme = "http" |
|
fixed = append(fixed, u.String()) |
|
} |
|
c.Attachments = fixed |
|
} |
|
|
|
// SetState update state of a role |
|
// ex. oldState=0x3a4b5c6d, state=15, role=1 then result is 0x3a4b5cfd |
|
func (c *Chall) SetState(state uint32, role uint8) { |
|
oldState := c.DispatchState |
|
mod := uint32(^(0xf << (4 * role))) |
|
oldState = oldState & mod // all bit keep unchanged and bits you want update change to 0 |
|
c.DispatchState = oldState + state<<(4*role) |
|
} |
|
|
|
// getState return state of a role from dispatchState field |
|
// ex. dispatchState=0x3a4b5c6d, role=1 then result is 0x6 |
|
func (c *Chall) getState(role uint8) (result int8) { |
|
dispatchState := c.DispatchState |
|
mod := uint32(0xf << (4 * role)) |
|
dispatchState &= mod |
|
result = int8(dispatchState >> (4 * role)) |
|
return |
|
} |
|
|
|
// FromState set State and BusinessState field from DispatchState field |
|
func (c *Chall) FromState() { |
|
c.State = c.getState(uint8(0)) |
|
c.BusinessState = c.getState(uint8(1)) |
|
} |
|
|
|
// FormatState transform state in queue |
|
func (c *Chall) FormatState() { |
|
if c.State == QueueState { |
|
c.State = QueueStateBefore |
|
} |
|
|
|
if c.BusinessState == QueueBusinessState { |
|
c.BusinessState = QueueBusinessStateBefore |
|
} |
|
}
|
|
|