Add user CRUD actions, add permission level for user

Signed-off-by: Asai Neko <sugar@sne.moe>
This commit is contained in:
2025-12-25 16:40:26 +08:00
parent 5b571f7a84
commit 9135edbd60
3 changed files with 97 additions and 24 deletions

View File

@@ -4,18 +4,21 @@ import (
"time" "time"
"github.com/google/uuid" "github.com/google/uuid"
"gorm.io/gorm"
"gorm.io/gorm/clause"
) )
type User struct { type User struct {
Id uint `json:"id" gorm:"primarykey;autoincrement"` Id uint `json:"id" gorm:"primarykey;autoincrement"`
UUID uuid.UUID `json:"uuid" gorm:"type:uuid;uniqueindex;not null"` UUID uuid.UUID `json:"uuid" gorm:"type:uuid;uniqueindex;not null"`
UserId uuid.UUID `json:"user_id" gorm:"type:uuid;uniqueindex;not null"` UserId uuid.UUID `json:"user_id" gorm:"type:uuid;uniqueindex;not null"`
Email string `json:"email" gorm:"type:varchar(255);uniqueindex;not null"` Email string `json:"email" gorm:"type:varchar(255);uniqueindex;not null"`
Type string `json:"type" gorm:"type:varchar(32);index;not null"` Type string `json:"type" gorm:"type:varchar(32);index;not null"`
Nickname string `json:"nickname"` Nickname string `json:"nickname"`
Subtitle string `json:"subtitle"` Subtitle string `json:"subtitle"`
Avatar string `json:"avatar"` Avatar string `json:"avatar"`
Checkin time.Time `json:"checkin" gorm:"index"` Checkin time.Time `json:"checkin" gorm:"index"`
PermissionLevel uint `json:"permission_level" gorm:"default:0;not null"`
} }
func (self *User) GetByEmail(email string) error { func (self *User) GetByEmail(email string) error {
@@ -32,11 +35,80 @@ func (self *User) GetByUserId(userId uuid.UUID) error {
return nil return nil
} }
func (self *User) SetCheckinState(userId uuid.UUID, time time.Time) error { func (self *User) UpdateCheckin(userId uuid.UUID, time time.Time) error {
if err := Database.Where("user_id = ?", userId).First(&self).Error; err != nil { return Database.Transaction(func(tx *gorm.DB) error {
return err if err := tx.
} Clauses(clause.Locking{Strength: "UPDATE"}).
self.Checkin = time Where("user_id = ?", userId).
Database.Save(&self) First(self).Error; err != nil {
return nil return err // if error then rollback
}
self.Checkin = time
if err := tx.Save(self).Error; err != nil {
return err // rollback
}
return nil // commit
})
}
func (self *User) Create() error {
return Database.Transaction(func(tx *gorm.DB) error {
if self.UUID == uuid.Nil {
self.UUID = uuid.New()
}
if self.UserId == uuid.Nil {
self.UserId = uuid.New()
}
if err := tx.Create(self).Error; err != nil {
return err
}
return nil
})
}
type UserUpdateInput struct {
Email *string
Nickname *string
Subtitle *string
Avatar *string
Type *string
}
func (self *User) UpdateByUserID(userID uuid.UUID, in *UserUpdateInput) error {
return Database.Transaction(func(tx *gorm.DB) error {
if err := tx.
Where("user_id = ?", userID).
First(self).Error; err != nil {
return err
}
updates := map[string]any{}
if in.Email != nil {
updates["email"] = *in.Email
}
if in.Nickname != nil {
updates["nickname"] = *in.Nickname
}
if in.Subtitle != nil {
updates["subtitle"] = *in.Subtitle
}
if in.Avatar != nil {
updates["avatar"] = *in.Avatar
}
if in.Type != nil {
updates["type"] = *in.Type
}
if len(updates) == 0 {
return nil
}
return tx.Model(self).Updates(updates).Error
})
} }

View File

@@ -18,7 +18,7 @@ func Checkin(ctx *gin.Context) {
}) })
return return
} }
data.SetCheckinState(userId.(uuid.UUID), time.Now()) data.UpdateCheckin(userId.(uuid.UUID), time.Now())
ctx.JSON(http.StatusOK, gin.H{ ctx.JSON(http.StatusOK, gin.H{
"status": "success", "status": "success",
}) })

View File

@@ -29,12 +29,13 @@ func UserInfo(c *gin.Context) {
checkinTime = data.Checkin checkinTime = data.Checkin
} }
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"user_id": data.UserId, "user_id": data.UserId,
"email": data.Email, "email": data.Email,
"type": data.Type, "type": data.Type,
"nickname": data.Nickname, "nickname": data.Nickname,
"subtitle": data.Subtitle, "subtitle": data.Subtitle,
"avatar": data.Avatar, "avatar": data.Avatar,
"checkin": checkinTime, "checkin": checkinTime,
"permission_level": data.PermissionLevel,
}) })
} }