package models import ( "encoding/json" "time" ) type Visibility string const ( VisibilityPublic Visibility = "public" VisibilityPrivate Visibility = "private" ) type TopicStatus string const ( TopicStatusCreated TopicStatus = "created" TopicStatusSignupOpen TopicStatus = "signup_open" TopicStatusSignupClosed TopicStatus = "signup_closed" TopicStatusDebating TopicStatus = "debating" TopicStatusCompleted TopicStatus = "completed" TopicStatusCancelled TopicStatus = "cancelled" ) type Camp string const ( CampPro Camp = "pro" CampCon Camp = "con" CampJudge Camp = "judge" ) // AllCamps is the canonical iteration order used by the allocation algorithm. var AllCamps = [3]Camp{CampPro, CampCon, CampJudge} type Topic struct { ID string `db:"id" json:"id"` Title string `db:"title" json:"title"` Summary string `db:"summary" json:"summary"` Visibility Visibility `db:"visibility" json:"visibility"` VerdictSchemaID string `db:"verdict_schema_id" json:"verdict_schema_id"` Status TopicStatus `db:"status" json:"status"` SignupOpenAt time.Time `db:"signup_open_at" json:"signup_open_at"` SignupCloseAt time.Time `db:"signup_close_at" json:"signup_close_at"` DebateStartAt time.Time `db:"debate_start_at" json:"debate_start_at"` DebateEndAt time.Time `db:"debate_end_at" json:"debate_end_at"` CreatorUserID string `db:"creator_user_id" json:"creator_user_id"` VisibilityChangedBy *string `db:"visibility_changed_by" json:"visibility_changed_by,omitempty"` VisibilityChangedAt *time.Time `db:"visibility_changed_at" json:"visibility_changed_at,omitempty"` CancelledReason *string `db:"cancelled_reason" json:"cancelled_reason,omitempty"` CreatedAt time.Time `db:"created_at" json:"created_at"` UpdatedAt time.Time `db:"updated_at" json:"updated_at"` } // IsCampValid returns true iff c is one of pro|con|judge. func IsCampValid(c Camp) bool { for _, k := range AllCamps { if k == c { return true } } return false } // SignupCampsJSON is a typed wrapper around the JSON-stored willing_camps // column. We marshal/unmarshal at the boundary so handlers can work with // the typed slice. type SignupCampsJSON []Camp func (s SignupCampsJSON) Marshal() ([]byte, error) { return json.Marshal(s) } func (s *SignupCampsJSON) UnmarshalDB(raw []byte) error { if len(raw) == 0 { *s = nil return nil } return json.Unmarshal(raw, s) }