summaryrefslogtreecommitdiff
path: root/internal/user/service.go
blob: a8a72a690cb6f1c36d3b45d96dea547645e67d35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package user

import (
	"errors"
	"fmt"

	"golang.org/x/crypto/bcrypt"
)

type Repository interface {
	Create(in *CreateInput) (*User, error)
	GetByUsernameOrEmail(username string, email string) (*User, error)
}

type Service struct {
	repository Repository
	bcryptCost int
}

func New(r Repository) *Service {
	return &Service{repository: r, bcryptCost: bcrypt.DefaultCost}
}

func (s *Service) Register(in *RegisterInput) (*User, error) {
	if err := in.validate(); err != nil {
		return nil, fmt.Errorf("register: %w", err)
	}

	_, err := s.repository.GetByUsernameOrEmail(in.Username, in.Email)
	if err == nil {
		return nil, fmt.Errorf("register: %w", ErrUserExists)
	}

	if !errors.Is(err, ErrUserNotFound) {
		return nil, fmt.Errorf("register: %w", err)
	}

	pwHash, err := bcrypt.GenerateFromPassword([]byte(in.Password), s.bcryptCost)
	if err != nil {
		return nil, fmt.Errorf("register: %w", err)
	}

	ci := &CreateInput{
		Username: in.Username,
		Email:    in.Email,
		Phone:    in.Phone,
		PwHash:   string(pwHash),
	}

	user, err := s.repository.Create(ci)
	if err != nil {
		return nil, fmt.Errorf("register: %w", err)
	}

	return user, nil
}