59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"git.nmcnew.com/nmcnew/bracketeer/db"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
var (
|
|
ErrAuthFailed = errors.New("auth values don't match")
|
|
)
|
|
|
|
type AuthService interface {
|
|
Login(ctx context.Context, username string, authValue string, authType string) (*db.User, error)
|
|
}
|
|
type authService struct {
|
|
q *db.Queries
|
|
}
|
|
|
|
func NewAuthService(q *db.Queries) AuthService {
|
|
return &authService{
|
|
q: q,
|
|
}
|
|
}
|
|
|
|
func (s *authService) Login(ctx context.Context, username, authValue, authType string) (*db.User, error) {
|
|
dbValue, err := s.q.GetUserAuthValue(ctx, db.GetUserAuthValueParams{
|
|
Name: username,
|
|
Type: db.AuthTypeFromString(authType),
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
switch authType {
|
|
case "password":
|
|
err = bcrypt.CompareHashAndPassword([]byte(dbValue.AuthValue), []byte(authValue))
|
|
if err != nil {
|
|
return nil, ErrAuthFailed
|
|
}
|
|
default:
|
|
if authValue != dbValue.AuthValue {
|
|
return nil, ErrAuthFailed
|
|
}
|
|
user, err := s.q.GetUserFromId(ctx, dbValue.UserID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &user, nil
|
|
}
|
|
|
|
return nil, ErrAuthFailed
|
|
}
|
|
|
|
func (s *authService) Register(ctx context.Context, username, email, bio, profileURL, authValue, authType string) (*db.User, error) {
|
|
panic("unimplemented")
|
|
}
|