| | 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
|
| | } |