summaryrefslogtreecommitdiff
path: root/internal/user/service.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/user/service.go')
-rw-r--r--internal/user/service.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/internal/user/service.go b/internal/user/service.go
new file mode 100644
index 0000000..a8a72a6
--- /dev/null
+++ b/internal/user/service.go
@@ -0,0 +1,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
+}