in internal/repo/question/question_repo.go [395:457]
func (qr *questionRepo) GetQuestionPage(ctx context.Context, page, pageSize int,
tagIDs []string, userID, orderCond string, inDays int, showHidden, showPending bool) (
questionList []*entity.Question, total int64, err error) {
questionList = make([]*entity.Question, 0)
session := qr.data.DB.Context(ctx)
status := []int{entity.QuestionStatusAvailable}
if orderCond != "unanswered" {
status = append(status, entity.QuestionStatusClosed)
}
if showPending {
status = append(status, entity.QuestionStatusPending)
}
session.Select("question.*")
session.In("question.status", status)
if len(tagIDs) > 0 {
session.Join("LEFT", "tag_rel", "question.id = tag_rel.object_id")
session.In("tag_rel.tag_id", tagIDs)
session.And("tag_rel.status = ?", entity.TagRelStatusAvailable)
}
if len(userID) > 0 {
session.And("question.user_id = ?", userID)
if !showHidden {
session.And("question.show = ?", entity.QuestionShow)
}
} else {
session.And("question.show = ?", entity.QuestionShow)
}
if inDays > 0 {
session.And("question.created_at > ?", time.Now().AddDate(0, 0, -inDays))
}
switch orderCond {
case "newest":
session.OrderBy("question.pin desc,question.created_at DESC")
case "active":
if inDays == 0 {
session.And("question.created_at > ?", time.Now().AddDate(0, 0, -180))
}
session.And("question.post_update_time > ?", time.Now().AddDate(0, 0, -90))
session.OrderBy("question.pin desc,question.post_update_time DESC, question.updated_at DESC")
case "hot":
session.OrderBy("question.pin desc,question.hot_score DESC")
case "score":
session.OrderBy("question.pin desc,question.vote_count DESC, question.view_count DESC")
case "unanswered":
session.Where("question.answer_count = 0")
session.OrderBy("question.pin desc,question.created_at DESC")
case "frequent":
session.OrderBy("question.pin DESC, question.linked_count DESC, question.updated_at DESC")
}
session.GroupBy("question.id")
total, err = pager.Help(page, pageSize, &questionList, &entity.Question{}, session)
if err != nil {
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
}
if handler.GetEnableShortID(ctx) {
for _, item := range questionList {
item.ID = uid.EnShortID(item.ID)
}
}
return questionList, total, err
}