mirror of https://gitee.com/answerdev/answer.git
refactor: activity timeline extract user info and comment function
This commit is contained in:
parent
60d6e18cd4
commit
dbc316c40d
|
@ -39,6 +39,7 @@ type ActObjectTimeline struct {
|
||||||
ObjectType string `json:"object_type"`
|
ObjectType string `json:"object_type"`
|
||||||
Cancelled bool `json:"cancelled"`
|
Cancelled bool `json:"cancelled"`
|
||||||
CancelledAt int64 `json:"cancelled_at"`
|
CancelledAt int64 `json:"cancelled_at"`
|
||||||
|
UserID string `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ActObjectInfo act object info
|
// ActObjectInfo act object info
|
||||||
|
|
|
@ -69,22 +69,10 @@ func (as *ActivityService) GetObjectTimeline(ctx context.Context, req *schema.Ge
|
||||||
Timeline: make([]*schema.ActObjectTimeline, 0),
|
Timeline: make([]*schema.ActObjectTimeline, 0),
|
||||||
}
|
}
|
||||||
|
|
||||||
objInfo, err := as.objectInfoService.GetInfo(ctx, req.ObjectID)
|
resp.ObjectInfo, err = as.getTimelineMainObjInfo(ctx, req.ObjectID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
resp.ObjectInfo.Title = objInfo.Title
|
|
||||||
if objInfo.ObjectType == constant.TagObjectType {
|
|
||||||
tag, exist, _ := as.tagCommonService.GetTagByID(ctx, objInfo.TagID)
|
|
||||||
if exist {
|
|
||||||
resp.ObjectInfo.Title = tag.SlugName
|
|
||||||
resp.ObjectInfo.MainTagSlugName = tag.MainTagSlugName
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
resp.ObjectInfo.ObjectType = objInfo.ObjectType
|
|
||||||
resp.ObjectInfo.QuestionID = objInfo.QuestionID
|
|
||||||
resp.ObjectInfo.AnswerID = objInfo.AnswerID
|
|
||||||
|
|
||||||
activityList, err := as.activityRepo.GetObjectAllActivity(ctx, req.ObjectID, req.ShowVote)
|
activityList, err := as.activityRepo.GetObjectAllActivity(ctx, req.ObjectID, req.ShowVote)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -106,56 +94,111 @@ func (as *ActivityService) GetObjectTimeline(ctx context.Context, req *schema.Ge
|
||||||
// database save activity type is number, change to activity type string is like "question.asked".
|
// database save activity type is number, change to activity type string is like "question.asked".
|
||||||
// so we need to cut the front part of '.'
|
// so we need to cut the front part of '.'
|
||||||
_, item.ActivityType, _ = strings.Cut(config.ID2KeyMapping[act.ActivityType], ".")
|
_, item.ActivityType, _ = strings.Cut(config.ID2KeyMapping[act.ActivityType], ".")
|
||||||
|
// format activity type string to show
|
||||||
isHidden, formattedActivityType := formatActivity(item.ActivityType)
|
if isHidden, formattedActivityType := formatActivity(item.ActivityType); isHidden {
|
||||||
if isHidden {
|
|
||||||
continue
|
continue
|
||||||
}
|
} else {
|
||||||
item.ActivityType = formattedActivityType
|
item.ActivityType = formattedActivityType
|
||||||
|
}
|
||||||
|
|
||||||
// if activity is down vote, only admin can see who does it.
|
// if activity is down vote, only admin can see who does it.
|
||||||
if item.ActivityType == constant.ActDownVote && !req.IsAdmin {
|
if item.ActivityType == constant.ActDownVote && !req.IsAdmin {
|
||||||
item.Username = "N/A"
|
item.Username = "N/A"
|
||||||
item.UserDisplayName = "N/A"
|
item.UserDisplayName = "N/A"
|
||||||
} else {
|
} else {
|
||||||
// get user info
|
item.UserID = act.UserID
|
||||||
userBasicInfo, exist, err := as.userCommon.GetUserBasicInfoByID(ctx, act.UserID)
|
}
|
||||||
|
|
||||||
|
item.Comment = as.getTimelineActivityComment(ctx, item.ObjectID, item.ObjectType, item.ActivityType, item.RevisionID)
|
||||||
|
resp.Timeline = append(resp.Timeline, item)
|
||||||
|
}
|
||||||
|
as.formatTimelineUserInfo(ctx, resp.Timeline)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (as *ActivityService) getTimelineMainObjInfo(ctx context.Context, objectID string) (
|
||||||
|
resp *schema.ActObjectInfo, err error) {
|
||||||
|
resp = &schema.ActObjectInfo{}
|
||||||
|
objInfo, err := as.objectInfoService.GetInfo(ctx, objectID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
resp.Title = objInfo.Title
|
||||||
|
if objInfo.ObjectType == constant.TagObjectType {
|
||||||
|
tag, exist, _ := as.tagCommonService.GetTagByID(ctx, objInfo.TagID)
|
||||||
if exist {
|
if exist {
|
||||||
item.Username = userBasicInfo.Username
|
resp.Title = tag.SlugName
|
||||||
item.UserDisplayName = userBasicInfo.DisplayName
|
resp.MainTagSlugName = tag.MainTagSlugName
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
resp.ObjectType = objInfo.ObjectType
|
||||||
|
resp.QuestionID = objInfo.QuestionID
|
||||||
|
resp.AnswerID = objInfo.AnswerID
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
if item.ObjectType == constant.CommentObjectType {
|
func (as *ActivityService) getTimelineActivityComment(ctx context.Context, objectID, objectType,
|
||||||
comment, err := as.commentCommonService.GetComment(ctx, item.ObjectID)
|
activityType, revisionID string) (comment string) {
|
||||||
|
if objectType == constant.CommentObjectType {
|
||||||
|
commentInfo, err := as.commentCommonService.GetComment(ctx, objectID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
} else {
|
} else {
|
||||||
item.Comment = comment.ParsedText
|
return commentInfo.ParsedText
|
||||||
}
|
}
|
||||||
} else if item.ActivityType == constant.ActEdited {
|
return
|
||||||
revision, err := as.revisionService.GetRevision(ctx, item.RevisionID)
|
}
|
||||||
|
|
||||||
|
if activityType == constant.ActEdited {
|
||||||
|
revision, err := as.revisionService.GetRevision(ctx, revisionID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
|
} else {
|
||||||
|
return revision.Log
|
||||||
}
|
}
|
||||||
item.Comment = revision.Log
|
return
|
||||||
} else if item.ActivityType == constant.ActClosed {
|
}
|
||||||
metaInfo, err := as.metaService.GetMetaByObjectIdAndKey(ctx, item.ObjectID, entity.QuestionCloseReasonKey)
|
if activityType == constant.ActClosed {
|
||||||
|
// only question can be closed
|
||||||
|
metaInfo, err := as.metaService.GetMetaByObjectIdAndKey(ctx, objectID, entity.QuestionCloseReasonKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
} else {
|
} else {
|
||||||
closeMsg := &schema.CloseQuestionMeta{}
|
closeMsg := &schema.CloseQuestionMeta{}
|
||||||
if err := json.Unmarshal([]byte(metaInfo.Value), closeMsg); err != nil {
|
if err := json.Unmarshal([]byte(metaInfo.Value), closeMsg); err != nil {
|
||||||
item.Comment = closeMsg.CloseMsg
|
return closeMsg.CloseMsg
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
resp.Timeline = append(resp.Timeline, item)
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (as *ActivityService) formatTimelineUserInfo(ctx context.Context, timeline []*schema.ActObjectTimeline) {
|
||||||
|
userExist := make(map[string]bool)
|
||||||
|
userIDs := make([]string, 0)
|
||||||
|
for _, info := range timeline {
|
||||||
|
if len(info.UserID) == 0 || userExist[info.UserID] {
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
userIDs = append(userIDs, info.UserID)
|
||||||
|
}
|
||||||
|
if len(userIDs) == 0 {
|
||||||
return
|
return
|
||||||
|
}
|
||||||
|
userInfoMapping, err := as.userCommon.BatchUserBasicInfoByID(ctx, userIDs)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, info := range timeline {
|
||||||
|
if len(info.UserID) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if userInfo, ok := userInfoMapping[info.UserID]; ok {
|
||||||
|
info.Username = userInfo.Username
|
||||||
|
info.UserDisplayName = userInfo.DisplayName
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetObjectTimelineDetail get object timeline
|
// GetObjectTimelineDetail get object timeline
|
||||||
|
|
Loading…
Reference in New Issue