Use utils.HttpResponse/Abort to replace c.JSON/Abort
All checks were successful
Build Backend (NixCN CMS) TeamCity build finished
Build Frontend (NixCN CMS) TeamCity build finished

Signed-off-by: Asai Neko <sugar@sne.moe>
This commit is contained in:
2026-01-06 12:49:55 +08:00
parent 70846e0d1e
commit 6a9c013799
14 changed files with 203 additions and 116 deletions

View File

@@ -5,6 +5,7 @@ import (
"nixcn-cms/pkgs/authcode"
"nixcn-cms/pkgs/email"
"nixcn-cms/pkgs/turnstile"
"nixcn-cms/utils"
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
@@ -22,26 +23,28 @@ func Magic(c *gin.Context) {
// Parse request
var req MagicRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(400, gin.H{"error": "invalid request"})
utils.HttpResponse(c, 400, "", "invalid request")
return
}
// Cloudflare turnstile
ok, err := turnstile.VerifyTurnstile(req.TurnstileToken, c.ClientIP())
if err != nil || !ok {
c.JSON(403, gin.H{"error": "turnstile failed"})
utils.HttpResponse(c, 403, "", "turnstile failed")
return
}
code, err := authcode.NewAuthCode(req.ClientId, req.Email)
if err != nil {
c.JSON(500, gin.H{"status": "code gen failed"})
utils.HttpResponse(c, 500, "", "code gen failed")
return
}
externalUrl := viper.GetString("server.external_url")
url, err := url.Parse(externalUrl)
if err != nil {
c.JSON(500, gin.H{"status": "invalid external url"})
utils.HttpResponse(c, 500, "", "invalid external url")
return
}
url.Path = "/api/v1/auth/redirect"
@@ -54,13 +57,17 @@ func Magic(c *gin.Context) {
debugMode := viper.GetBool("server.debug_mode")
if debugMode {
c.JSON(200, gin.H{"status": "magiclink sent", "uri": url.String()})
uriData := struct {
Uri string `json:"uri"`
}{url.String()}
utils.HttpResponse(c, 200, "", "magiclink sent", uriData)
return
} else {
// Send email using resend
emailClient, err := email.NewSMTPClient()
if err != nil {
c.JSON(500, gin.H{"status": "invalid email config"})
utils.HttpResponse(c, 500, "", "invalid email config")
return
}
emailClient.Send(
@@ -70,5 +77,5 @@ func Magic(c *gin.Context) {
)
}
c.JSON(200, gin.H{"status": "magic link sent"})
utils.HttpResponse(c, 200, "", "magic link sent")
}

View File

@@ -4,6 +4,7 @@ import (
"net/url"
"nixcn-cms/data"
"nixcn-cms/pkgs/authcode"
"nixcn-cms/utils"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
@@ -13,19 +14,19 @@ import (
func Redirect(c *gin.Context) {
clientId := c.Query("client_id")
if clientId == "" {
c.JSON(400, gin.H{"status": "invalid request"})
utils.HttpResponse(c, 400, "", "invalid request")
return
}
redirectUri := c.Query("redirect_uri")
if redirectUri == "" {
c.JSON(400, gin.H{"status": "invalid request"})
utils.HttpResponse(c, 400, "", "invalid request")
return
}
state := c.Query("state")
if state == "" {
c.JSON(400, gin.H{"status": "invalid request"})
utils.HttpResponse(c, 400, "", "invalid request")
return
}
@@ -33,32 +34,32 @@ func Redirect(c *gin.Context) {
if code == "" {
userIdOrig, ok := c.Get("user_id")
if !ok || userIdOrig == "" {
c.JSON(401, gin.H{"status": "unauthorized"})
utils.HttpResponse(c, 401, "", "unauthorized")
return
}
userId, err := uuid.Parse(userIdOrig.(string))
if err != nil {
c.JSON(500, gin.H{"status": "failed to parse uuid"})
utils.HttpResponse(c, 500, "", "failed to parse uuid")
return
}
userData := new(data.User)
user, err := userData.GetByUserId(userId)
if err != nil {
c.JSON(500, gin.H{"status": "failed to get user id"})
utils.HttpResponse(c, 500, "", "failed to get user id")
return
}
code, err := authcode.NewAuthCode(clientId, user.Email)
if err != nil {
c.JSON(500, gin.H{"status": "code gen failed"})
utils.HttpResponse(c, 500, "", "code gen failed")
return
}
url, err := url.Parse(redirectUri)
if err != nil {
c.JSON(400, gin.H{"status": "invalid redirect uri"})
utils.HttpResponse(c, 400, "", "invalid redirect uri")
return
}
query := url.Query()
@@ -71,7 +72,7 @@ func Redirect(c *gin.Context) {
// Verify email token
authCode, ok := authcode.VerifyAuthCode(code)
if !ok {
c.JSON(403, gin.H{"status": "invalid or expired token"})
utils.HttpResponse(c, 403, "", "invalid or expired token")
return
}
@@ -85,13 +86,14 @@ func Redirect(c *gin.Context) {
user.UUID = uuid.New()
user.UserId = uuid.New()
user.Email = authCode.Email
user.Username = user.UserId.String()
user.PermissionLevel = 10
if err := user.Create(); err != nil {
c.JSON(500, gin.H{"status": "internal server error"})
utils.HttpResponse(c, 500, "", "internal server error")
return
}
} else {
c.JSON(500, gin.H{"status": "internal server error"})
utils.HttpResponse(c, 500, "", "internal server error")
return
}
}
@@ -99,25 +101,25 @@ func Redirect(c *gin.Context) {
clientData := new(data.Client)
client, err := clientData.GetClientByClientId(clientId)
if err != nil {
c.JSON(400, gin.H{"status": "client not found"})
utils.HttpResponse(c, 400, "", "client not found")
return
}
err = client.ValidateRedirectURI(redirectUri)
if err != nil {
c.JSON(400, gin.H{"status": "redirect uri not match"})
utils.HttpResponse(c, 400, "", "redirect uri not match")
return
}
newCode, err := authcode.NewAuthCode(clientId, authCode.Email)
if err != nil {
c.JSON(500, gin.H{"status": "internal server error"})
utils.HttpResponse(c, 500, "", "internal server error")
return
}
url, err := url.Parse(redirectUri)
if err != nil {
c.JSON(400, gin.H{"status": "invalid redirect uri"})
utils.HttpResponse(c, 400, "", "invalid redirect uri")
return
}
query := url.Query()

View File

@@ -2,6 +2,7 @@ package auth
import (
"nixcn-cms/pkgs/authtoken"
"nixcn-cms/utils"
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
@@ -13,7 +14,7 @@ func Refresh(c *gin.Context) {
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(400, gin.H{"status": "invalid request"})
utils.HttpResponse(c, 400, "", "invalid request")
return
}
@@ -21,20 +22,22 @@ func Refresh(c *gin.Context) {
Application: viper.GetString("server.application"),
}
access, err := JwtTool.RefreshAccessToken(req.RefreshToken)
accessToken, err := JwtTool.RefreshAccessToken(req.RefreshToken)
if err != nil {
c.JSON(401, gin.H{"status": "invalid refresh token"})
utils.HttpResponse(c, 401, "", "invalid refresh token")
return
}
refresh, err := JwtTool.RenewRefreshToken(req.RefreshToken)
refreshToken, err := JwtTool.RenewRefreshToken(req.RefreshToken)
if err != nil {
c.JSON(500, gin.H{"statis": "error renew refresh token"})
utils.HttpResponse(c, 500, "", "error renew refresh token")
return
}
c.JSON(200, gin.H{
"access_token": access,
"refresh_token": refresh,
})
tokenResp := struct {
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token"`
}{accessToken, refreshToken}
utils.HttpResponse(c, 200, "", "success", tokenResp)
}

View File

@@ -4,6 +4,7 @@ import (
"nixcn-cms/data"
"nixcn-cms/pkgs/authcode"
"nixcn-cms/pkgs/authtoken"
"nixcn-cms/utils"
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
@@ -18,20 +19,20 @@ func Token(c *gin.Context) {
err := c.ShouldBindJSON(&req)
if err != nil {
c.JSON(400, gin.H{"status": "invalid request"})
utils.HttpResponse(c, 400, "", "invalid request")
return
}
authCode, ok := authcode.VerifyAuthCode(req.Code)
if !ok {
c.JSON(403, gin.H{"status": "invalid or expired token"})
utils.HttpResponse(c, 403, "", "invalid or expired token")
return
}
userData := new(data.User)
user, err := userData.GetByEmail(authCode.Email)
if err != nil {
c.JSON(500, gin.H{"status": "internal server error"})
utils.HttpResponse(c, 500, "", "internal server error")
return
}
@@ -41,12 +42,14 @@ func Token(c *gin.Context) {
}
accessToken, refreshToken, err := JwtTool.IssueTokens(authCode.ClientId, user.UserId)
if err != nil {
c.JSON(500, gin.H{"status": "error generating tokens"})
utils.HttpResponse(c, 500, "", "error generating tokens")
return
}
c.JSON(200, gin.H{
"access_token": accessToken,
"refresh_token": refreshToken,
})
tokenResp := struct {
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token"`
}{accessToken, refreshToken}
utils.HttpResponse(c, 200, "", "success", tokenResp)
}