package model import ( "net/http" "opencatd-open/store" "time" "github.com/Sakurasan/to" "github.com/gin-gonic/gin" "github.com/google/uuid" ) type User struct { ID int64 `json:"id" gorm:"primaryKey;autoIncrement"` Name string `json:"name" gorm:"unique;index" validate:"max=12"` UserName string `json:"username" gorm:"unique;index" validate:"max=12"` Password string `json:"password" gorm:"not null;" validate:"min=8,max=20"` Role int `json:"role" gorm:"type:int;default:1"` // default user Status int `json:"status" gorm:"type:int;default:0"` // enabled 0, disabled 1 deleted 2 Nickname string `json:"nickname" gorm:"type:varchar(50)"` AvatarURL string `json:"avatar_url" gorm:"type:varchar(255)"` Email string `json:"email" gorm:"type:varchar(255);unique;index"` Quota int64 `json:"quota" gorm:"bigint;default:-1"` // default unlimited Token string `json:"token,omitempty"` Timezone string `json:"timezone" gorm:"type:varchar(50)"` Language string `json:"language" gorm:"type:varchar(50)"` CreatedAt time.Time `json:"created_at,omitempty" gorm:"autoCreateTime"` UpdatedAt time.Time `json:"updated_at,omitempty" gorm:"autoUpdateTime"` } func HandleUsers(c *gin.Context) { users, err := store.GetAllUsers() if err != nil { c.JSON(http.StatusOK, gin.H{ "error": err.Error(), }) } c.JSON(http.StatusOK, users) } func HandleAddUser(c *gin.Context) { var body User if err := c.BindJSON(&body); err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } if len(body.Name) == 0 { c.JSON(http.StatusOK, gin.H{"error": "invalid user name"}) return } if err := store.AddUser(body.Name, uuid.NewString()); err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } u, err := store.GetUserByName(body.Name) if err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, u) } func HandleDelUser(c *gin.Context) { id := to.Int(c.Param("id")) if id <= 1 { c.JSON(http.StatusOK, gin.H{"error": "invalid user id"}) return } if err := store.DeleteUser(uint(id)); err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"message": "ok"}) } func HandleResetUserToken(c *gin.Context) { id := to.Int(c.Param("id")) newtoken := c.Query("token") if newtoken == "" { newtoken = uuid.NewString() } if err := store.UpdateUser(uint(id), newtoken); err != nil { c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) return } u, err := store.GetUserByID(uint(id)) if err != nil { c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, u) } type Session struct { ID int64 `json:"id" gorm:"primaryKey;autoIncrement"` UserID int64 `json:"user_id" gorm:"index:idx_user_id"` Token string `json:"token" gorm:"type:varchar(64);uniqueIndex"` DeviceType string `json:"device_type" gorm:"type:varchar(100);default:''"` DeviceName string `json:"device_name" gorm:"type:varchar(100);default:''"` LastActiveAt time.Time `json:"last_active_at" gorm:"type:timestamp;default:CURRENT_TIMESTAMP"` LogoutAt time.Time `json:"logout_at" gorm:"type:timestamp;null"` CreatedAt time.Time `json:"created_at" gorm:"type:timestamp;not null;default:CURRENT_TIMESTAMP"` UpdatedAt time.Time `json:"updated_at" gorm:"type:timestamp;not null;default:CURRENT_TIMESTAMP;update:CURRENT_TIMESTAMP"` } func (Session) TableName() string { return "sessions" }