| package model
|
|
|
| import (
|
| "log"
|
| "os"
|
| "time"
|
|
|
| "golang.org/x/crypto/bcrypt"
|
| "gorm.io/gorm"
|
| )
|
|
|
|
|
| type User struct {
|
| ID uint `gorm:"primaryKey" json:"id"`
|
| Username string `gorm:"uniqueIndex;size:50;not null" json:"username"`
|
| PasswordHash string `gorm:"size:255;not null" json:"-"`
|
| CreatedAt time.Time `json:"created_at"`
|
| UpdatedAt time.Time `json:"updated_at"`
|
| }
|
|
|
|
|
| type UserSession struct {
|
| ID uint `gorm:"primaryKey" json:"id"`
|
| UserID uint `gorm:"not null;index" json:"user_id"`
|
| User User `gorm:"foreignKey:UserID;constraint:OnDelete:CASCADE" json:"-"`
|
| TokenHash string `gorm:"uniqueIndex;size:255;not null" json:"-"`
|
| ExpiresAt time.Time `gorm:"not null;index" json:"expires_at"`
|
| CreatedAt time.Time `json:"created_at"`
|
| }
|
|
|
|
|
| func (u *User) SetPassword(password string) error {
|
| hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
| if err != nil {
|
| return err
|
| }
|
| u.PasswordHash = string(hash)
|
| return nil
|
| }
|
|
|
|
|
| func (u *User) CheckPassword(password string) bool {
|
| err := bcrypt.CompareHashAndPassword([]byte(u.PasswordHash), []byte(password))
|
| return err == nil
|
| }
|
|
|
|
|
| func (User) TableName() string {
|
| return "users"
|
| }
|
|
|
|
|
| func (UserSession) TableName() string {
|
| return "user_sessions"
|
| }
|
|
|
|
|
| func CreateDefaultAdmin(db *gorm.DB) error {
|
| username := os.Getenv("DEFAULT_ADMIN_USERNAME")
|
| if username == "" {
|
| username = "admin"
|
| }
|
|
|
| password := os.Getenv("DEFAULT_ADMIN_PASSWORD")
|
| if password == "" {
|
| password = "changeme123"
|
| }
|
|
|
|
|
| var existingUser User
|
| result := db.Where("username = ?", username).First(&existingUser)
|
| if result.Error == nil {
|
|
|
| log.Printf("Default admin user '%s' already exists", username)
|
| return nil
|
| }
|
|
|
|
|
| user := &User{
|
| Username: username,
|
| }
|
| if err := user.SetPassword(password); err != nil {
|
| return err
|
| }
|
|
|
| if err := db.Create(user).Error; err != nil {
|
| return err
|
| }
|
|
|
| log.Printf("Default admin user '%s' created successfully", username)
|
| return nil
|
| } |