123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- 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
- }
- }
|