go-common/app/admin/main/workflow/model/challenge.go

151 lines
4.6 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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
}
}