summaryrefslogtreecommitdiff
path: root/internal/user/service.go
diff options
context:
space:
mode:
authormihna123 <mihailonvojinovic@gmail.com>2026-08-29 23:28:28 +0200
committermihna123 <mihailonvojinovic@gmail.com>2026-08-29 23:28:28 +0200
commit41d4965db78414ba53237f791919ae17c0b99e14 (patch)
treebd3e25202e8cb66cff14b7c119c7afdbbc7b1ff6 /internal/user/service.go
parent7ba6bc53be1546b44610840c46996dd6e2147405 (diff)
downloadopenstore-41d4965db78414ba53237f791919ae17c0b99e14.tar.gz
openstore-41d4965db78414ba53237f791919ae17c0b99e14.zip
user: add a service stub with validated register method
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
+}