package db import ( "errors" "farga/db/types" "farga/lib" "github.com/google/uuid" "gorm.io/gorm/clause" ) var ( UserNotFound = errors.New("No such user was found") IncorrectPassword = errors.New("Incorrect password") ) func (db *DB) NewUser(user *types.User) error { return db.Create(user).Error } // clause.Associations might be slow? idk func (db *DB) LoginUser(email string, password string) (*types.User, error) { var user types.User result := db.Where(&types.User{Email: email}).First(&user) if result.Error != nil { return nil, UserNotFound } valid, err := lib.ValidateHash(password, user.PasswordHash) if err != nil || !valid { return nil, IncorrectPassword } return &user, nil } // retrieves a user by their UUID. func (db *DB) User(id uuid.UUID) (*types.User, error) { var user types.User if err := db.Preload(clause.Associations).Where(&types.User{UUID_ID: types.UUID_ID{ID: id}}).First(&user).Error; err != nil { return nil, err } return &user, nil } // find a user by their handle. func (db *DB) UserHandle(handle string) (*types.User, error) { var user types.User if err := db.Preload(clause.Associations).Where(&types.User{Handle: handle}).First(&user).Error; err != nil { return nil, err } return &user, nil } // saves the hackatime secret of a user func (db *DB) SaveHackatimeToken(userID uuid.UUID, token string) error { var user = types.User{ UUID_ID: types.UUID_ID{ID: userID}, } return db.Model(&user).Where(&user).Update("hackatime_token", token).Error }