in internal/service/question_common/question.go [254:362]
func (qs *QuestionCommon) Info(ctx context.Context, questionID string, loginUserID string) (resp *schema.QuestionInfoResp, err error) {
questionInfo, has, err := qs.questionRepo.GetQuestion(ctx, questionID)
if err != nil {
return resp, err
}
questionInfo.ID = uid.DeShortID(questionInfo.ID)
if !has {
return resp, errors.NotFound(reason.QuestionNotFound)
}
resp = qs.ShowFormat(ctx, questionInfo)
if resp.Status == entity.QuestionStatusClosed {
metaInfo, err := qs.metaCommonService.GetMetaByObjectIdAndKey(ctx, questionInfo.ID, entity.QuestionCloseReasonKey)
if err != nil {
log.Error(err)
} else {
closeMsg := &schema.CloseQuestionMeta{}
err = json.Unmarshal([]byte(metaInfo.Value), closeMsg)
if err != nil {
log.Error("json.Unmarshal CloseQuestionMeta error", err.Error())
} else {
cfg, err := qs.configService.GetConfigByID(ctx, closeMsg.CloseType)
if err != nil {
log.Error("json.Unmarshal QuestionCloseJson error", err.Error())
} else {
reasonItem := &schema.ReasonItem{}
_ = json.Unmarshal(cfg.GetByteValue(), reasonItem)
reasonItem.Translate(cfg.Key, handler.GetLangByCtx(ctx))
operation := &schema.Operation{}
operation.Type = reasonItem.Name
operation.Description = reasonItem.Description
operation.Msg = closeMsg.CloseMsg
operation.Time = metaInfo.CreatedAt.Unix()
operation.Level = schema.OperationLevelInfo
resp.Operation = operation
}
}
}
}
if resp.Status != entity.QuestionStatusDeleted {
if resp.Tags, err = qs.tagCommon.GetObjectTag(ctx, questionID); err != nil {
return resp, err
}
} else {
revisionInfo, exist, err := qs.revisionRepo.GetLastRevisionByObjectID(ctx, questionID)
if err != nil {
log.Errorf("get revision error %s", err)
}
if exist {
questionWithTagsRevision := &entity.QuestionWithTagsRevision{}
if err = json.Unmarshal([]byte(revisionInfo.Content), questionWithTagsRevision); err != nil {
log.Errorf("revision parsing error %s", err)
return resp, nil
}
for _, tag := range questionWithTagsRevision.Tags {
resp.Tags = append(resp.Tags, &schema.TagResp{
ID: tag.ID,
SlugName: tag.SlugName,
DisplayName: tag.DisplayName,
MainTagSlugName: tag.MainTagSlugName,
Recommend: tag.Recommend,
Reserved: tag.Reserved,
})
}
}
}
userIds := make([]string, 0)
if checker.IsNotZeroString(questionInfo.UserID) {
userIds = append(userIds, questionInfo.UserID)
}
if checker.IsNotZeroString(questionInfo.LastEditUserID) {
userIds = append(userIds, questionInfo.LastEditUserID)
}
if checker.IsNotZeroString(resp.LastAnsweredUserID) {
userIds = append(userIds, resp.LastAnsweredUserID)
}
userInfoMap, err := qs.userCommon.BatchUserBasicInfoByID(ctx, userIds)
if err != nil {
return resp, err
}
resp.UserInfo = userInfoMap[questionInfo.UserID]
resp.UpdateUserInfo = userInfoMap[questionInfo.LastEditUserID]
resp.LastAnsweredUserInfo = userInfoMap[resp.LastAnsweredUserID]
if len(loginUserID) == 0 {
return resp, nil
}
resp.VoteStatus = qs.voteRepo.GetVoteStatus(ctx, questionID, loginUserID)
resp.IsFollowed, _ = qs.followCommon.IsFollowed(ctx, loginUserID, questionID)
ids, err := qs.AnswerCommon.SearchAnswerIDs(ctx, loginUserID, questionInfo.ID)
if err != nil {
log.Error("AnswerFunc.SearchAnswerIDs", err)
}
resp.Answered = len(ids) > 0
if resp.Answered {
resp.FirstAnswerId = ids[0]
}
collectedMap, err := qs.collectionCommon.SearchObjectCollected(ctx, loginUserID, []string{questionInfo.ID})
if err != nil {
return nil, err
}
if len(collectedMap) > 0 {
resp.Collected = true
}
return resp, nil
}