80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
package db
|
|
|
|
import (
|
|
"me-fit/types"
|
|
"me-fit/utils"
|
|
|
|
"database/sql"
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
var (
|
|
ErrUserNotFound = errors.New("User not found")
|
|
)
|
|
|
|
type User struct {
|
|
Id uuid.UUID
|
|
Email string
|
|
EmailVerified bool
|
|
EmailVerifiedAt *time.Time
|
|
IsAdmin bool
|
|
Password []byte
|
|
Salt []byte
|
|
CreateAt time.Time
|
|
}
|
|
|
|
func NewUser(id uuid.UUID, email string, emailVerified bool, emailVerifiedAt *time.Time, isAdmin bool, password []byte, salt []byte, createAt time.Time) *User {
|
|
return &User{
|
|
Id: id,
|
|
Email: email,
|
|
EmailVerified: emailVerified,
|
|
EmailVerifiedAt: emailVerifiedAt,
|
|
IsAdmin: isAdmin,
|
|
Password: password,
|
|
Salt: salt,
|
|
CreateAt: createAt,
|
|
}
|
|
}
|
|
|
|
type DbAuth interface {
|
|
GetUser(email string) (*User, error)
|
|
}
|
|
|
|
type DbAuthSqlite struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func NewDbAuthSqlite(db *sql.DB) *DbAuthSqlite {
|
|
return &DbAuthSqlite{db: db}
|
|
}
|
|
|
|
func (db DbAuthSqlite) GetUser(email string) (*User, error) {
|
|
var (
|
|
userId uuid.UUID
|
|
emailVerified bool
|
|
emailVerifiedAt *time.Time
|
|
isAdmin bool
|
|
password []byte
|
|
salt []byte
|
|
createdAt time.Time
|
|
)
|
|
|
|
err := db.db.QueryRow(`
|
|
SELECT user_uuid, email_verified, email_verified_at, password, salt, created_at
|
|
FROM user
|
|
WHERE email = ?`, email).Scan(&userId, &emailVerified, &emailVerifiedAt, &password, &salt, &createdAt)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, ErrUserNotFound
|
|
} else {
|
|
utils.LogError("SQL error GetUser", err)
|
|
return nil, types.ErrInternal
|
|
}
|
|
}
|
|
|
|
return NewUser(userId, email, emailVerified, emailVerifiedAt, isAdmin, password, salt, createdAt), nil
|
|
}
|