in internal/service/tag_common/tag_common.go [781:846]
func (ts *TagCommonService) CreateOrUpdateTagRelList(ctx context.Context, objectId string, tagIDs []string) (err error) {
addTagIDMapping := make(map[string]struct{})
for _, t := range tagIDs {
addTagIDMapping[t] = struct{}{}
}
// get all old relation
oldTagRelList, err := ts.tagRelRepo.GetObjectTagRelList(ctx, objectId)
if err != nil {
return err
}
var deleteTagRel []int64
needRefreshTagIDs := make([]string, 0, len(oldTagRelList)+len(tagIDs))
needRefreshTagIDs = append(needRefreshTagIDs, tagIDs...)
for _, rel := range oldTagRelList {
if _, ok := addTagIDMapping[rel.TagID]; !ok {
deleteTagRel = append(deleteTagRel, rel.ID)
needRefreshTagIDs = append(needRefreshTagIDs, rel.TagID)
}
}
addTagRelList := make([]*entity.TagRel, 0)
enableTagRelList := make([]int64, 0)
defaultTagRelStatus, err := ts.tagRelRepo.GetTagRelDefaultStatusByObjectID(ctx, objectId)
if err != nil {
return err
}
for _, tagID := range tagIDs {
rel, exist, err := ts.tagRelRepo.GetObjectTagRelWithoutStatus(ctx, objectId, tagID)
if err != nil {
return err
}
// if not exist add tag relation
if !exist {
addTagRelList = append(addTagRelList, &entity.TagRel{
TagID: tagID, ObjectID: objectId, Status: defaultTagRelStatus,
})
}
// if exist and has been removed, that should be enabled
if exist && rel.Status != entity.TagRelStatusAvailable && rel.Status != entity.TagRelStatusHide {
enableTagRelList = append(enableTagRelList, rel.ID)
}
}
if len(deleteTagRel) > 0 {
if err = ts.tagRelRepo.RemoveTagRelListByIDs(ctx, deleteTagRel); err != nil {
return err
}
}
if len(addTagRelList) > 0 {
if err = ts.tagRelRepo.AddTagRelList(ctx, addTagRelList); err != nil {
return err
}
}
if len(enableTagRelList) > 0 {
if err = ts.tagRelRepo.EnableTagRelByIDs(ctx, enableTagRelList, defaultTagRelStatus == entity.TagRelStatusHide); err != nil {
return err
}
}
err = ts.RefreshTagQuestionCount(ctx, needRefreshTagIDs)
if err != nil {
log.Error(err)
}
return nil
}