package schema import ( "time" "github.com/answerdev/answer/internal/base/validator" "github.com/answerdev/answer/pkg/converter" ) const ( SitemapMaxSize = 50000 SitemapCachekey = "answer@sitemap" SitemapPageCachekey = "answer@sitemap@page%d" ) // RemoveQuestionReq delete question request type RemoveQuestionReq struct { // question id ID string `validate:"required" json:"id"` UserID string `json:"-" ` // user_id IsAdmin bool `json:"-"` } type CloseQuestionReq struct { ID string `validate:"required" json:"id"` CloseType int `json:"close_type"` // close_type CloseMsg string `json:"close_msg"` // close_type UserID string `json:"-"` // user_id } type CloseQuestionMeta struct { CloseType int `json:"close_type"` CloseMsg string `json:"close_msg"` } // ReopenQuestionReq reopen question request type ReopenQuestionReq struct { QuestionID string `json:"question_id"` UserID string `json:"-"` } type QuestionAdd struct { // question title Title string `validate:"required,gte=6,lte=150" json:"title"` // content Content string `validate:"required,gte=6,lte=65535" json:"content"` // html HTML string `validate:"required,gte=6,lte=65535" json:"html"` // tags Tags []*TagItem `validate:"required,dive" json:"tags"` // user id UserID string `json:"-"` QuestionPermission } func (req *QuestionAdd) Check() (errFields []*validator.FormErrorField, err error) { req.HTML = converter.Markdown2HTML(req.Content) for _, tag := range req.Tags { if len(tag.OriginalText) > 0 { tag.ParsedText = converter.Markdown2HTML(tag.OriginalText) } } return nil, nil } type QuestionPermission struct { // whether user can add it CanAdd bool `json:"-"` // whether user can edit it CanEdit bool `json:"-"` // whether user can delete it CanDelete bool `json:"-"` // whether user can close it CanClose bool `json:"-"` // whether user can reopen it CanReopen bool `json:"-"` // whether user can use reserved it CanUseReservedTag bool `json:"-"` } type CheckCanQuestionUpdate struct { // question id ID string `validate:"required" form:"id"` // user id UserID string `json:"-"` IsAdmin bool `json:"-"` } type QuestionUpdate struct { // question id ID string `validate:"required" json:"id"` // question title Title string `validate:"required,gte=6,lte=150" json:"title"` // content Content string `validate:"required,gte=6,lte=65535" json:"content"` // html HTML string `validate:"required,gte=6,lte=65535" json:"html"` // tags Tags []*TagItem `validate:"required,dive" json:"tags"` // edit summary EditSummary string `validate:"omitempty" json:"edit_summary"` // user id UserID string `json:"-"` NoNeedReview bool `json:"-"` QuestionPermission } func (req *QuestionUpdate) Check() (errFields []*validator.FormErrorField, err error) { req.HTML = converter.Markdown2HTML(req.Content) return nil, nil } type QuestionBaseInfo struct { ID string `json:"id" ` Title string `json:"title" xorm:"title"` // title ViewCount int `json:"view_count" xorm:"view_count"` // view count AnswerCount int `json:"answer_count" xorm:"answer_count"` // answer count CollectionCount int `json:"collection_count" xorm:"collection_count"` // collection count FollowCount int `json:"follow_count" xorm:"follow_count"` // follow count Status string `json:"status"` AcceptedAnswer bool `json:"accepted_answer"` } type QuestionInfo struct { ID string `json:"id" ` Title string `json:"title" xorm:"title"` // title UrlTitle string `json:"url_title" xorm:"url_title"` // title Content string `json:"content" xorm:"content"` // content HTML string `json:"html" xorm:"html"` // html Description string `json:"description"` //description Tags []*TagResp `json:"tags" ` // tags ViewCount int `json:"view_count" xorm:"view_count"` // view_count UniqueViewCount int `json:"unique_view_count" xorm:"unique_view_count"` // unique_view_count VoteCount int `json:"vote_count" xorm:"vote_count"` // vote_count AnswerCount int `json:"answer_count" xorm:"answer_count"` // answer count CollectionCount int `json:"collection_count" xorm:"collection_count"` // collection count FollowCount int `json:"follow_count" xorm:"follow_count"` // follow count AcceptedAnswerID string `json:"accepted_answer_id" ` // accepted_answer_id LastAnswerID string `json:"last_answer_id" ` // last_answer_id CreateTime int64 `json:"create_time" ` // create_time UpdateTime int64 `json:"-"` // update_time PostUpdateTime int64 `json:"update_time"` QuestionUpdateTime int64 `json:"edit_time"` Status int `json:"status"` Operation *Operation `json:"operation,omitempty"` UserID string `json:"-" ` LastEditUserID string `json:"-" ` LastAnsweredUserID string `json:"-" ` UserInfo *UserBasicInfo `json:"user_info"` UpdateUserInfo *UserBasicInfo `json:"update_user_info,omitempty"` LastAnsweredUserInfo *UserBasicInfo `json:"last_answered_user_info,omitempty"` Answered bool `json:"answered"` Collected bool `json:"collected"` VoteStatus string `json:"vote_status"` IsFollowed bool `json:"is_followed"` // MemberActions MemberActions []*PermissionMemberAction `json:"member_actions"` } // UpdateQuestionResp update question resp type UpdateQuestionResp struct { WaitForReview bool `json:"wait_for_review"` } type AdminQuestionInfo struct { ID string `json:"id"` Title string `json:"title"` VoteCount int `json:"vote_count"` AnswerCount int `json:"answer_count"` AcceptedAnswerID string `json:"accepted_answer_id"` CreateTime int64 `json:"create_time"` UpdateTime int64 `json:"update_time"` EditTime int64 `json:"edit_time"` UserID string `json:"-" ` UserInfo *UserBasicInfo `json:"user_info"` } type Operation struct { OperationType string `json:"operation_type"` OperationDescription string `json:"operation_description"` OperationMsg string `json:"operation_msg"` OperationTime int64 `json:"operation_time"` } type GetCloseTypeResp struct { // report name Name string `json:"name"` // report description Description string `json:"description"` // report source Source string `json:"source"` // report type Type int `json:"type"` // is have content HaveContent bool `json:"have_content"` // content type ContentType string `json:"content_type"` } type UserAnswerInfo struct { AnswerID string `json:"answer_id"` QuestionID string `json:"question_id"` Accepted int `json:"accepted"` VoteCount int `json:"vote_count"` CreateTime int `json:"create_time"` UpdateTime int `json:"update_time"` QuestionInfo struct { Title string `json:"title"` Tags []interface{} `json:"tags"` } `json:"question_info"` } type UserQuestionInfo struct { ID string `json:"question_id"` Title string `json:"title"` VoteCount int `json:"vote_count"` Tags []interface{} `json:"tags"` ViewCount int `json:"view_count"` AnswerCount int `json:"answer_count"` CollectionCount int `json:"collection_count"` CreateTime int `json:"create_time"` AcceptedAnswerID string `json:"accepted_answer_id"` Status string `json:"status"` } const ( QuestionOrderCondNewest = "newest" QuestionOrderCondActive = "active" QuestionOrderCondFrequent = "frequent" QuestionOrderCondScore = "score" QuestionOrderCondUnanswered = "unanswered" ) // QuestionPageReq query questions page type QuestionPageReq struct { Page int `validate:"omitempty,min=1" form:"page"` PageSize int `validate:"omitempty,min=1" form:"page_size"` OrderCond string `validate:"omitempty,oneof=newest active frequent score unanswered" form:"order"` Tag string `validate:"omitempty,gt=0,lte=100" form:"tag"` Username string `validate:"omitempty,gt=0,lte=100" form:"username"` LoginUserID string `json:"-"` UserIDBeSearched string `json:"-"` TagID string `json:"-"` } const ( QuestionPageRespOperationTypeAsked = "question.operation_type.asked" QuestionPageRespOperationTypeAnswered = "question.operation_type.answered" QuestionPageRespOperationTypeModified = "question.operation_type.modified" ) type QuestionPageResp struct { ID string `json:"id" ` Title string `json:"title"` UrlTitle string `json:"url_title"` Description string `json:"description"` Status int `json:"status"` Tags []*TagResp `json:"tags"` // question statistical information ViewCount int `json:"view_count"` UniqueViewCount int `json:"unique_view_count"` VoteCount int `json:"vote_count"` AnswerCount int `json:"answer_count"` CollectionCount int `json:"collection_count"` FollowCount int `json:"follow_count"` // answer information AcceptedAnswerID string `json:"accepted_answer_id"` LastAnswerID string `json:"last_answer_id"` LastAnsweredUserID string `json:"-"` LastAnsweredAt time.Time `json:"-"` // operator information OperatedAt int64 `json:"operated_at"` Operator *QuestionPageRespOperator `json:"operator"` OperationType string `json:"operation_type"` } type QuestionPageRespOperator struct { ID string `json:"id"` Username string `json:"username"` Rank int `json:"rank"` DisplayName string `json:"display_name"` } type AdminQuestionSearch struct { Page int `json:"page" form:"page"` // Query number of pages PageSize int `json:"page_size" form:"page_size"` // Search page size Status int `json:"-" form:"-"` StatusStr string `json:"status" form:"status"` // Status 1 Available 2 closed 10 UserDeleted Query string `validate:"omitempty,gt=0,lte=100" json:"query" form:"query" ` //Query string } type AdminSetQuestionStatusRequest struct { StatusStr string `json:"status" form:"status"` QuestionID string `json:"question_id" form:"question_id"` } type SiteMapList struct { QuestionIDs []*SiteMapQuestionInfo `json:"question_ids"` MaxPageNum []int `json:"max_page_num"` } type SiteMapPageList struct { PageData []*SiteMapQuestionInfo `json:"page_data"` } type SiteMapQuestionInfo struct { ID string `json:"id"` Title string `json:"title"` UpdateTime string `json:"time"` }