in internal/controller/template_controller.go [222:300]
func (tc *TemplateController) QuestionInfoRedirect(ctx *gin.Context, siteInfo *schema.TemplateSiteInfoResp, correctTitle bool) (jump bool, url string) {
questionID := ctx.Param("id")
title := ctx.Param("title")
answerID := uid.DeShortID(title)
titleIsAnswerID := false
needChangeShortID := false
objectType, err := obj.GetObjectTypeStrByObjectID(answerID)
if err == nil && objectType == constant.AnswerObjectType {
titleIsAnswerID = true
}
siteSeo, err := tc.siteInfoService.GetSiteSeo(ctx)
if err != nil {
return false, ""
}
isShortID := uid.IsShortID(questionID)
if siteSeo.IsShortLink() {
if !isShortID {
questionID = uid.EnShortID(questionID)
needChangeShortID = true
}
if titleIsAnswerID {
answerID = uid.EnShortID(answerID)
}
} else {
if isShortID {
needChangeShortID = true
questionID = uid.DeShortID(questionID)
}
if titleIsAnswerID {
answerID = uid.DeShortID(answerID)
}
}
if _, err := tc.templateRenderController.AnswerDetail(ctx, answerID); err != nil {
answerID = ""
titleIsAnswerID = false
}
url = fmt.Sprintf("%s/questions/%s", siteInfo.General.SiteUrl, questionID)
if siteInfo.SiteSeo.Permalink == constant.PermalinkQuestionID || siteInfo.SiteSeo.Permalink == constant.PermalinkQuestionIDByShortID {
if len(ctx.Request.URL.Query()) > 0 {
url = fmt.Sprintf("%s?%s", url, ctx.Request.URL.RawQuery)
}
if needChangeShortID {
return true, url
}
//not have title
if titleIsAnswerID || len(title) == 0 {
return false, ""
}
return true, url
} else {
detail, err := tc.templateRenderController.QuestionDetail(ctx, questionID)
if err != nil {
tc.Page404(ctx)
return
}
url = fmt.Sprintf("%s/%s", url, htmltext.UrlTitle(detail.Title))
if titleIsAnswerID {
url = fmt.Sprintf("%s/%s", url, answerID)
}
if len(ctx.Request.URL.Query()) > 0 {
url = fmt.Sprintf("%s?%s", url, ctx.Request.URL.RawQuery)
}
//have title
if len(title) > 0 && !titleIsAnswerID && correctTitle {
if needChangeShortID {
return true, url
}
return false, ""
}
return true, url
}
}