internal/schema/tag_schema.go (190 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package schema
import (
"strings"
"github.com/apache/answer/internal/base/validator"
"github.com/apache/answer/pkg/converter"
)
// SearchTagLikeReq get tag list all request
type SearchTagLikeReq struct {
// tag
Tag string `validate:"omitempty" form:"tag"`
IsAdmin bool `json:"-"`
}
// SearchTagsBySlugName search tags by slug name
type SearchTagsBySlugName struct {
// slug name list split by ','
Tags string `form:"tags"`
}
// GetTagInfoReq get tag info request
type GetTagInfoReq struct {
// tag id
ID string `validate:"omitempty" form:"id"`
// tag slug name
Name string `validate:"omitempty,gt=0,lte=35" form:"name"`
UserID string `json:"-"`
CanEdit bool `json:"-"`
CanDelete bool `json:"-"`
CanMerge bool `json:"-"`
CanRecover bool `json:"-"`
}
type GetTamplateTagInfoReq struct {
// tag id
ID string `validate:"omitempty" form:"id"`
// tag slug name
Name string `validate:"omitempty" form:"name"`
// user id
UserID string `json:"-"`
Page int `validate:"omitempty,min=1" form:"page"`
PageSize int `validate:"omitempty,min=1" form:"page_size"`
}
func (r *GetTagInfoReq) Check() (errFields []*validator.FormErrorField, err error) {
r.Name = strings.ToLower(r.Name)
return nil, nil
}
// GetTagResp get tag response
type GetTagResp struct {
TagID string `json:"tag_id"`
CreatedAt int64 `json:"created_at"`
UpdatedAt int64 `json:"updated_at"`
SlugName string `json:"slug_name"`
DisplayName string `json:"display_name"`
Excerpt string `json:"excerpt"`
OriginalText string `json:"original_text"`
ParsedText string `json:"parsed_text"`
Description string `json:"description"`
FollowCount int `json:"follow_count"`
QuestionCount int `json:"question_count"`
IsFollower bool `json:"is_follower"`
Status string `json:"status"`
MemberActions []*PermissionMemberAction `json:"member_actions"`
// if main tag slug name is not empty, this tag is synonymous with the main tag
MainTagSlugName string `json:"main_tag_slug_name"`
Recommend bool `json:"recommend"`
Reserved bool `json:"reserved"`
}
func (tr *GetTagResp) GetExcerpt() {
excerpt := strings.TrimSpace(tr.ParsedText)
idx := strings.Index(excerpt, "\n")
if idx >= 0 {
excerpt = excerpt[0:idx]
}
tr.Excerpt = excerpt
}
// GetTagPageResp get tag response
type GetTagPageResp struct {
// tag_id
TagID string `json:"tag_id"`
// slug_name
SlugName string `json:"slug_name"`
// display_name
DisplayName string `json:"display_name"`
// excerpt
Excerpt string `json:"excerpt"`
//description
Description string `json:"description"`
// original text
OriginalText string `json:"original_text"`
// parsed_text
ParsedText string `json:"parsed_text"`
// follower amount
FollowCount int `json:"follow_count"`
// question amount
QuestionCount int `json:"question_count"`
// is follower
IsFollower bool `json:"is_follower"`
// created time
CreatedAt int64 `json:"created_at"`
// updated time
UpdatedAt int64 `json:"updated_at"`
Recommend bool `json:"recommend"`
Reserved bool `json:"reserved"`
}
func (tr *GetTagPageResp) GetExcerpt() {
excerpt := strings.TrimSpace(tr.ParsedText)
idx := strings.Index(excerpt, "\n")
if idx >= 0 {
excerpt = excerpt[0:idx]
}
tr.Excerpt = excerpt
}
type TagChange struct {
ObjectID string `json:"object_id"` // object_id
Tags []*TagItem `json:"tags"` // tags name
// user id
UserID string `json:"-"`
}
type TagItem struct {
// slug_name
SlugName string `validate:"omitempty,gt=0,lte=35" json:"slug_name"`
// display_name
DisplayName string `validate:"omitempty,gt=0,lte=35" json:"display_name"`
// original text
OriginalText string `validate:"omitempty" json:"original_text"`
// parsed text
ParsedText string `json:"-"`
}
// RemoveTagReq delete tag request
type RemoveTagReq struct {
// tag_id
TagID string `validate:"required" json:"tag_id"`
// user id
UserID string `json:"-"`
}
// AddTagReq add tag request
type AddTagReq struct {
// slug_name
SlugName string `validate:"required,gt=0,lte=35" json:"slug_name"`
// display_name
DisplayName string `validate:"required,gt=0,lte=35" json:"display_name"`
// original text
OriginalText string `validate:"required,gt=0,lte=65536" json:"original_text"`
// parsed text
ParsedText string `json:"-"`
// user id
UserID string `json:"-"`
}
func (req *AddTagReq) Check() (errFields []*validator.FormErrorField, err error) {
req.ParsedText = converter.Markdown2HTML(req.OriginalText)
req.SlugName = strings.ToLower(req.SlugName)
return nil, nil
}
// AddTagResp add tag response
type AddTagResp struct {
SlugName string `json:"slug_name"`
}
// UpdateTagReq update tag request
type UpdateTagReq struct {
// tag_id
TagID string `validate:"required" json:"tag_id"`
// slug_name
SlugName string `validate:"omitempty,gt=0,lte=35" json:"slug_name"`
// display_name
DisplayName string `validate:"omitempty,gt=0,lte=35" json:"display_name"`
// original text
OriginalText string `validate:"omitempty" json:"original_text"`
// parsed text
ParsedText string `json:"-"`
// edit summary
EditSummary string `validate:"omitempty" json:"edit_summary"`
// user id
UserID string `json:"-"`
NoNeedReview bool `json:"-"`
}
func (r *UpdateTagReq) Check() (errFields []*validator.FormErrorField, err error) {
r.ParsedText = converter.Markdown2HTML(r.OriginalText)
return nil, nil
}
// RecoverTagReq update tag request
type RecoverTagReq struct {
TagID string `validate:"required" json:"tag_id"`
UserID string `json:"-"`
}
// UpdateTagResp update tag response
type UpdateTagResp struct {
WaitForReview bool `json:"wait_for_review"`
}
// GetTagWithPageReq get tag list page request
type GetTagWithPageReq struct {
// page
Page int `validate:"omitempty,min=1" form:"page"`
// page size
PageSize int `validate:"omitempty,min=1" form:"page_size"`
// slug_name
SlugName string `validate:"omitempty,gt=0,lte=35" form:"slug_name"`
// display_name
DisplayName string `validate:"omitempty,gt=0,lte=35" form:"display_name"`
// query condition
QueryCond string `validate:"omitempty,oneof=popular name newest" form:"query_cond"`
// user id
UserID string `json:"-"`
}
// GetTagSynonymsReq get tag synonyms request
type GetTagSynonymsReq struct {
// tag_id
TagID string `validate:"required" form:"tag_id"`
// user id
UserID string `json:"-"`
// whether user can edit it
CanEdit bool `json:"-"`
}
// GetTagSynonymsResp get tag synonyms response
type GetTagSynonymsResp struct {
// synonyms
Synonyms []*TagSynonym `json:"synonyms"`
// MemberActions
MemberActions []*PermissionMemberAction `json:"member_actions"`
}
type TagSynonym struct {
// tag id
TagID string `json:"tag_id"`
// slug name
SlugName string `json:"slug_name"`
// display name
DisplayName string `json:"display_name"`
// if main tag slug name is not empty, this tag is synonymous with the main tag
MainTagSlugName string `json:"main_tag_slug_name"`
}
// UpdateTagSynonymReq update tag request
type UpdateTagSynonymReq struct {
// tag_id
TagID string `validate:"required" json:"tag_id"`
// synonym tag list
SynonymTagList []*TagItem `validate:"required,dive" json:"synonym_tag_list"`
// user id
UserID string `json:"-"`
}
func (req *UpdateTagSynonymReq) Format() {
for _, item := range req.SynonymTagList {
item.SlugName = strings.ToLower(item.SlugName)
}
}
// GetFollowingTagsResp get following tags response
type GetFollowingTagsResp struct {
// tag id
TagID string `json:"tag_id"`
// slug name
SlugName string `json:"slug_name"`
// display name
DisplayName string `json:"display_name"`
// if main tag slug name is not empty, this tag is synonymous with the main tag
MainTagSlugName string `json:"main_tag_slug_name"`
Recommend bool `json:"recommend"`
Reserved bool `json:"reserved"`
}
// GetTagBasicResp get tag basic response
type GetTagBasicResp struct {
TagID string `json:"tag_id"`
SlugName string `json:"slug_name"`
DisplayName string `json:"display_name"`
Recommend bool `json:"recommend"`
Reserved bool `json:"reserved"`
}
// MergeTagReq merge tag request
type MergeTagReq struct {
// source tag id
SourceTagID string `validate:"required" json:"source_tag_id"`
// target tag id
TargetTagID string `validate:"required" json:"target_tag_id"`
// user id
UserID string `json:"-"`
}
// MergeTagResp merge tag response
type MergeTagResp struct {
}