package domain import ( "database/sql/driver" "encoding/json" "errors" "fmt" "time" "github.com/lib/pq" ) type Comment struct { ID string `json:"id" gorm:"primaryKey"` KbID string `json:"kb_id"` UserID string `json:"user_id"` NodeID string `json:"node_id" gorm:"index"` Info CommentInfo `json:"info" gorm:"type:jsonb"` ParentID string `json:"parent_id"` RootID string `json:"root_id"` Content string `json:"content"` Status CommentStatus `json:"status"` // status : -1 reject 0 pending 1 accept PicUrls pq.StringArray `json:"pic_urls" gorm:"type:text[];not null;default:{}"` CreatedAt time.Time `json:"created_at"` } func (Comment) TableName() string { return "comments" } type CommentInfo struct { AuthUserID uint `json:"auth_user_id"` UserName string `json:"user_name"` Email string `json:"email"` Avatar string `json:"avatar"` // avatar RemoteIP string `json:"remote_ip"` } type CommentStatus int8 const ( CommentStatusReject CommentStatus = -1 CommentStatusPending CommentStatus = 0 CommentStatusAccepted CommentStatus = 1 ) func (d *CommentInfo) Value() (driver.Value, error) { return json.Marshal(d) } func (d *CommentInfo) Scan(value any) error { bytes, ok := value.([]byte) if !ok { return errors.New(fmt.Sprint("invalid comment info type:", value)) } return json.Unmarshal(bytes, d) } type CommentReq struct { NodeID string `json:"node_id" validate:"required"` Content string `json:"content" validate:"required"` UserName string `json:"user_name"` ParentID string `json:"parent_id"` RootID string `json:"root_id"` CaptchaToken string `json:"captcha_token"` PicUrls []string `json:"pic_urls" validate:"required"` } type CommentListReq struct { KbID string `json:"kb_id" query:"kb_id" validate:"required"` Status *CommentStatus `json:"status" query:"status"` Pager } type CommentListItem struct { ID string `json:"id"` NodeID string `json:"node_id"` RootID string `json:"root_id"` Info CommentInfo `json:"info" gorm:"info;type:jsonb"` NodeType int `json:"node_type"` NodeName string `json:"node_name"` // 文档标题 Content string `json:"content"` Status CommentStatus `json:"status"` // status : -1 reject 0 pending 1 accept IPAddress *IPAddress `json:"ip_address" gorm:"-"` // ip地址 CreatedAt time.Time `json:"created_at"` } type DeleteCommentListReq struct { IDS []string `json:"ids" query:"ids"` } type ShareCommentListItem struct { ID string `json:"id" gorm:"primaryKey"` KbID string `json:"kb_id"` NodeID string `json:"node_id" gorm:"index"` Info CommentInfo `json:"info" gorm:"type:jsonb"` ParentID string `json:"parent_id"` RootID string `json:"root_id"` Content string `json:"content"` PicUrls pq.StringArray `json:"pic_urls" gorm:"type:text[]"` IPAddress *IPAddress `json:"ip_address" gorm:"-"` // ip地址 CreatedAt time.Time `json:"created_at"` }