From 41d4965db78414ba53237f791919ae17c0b99e14 Mon Sep 17 00:00:00 2001 From: mihna123 Date: Sat, 29 Aug 2026 23:28:28 +0200 Subject: user: add a service stub with validated register method --- internal/user/service.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 internal/user/service.go (limited to 'internal/user/service.go') 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 +} -- cgit v1.3.1