diff --git a/docs/docs.go b/docs/docs.go index 5a2a285f..316bb89e 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -6393,6 +6393,10 @@ const docTemplate = `{ }, "schema.UserEmailLogin": { "type": "object", + "required": [ + "e_mail", + "pass" + ], "properties": { "captcha_code": { "description": "captcha_code", @@ -6404,11 +6408,14 @@ const docTemplate = `{ }, "e_mail": { "description": "e_mail", - "type": "string" + "type": "string", + "maxLength": 500 }, "pass": { "description": "password", - "type": "string" + "type": "string", + "maxLength": 32, + "minLength": 8 } } }, diff --git a/docs/swagger.json b/docs/swagger.json index 0df8558c..25d181d7 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -6381,6 +6381,10 @@ }, "schema.UserEmailLogin": { "type": "object", + "required": [ + "e_mail", + "pass" + ], "properties": { "captcha_code": { "description": "captcha_code", @@ -6392,11 +6396,14 @@ }, "e_mail": { "description": "e_mail", - "type": "string" + "type": "string", + "maxLength": 500 }, "pass": { "description": "password", - "type": "string" + "type": "string", + "maxLength": 32, + "minLength": 8 } } }, diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 169a7466..d0a9d553 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1484,10 +1484,16 @@ definitions: type: string e_mail: description: e_mail + maxLength: 500 type: string pass: description: password + maxLength: 32 + minLength: 8 type: string + required: + - e_mail + - pass type: object schema.UserModifyPassWordRequest: properties: diff --git a/internal/service/question_service.go b/internal/service/question_service.go index 85bf7673..437d7936 100644 --- a/internal/service/question_service.go +++ b/internal/service/question_service.go @@ -3,6 +3,7 @@ package service import ( "encoding/json" "fmt" + "strings" "time" "github.com/answerdev/answer/internal/base/constant" @@ -225,6 +226,28 @@ func (qs *QuestionService) UpdateQuestion(ctx context.Context, req *schema.Quest if dbinfo.UserID != req.UserID { return } + + //CheckChangeTag + oldTags, err := qs.tagCommon.GetObjectEntityTag(ctx, question.ID) + if err != nil { + return + } + tagNameList := make([]string, 0) + for _, tag := range req.Tags { + tagNameList = append(tagNameList, tag.SlugName) + } + Tags, err := qs.tagCommon.GetTagListByNames(ctx, tagNameList) + if err != nil { + return + } + CheckTag, CheckTaglist := qs.CheckChangeTag(ctx, oldTags, Tags) + if !CheckTag { + err = errors.BadRequest(reason.UnauthorizedError).WithMsg(fmt.Sprintf("tag [%s] cannot be modified", + strings.Join(CheckTaglist, ","))) + return + } + + //update question to db err = qs.questionRepo.UpdateQuestion(ctx, question, []string{"title", "original_text", "parsed_text", "updated_at"}) if err != nil { return @@ -276,6 +299,10 @@ func (qs *QuestionService) ChangeTag(ctx context.Context, objectTagData *schema. return qs.tagCommon.ObjectChangeTag(ctx, objectTagData) } +func (qs *QuestionService) CheckChangeTag(ctx context.Context, oldobjectTagData, objectTagData []*entity.Tag) (bool, []string) { + return qs.tagCommon.ObjectCheckChangeTag(ctx, oldobjectTagData, objectTagData) +} + func (qs *QuestionService) SearchUserList(ctx context.Context, userName, order string, page, pageSize int, loginUserID string) ([]*schema.UserQuestionInfo, int64, error) { userlist := make([]*schema.UserQuestionInfo, 0) diff --git a/internal/service/tag_common/tag_common.go b/internal/service/tag_common/tag_common.go index 0f3ee25f..b37e2a83 100644 --- a/internal/service/tag_common/tag_common.go +++ b/internal/service/tag_common/tag_common.go @@ -205,7 +205,11 @@ func (ts *TagCommonService) ExistRecommend(ctx context.Context, tags []*schema.T // GetObjectTag get object tag func (ts *TagCommonService) GetObjectTag(ctx context.Context, objectId string) (objTags []*schema.TagResp, err error) { - objTags = make([]*schema.TagResp, 0) + tagsInfoList, err := ts.GetObjectEntityTag(ctx, objectId) + return ts.TagFormat(ctx, tagsInfoList) +} + +func (ts *TagCommonService) GetObjectEntityTag(ctx context.Context, objectId string) (objTags []*entity.Tag, err error) { tagIDList := make([]string, 0) tagList, err := ts.tagRelRepo.GetObjectTagRelList(ctx, objectId) if err != nil { @@ -214,11 +218,17 @@ func (ts *TagCommonService) GetObjectTag(ctx context.Context, objectId string) ( for _, tag := range tagList { tagIDList = append(tagIDList, tag.TagID) } - tagsInfoList, err := ts.tagRepo.GetTagListByIDs(ctx, tagIDList) + objTags, err = ts.tagRepo.GetTagListByIDs(ctx, tagIDList) if err != nil { return nil, err } - for _, tagInfo := range tagsInfoList { + + return objTags, nil +} + +func (ts *TagCommonService) TagFormat(ctx context.Context, tags []*entity.Tag) (objTags []*schema.TagResp, err error) { + objTags = make([]*schema.TagResp, 0) + for _, tagInfo := range tags { objTags = append(objTags, &schema.TagResp{ SlugName: tagInfo.SlugName, DisplayName: tagInfo.DisplayName, @@ -281,7 +291,6 @@ func (ts *TagCommonService) CheckTag(ctx context.Context, tags []string, userID } thisTagNameList := make([]string, 0) - thisTagIDList := make([]string, 0) for _, t := range tags { t = strings.ToLower(t) thisTagNameList = append(thisTagNameList, t) @@ -294,13 +303,17 @@ func (ts *TagCommonService) CheckTag(ctx context.Context, tags []string, userID } tagInDbMapping := make(map[string]*entity.Tag) + checktags := make([]string, 0) + for _, tag := range tagListInDb { if tag.MainTagID != 0 { - err = errors.BadRequest(reason.TagNotContainSynonym).WithMsg(fmt.Sprintf("tag name:%s", tag.SlugName)) - return err + checktags = append(checktags, fmt.Sprintf("\"%s\"", tag.SlugName)) } tagInDbMapping[tag.SlugName] = tag - thisTagIDList = append(thisTagIDList, tag.ID) + } + if len(checktags) > 0 { + err = errors.BadRequest(reason.TagNotContainSynonym).WithMsg(fmt.Sprintf("Should not contain synonym tags %s", strings.Join(checktags, ","))) + return err } addTagList := make([]*entity.Tag, 0) @@ -324,30 +337,35 @@ func (ts *TagCommonService) CheckTag(ctx context.Context, tags []string, userID err = errors.BadRequest(reason.TagNotFound).WithMsg(fmt.Sprintf("tag [%s] does not exist", strings.Join(addTagMsgList, ","))) return err - // todo if need add - // err = ts.tagRepo.AddTagList(ctx, addTagList) - // if err != nil { - // return err - // } - // for _, tag := range addTagList { - // thisTagIDList = append(thisTagIDList, tag.ID) - // revisionDTO := &schema.AddRevisionDTO{ - // UserID: userID, - // ObjectID: tag.ID, - // Title: tag.SlugName, - // } - // tagInfoJson, _ := json.Marshal(tag) - // revisionDTO.Content = string(tagInfoJson) - // err = ts.revisionService.AddRevision(ctx, revisionDTO, true) - // if err != nil { - // return err - // } - // } + } return nil } +func (ts *TagCommonService) ObjectCheckChangeTag(ctx context.Context, oldobjectTagData, objectTagData []*entity.Tag) (bool, []string) { + reservedTagsMap := make(map[string]bool) + needTagsMap := make([]string, 0) + for _, tag := range objectTagData { + if tag.Reserved { + reservedTagsMap[tag.SlugName] = true + } + } + for _, tag := range oldobjectTagData { + if tag.Reserved { + _, ok := reservedTagsMap[tag.SlugName] + if !ok { + needTagsMap = append(needTagsMap, tag.SlugName) + } + } + } + if len(needTagsMap) > 0 { + return false, needTagsMap + } + + return true, []string{} +} + // ObjectChangeTag change object tag list func (ts *TagCommonService) ObjectChangeTag(ctx context.Context, objectTagData *schema.TagChange) (err error) { if len(objectTagData.Tags) == 0 {