package db import ( "time" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" ) // User represents a user in the system type User struct { ID uint `gorm:"primarykey"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` Username string `gorm:"uniqueIndex;size:64"` Password string `gorm:"size:60"` // bcrypt hash Role string `gorm:"size:20;default:'user'"` // admin or user LastLogin time.Time `gorm:"type:datetime;default:CURRENT_TIMESTAMP"` } // BeforeCreate hook to hash password before saving func (u *User) BeforeCreate(tx *gorm.DB) error { hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost) if err != nil { return err } u.Password = string(hashedPassword) return nil } // BeforeUpdate hook to hash password before updating func (u *User) BeforeUpdate(tx *gorm.DB) error { if u.Password != "" { hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost) if err != nil { return err } u.Password = string(hashedPassword) } return nil } // CheckPassword verifies if the provided password matches the hash func (u *User) CheckPassword(password string) bool { err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password)) return err == nil }