Auto reg user, event map

Signed-off-by: Asai Neko <sugar@sne.moe>
This commit is contained in:
2025-12-25 21:30:26 +08:00
parent c7cefb3898
commit b30d9db69d
10 changed files with 116 additions and 41 deletions

View File

@@ -1,14 +1,15 @@
package auth
import (
"net/http"
"nixcn-cms/data"
"nixcn-cms/internal/cryptography"
"nixcn-cms/pkgs/email"
"nixcn-cms/pkgs/magiclink"
"nixcn-cms/pkgs/turnstile"
"github.com/google/uuid"
log "github.com/sirupsen/logrus"
"gorm.io/gorm"
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
@@ -74,14 +75,41 @@ func VerifyMagicLink(c *gin.Context) {
return
}
// Generate jwt
userInfo := new(data.User)
err := userInfo.GetByEmail(email)
// Verify if user exists
user := new(data.User)
err := user.GetByEmail(email)
if err != nil {
c.JSON(http.StatusUnauthorized, gin.H{"status": "user not found"})
if err == gorm.ErrRecordNotFound {
// Create user
newUUID, err := uuid.NewUUID()
if err != nil {
c.JSON(500, gin.H{"status": "internal server error"})
return
}
newUserId, err := uuid.NewUUID()
if err != nil {
c.JSON(500, gin.H{"status": "internal server error"})
return
}
user.UUID = newUUID
user.UserId = newUserId
user.Email = email
user.Type = "Normal"
user.PermissionLevel = 10
if err := user.Create(); err != nil {
c.JSON(500, gin.H{"status": "internal server error"})
return
}
} else {
c.JSON(500, gin.H{"status": "internal server error"})
return
}
}
// Generate jwt
JwtTool := cryptography.Token{
UserID: userInfo.UserId,
UserID: user.UserId,
Application: viper.GetString("server.application"),
}
accessToken, refreshToken, err := JwtTool.IssueTokens()

View File

@@ -1,7 +1,6 @@
package auth
import (
"net/http"
"nixcn-cms/internal/cryptography"
"github.com/gin-gonic/gin"
@@ -14,7 +13,7 @@ func Refresh(c *gin.Context) {
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request"})
c.JSON(400, gin.H{"error": "invalid request"})
return
}
@@ -24,11 +23,11 @@ func Refresh(c *gin.Context) {
access, err := JwtTool.RefreshAccessToken(req.RefreshToken)
if err != nil {
c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid refresh token"})
c.JSON(401, gin.H{"error": "invalid refresh token"})
return
}
c.JSON(http.StatusOK, gin.H{
c.JSON(200, gin.H{
"access_token": access,
})
}

View File

@@ -1,7 +1,6 @@
package user
import (
"net/http"
"nixcn-cms/data"
"time"
@@ -9,17 +8,34 @@ import (
"github.com/google/uuid"
)
func Checkin(ctx *gin.Context) {
func Checkin(c *gin.Context) {
data := new(data.User)
userId, ok := ctx.Get("user_id")
userId, ok := c.Get("user_id")
if !ok {
ctx.JSON(http.StatusUnauthorized, gin.H{
c.JSON(401, gin.H{
"status": "unauthorized",
})
return
}
data.UpdateCheckin(userId.(uuid.UUID), time.Now())
ctx.JSON(http.StatusOK, gin.H{
// Get event id from query
eventIdOrig, ok := c.GetQuery("event_id")
if !ok {
c.JSON(403, gin.H{
"status": "undefinded event id",
})
return
}
// Parse event id to uuid
eventId, err := uuid.Parse(eventIdOrig)
if err != nil {
c.JSON(500, gin.H{
"status": "error parsing string to uuid",
})
}
data.UpdateCheckin(userId.(uuid.UUID), eventId, time.Now())
c.JSON(200, gin.H{
"status": "success",
})
}

View File

@@ -1,8 +1,8 @@
package user
import (
"net/http"
"nixcn-cms/data"
"time"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
@@ -12,30 +12,35 @@ func Info(c *gin.Context) {
data := new(data.User)
userId, ok := c.Get("user_id")
if !ok {
c.JSON(http.StatusUnauthorized, gin.H{
c.JSON(403, gin.H{
"status": "user not found",
})
return
}
err := data.GetByUserId(userId.(uuid.UUID))
if err != nil {
c.JSON(http.StatusUnauthorized, gin.H{
c.JSON(403, gin.H{
"status": "user not found",
})
return
}
var checkinTime any = nil
if !data.Checkin.IsZero() {
checkinTime = data.Checkin
// Set time nil if time is zero
for k, v := range data.Checkin {
if t, ok := v.(time.Time); ok && t.IsZero() {
data.Checkin[k] = nil
}
}
c.JSON(http.StatusOK, gin.H{
c.JSON(200, gin.H{
"user_id": data.UserId,
"email": data.Email,
"type": data.Type,
"nickname": data.Nickname,
"subtitle": data.Subtitle,
"avatar": data.Avatar,
"checkin": checkinTime,
"checkin": data.Checkin,
"joined_event": data.JoinedEvent,
"permission_level": data.PermissionLevel,
})
}

View File

@@ -1,7 +1,6 @@
package user
import (
"net/http"
"nixcn-cms/data"
"github.com/gin-gonic/gin"
@@ -16,7 +15,7 @@ func Update(c *gin.Context) {
user := new(data.User)
userId, ok := c.Get("user_id")
if !ok {
c.JSON(http.StatusUnauthorized, gin.H{
c.JSON(403, gin.H{
"status": "can not found user id",
})
return
@@ -27,7 +26,7 @@ func Update(c *gin.Context) {
// Reject permission 0 user
if user.PermissionLevel == 0 {
c.JSON(http.StatusForbidden, gin.H{
c.JSON(403, gin.H{
"status": "premission denied",
})
return
@@ -41,7 +40,7 @@ func Update(c *gin.Context) {
// Update user info
user.UpdateByUserID(userId.(uuid.UUID), &ReqInfo)
c.JSON(http.StatusOK, gin.H{
c.JSON(200, gin.H{
"status": "success",
})
}