package models import ( "time" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" ) // User represents a user in the system type User struct { ID uint `json:"id" gorm:"primaryKey"` Username string `json:"username" gorm:"uniqueIndex;not null"` Email string `json:"email" gorm:"uniqueIndex;not null"` Password string `json:"-" gorm:"not null"` FirstName string `json:"firstName"` LastName string `json:"lastName"` Role string `json:"role" gorm:"default:'user'"` // 'user', 'agent', 'admin' Active bool `json:"active" gorm:"default:true"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } // BeforeSave is a GORM hook that hashes the password before saving func (u *User) BeforeSave(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 } // ComparePassword compares a plaintext password with the user's hashed password func (u *User) ComparePassword(password string) bool { err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password)) return err == nil } // ToSafeUser returns a user object without sensitive information func (u *User) ToSafeUser() SafeUser { return SafeUser{ ID: u.ID, Username: u.Username, Email: u.Email, FirstName: u.FirstName, LastName: u.LastName, Role: u.Role, Active: u.Active, CreatedAt: u.CreatedAt, UpdatedAt: u.UpdatedAt, } } // SafeUser represents user information that can be safely exposed to clients type SafeUser struct { ID uint `json:"id"` Username string `json:"username"` Email string `json:"email"` FirstName string `json:"firstName"` LastName string `json:"lastName"` Role string `json:"role"` Active bool `json:"active"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` }