GetObjectTimeline get object timeline
(ctx context.Context, req *schema.GetObjectTimelineReq)
| 91 | |
| 92 | // GetObjectTimeline get object timeline |
| 93 | func (as *ActivityService) GetObjectTimeline(ctx context.Context, req *schema.GetObjectTimelineReq) ( |
| 94 | resp *schema.GetObjectTimelineResp, err error) { |
| 95 | if err = as.ensureTimelineObjectVisible(ctx, req.ObjectID, req.UserID, req.IsAdminModerator); err != nil { |
| 96 | return nil, err |
| 97 | } |
| 98 | |
| 99 | resp = &schema.GetObjectTimelineResp{ |
| 100 | ObjectInfo: &schema.ActObjectInfo{}, |
| 101 | Timeline: make([]*schema.ActObjectTimeline, 0), |
| 102 | } |
| 103 | |
| 104 | resp.ObjectInfo, err = as.getTimelineMainObjInfo(ctx, req.ObjectID) |
| 105 | if err != nil { |
| 106 | return nil, err |
| 107 | } |
| 108 | |
| 109 | activityList, err := as.activityRepo.GetObjectAllActivity(ctx, req.ObjectID, req.ShowVote) |
| 110 | if err != nil { |
| 111 | return nil, err |
| 112 | } |
| 113 | for _, act := range activityList { |
| 114 | item := &schema.ActObjectTimeline{ |
| 115 | ActivityID: act.ID, |
| 116 | RevisionID: converter.IntToString(act.RevisionID), |
| 117 | CreatedAt: act.CreatedAt.Unix(), |
| 118 | Cancelled: act.Cancelled == entity.ActivityCancelled, |
| 119 | ObjectID: act.ObjectID, |
| 120 | UserInfo: &schema.UserBasicInfo{}, |
| 121 | } |
| 122 | item.ObjectType, _ = obj.GetObjectTypeStrByObjectID(act.ObjectID) |
| 123 | if item.Cancelled { |
| 124 | item.CancelledAt = act.CancelledAt.Unix() |
| 125 | } |
| 126 | |
| 127 | if item.ObjectType == constant.QuestionObjectType || item.ObjectType == constant.AnswerObjectType { |
| 128 | if handler.GetEnableShortID(ctx) { |
| 129 | item.ObjectID = uid.EnShortID(act.ObjectID) |
| 130 | } |
| 131 | } |
| 132 | |
| 133 | cfg, err := as.configService.GetConfigByID(ctx, act.ActivityType) |
| 134 | if err != nil { |
| 135 | log.Errorf("fail to get config by id: %d, err: %v, act id is: %s", act.ActivityType, err, act.ID) |
| 136 | } else { |
| 137 | // database save activity type is number, change to activity type string is like "question.asked". |
| 138 | // so we need to cut the front part of '.', only need string like 'asked' |
| 139 | _, item.ActivityType, _ = strings.Cut(cfg.Key, ".") |
| 140 | // format activity type string to show |
| 141 | if isHidden, formattedActivityType := formatActivity(item.ActivityType); isHidden { |
| 142 | continue |
| 143 | } else { |
| 144 | item.ActivityType = formattedActivityType |
| 145 | } |
| 146 | } |
| 147 | |
| 148 | // if activity is down vote, only admin can see who does it. |
| 149 | if item.ActivityType == constant.ActDownVote && !req.IsAdmin { |
| 150 | item.UserInfo.Username = "N/A" |
nothing calls this directly
no test coverage detected