in internal/service/tag/tag_service.go [299:400]
func (ts *TagService) UpdateTagSynonym(ctx context.Context, req *schema.UpdateTagSynonymReq) (err error) {
// format tag slug name
req.Format()
addSynonymTagList := make([]string, 0)
removeSynonymTagList := make([]string, 0)
mainTagInfo, exist, err := ts.tagCommonService.GetTagByID(ctx, req.TagID)
if err != nil {
return err
}
if !exist {
return errors.BadRequest(reason.TagNotFound)
}
// find all exist tag
for _, item := range req.SynonymTagList {
if item.SlugName == mainTagInfo.SlugName {
return errors.BadRequest(reason.TagCannotSetSynonymAsItself)
}
addSynonymTagList = append(addSynonymTagList, item.SlugName)
}
tagListInDB, err := ts.tagCommonService.GetTagListByNames(ctx, addSynonymTagList)
if err != nil {
return err
}
existTagMapping := make(map[string]*entity.Tag, 0)
for _, tag := range tagListInDB {
existTagMapping[tag.SlugName] = tag
}
// add tag list
needAddTagList := make([]*entity.Tag, 0)
for _, tag := range req.SynonymTagList {
if existTagMapping[tag.SlugName] != nil {
continue
}
item := &entity.Tag{}
item.SlugName = tag.SlugName
item.DisplayName = tag.DisplayName
item.OriginalText = tag.OriginalText
item.ParsedText = tag.ParsedText
item.Status = entity.TagStatusAvailable
item.UserID = req.UserID
needAddTagList = append(needAddTagList, item)
}
if len(needAddTagList) > 0 {
err = ts.tagCommonService.AddTagList(ctx, needAddTagList)
if err != nil {
return err
}
// update tag revision
for _, tag := range needAddTagList {
existTagMapping[tag.SlugName] = tag
revisionDTO := &schema.AddRevisionDTO{
UserID: req.UserID,
ObjectID: tag.ID,
Title: tag.SlugName,
}
tagInfoJson, _ := json.Marshal(tag)
revisionDTO.Content = string(tagInfoJson)
revisionID, err := ts.revisionService.AddRevision(ctx, revisionDTO, true)
if err != nil {
return err
}
ts.activityQueueService.Send(ctx, &schema.ActivityMsg{
UserID: req.UserID,
ObjectID: tag.ID,
OriginalObjectID: tag.ID,
ActivityTypeKey: constant.ActTagCreated,
RevisionID: revisionID,
})
}
}
// get all old synonyms list
oldSynonymList, err := ts.tagRepo.GetTagList(ctx, &entity.Tag{MainTagID: converter.StringToInt64(mainTagInfo.ID)})
if err != nil {
return err
}
for _, oldSynonym := range oldSynonymList {
if existTagMapping[oldSynonym.SlugName] == nil {
removeSynonymTagList = append(removeSynonymTagList, oldSynonym.SlugName)
}
}
// remove old synonyms
if len(removeSynonymTagList) > 0 {
err = ts.tagRepo.UpdateTagSynonym(ctx, removeSynonymTagList, 0, "")
if err != nil {
return err
}
}
// update new synonyms
if len(addSynonymTagList) > 0 {
err = ts.tagRepo.UpdateTagSynonym(ctx, addSynonymTagList, converter.StringToInt64(req.TagID), mainTagInfo.SlugName)
if err != nil {
return err
}
}
return nil
}