chat_back_go/internal/service/users.go

87 lines
2.1 KiB
Go

package service
import (
"errors"
"fmt"
"time"
"git.urec56.ru/urec/chat_back_go/internal/domain"
"git.urec56.ru/urec/chat_back_go/internal/logger"
"git.urec56.ru/urec/chat_back_go/internal/repository"
)
type userService struct {
cache Cache
ur repository.User
auth Auth
l *logger.Logger
}
func newUserService(user repository.User, auth Auth, l *logger.Logger, cache Cache) *userService {
return &userService{ur: user, auth: auth, l: l, cache: cache}
}
func (s *userService) Get(userID int, isFast bool) (domain.User, error) {
u := domain.User{}
err := s.cache.Get(fmt.Sprintf("user: {'id': %d}", userID), &u, isFast)
if err == nil {
return u, nil
}
s.l.Infof("error getting user from cache: %s", err)
u, err = s.ur.GetByID(userID)
if err != nil {
return u, err
}
if err = s.cache.Set(fmt.Sprintf("user: {'id': %d}", userID), &u, time.Second*20); err != nil {
s.l.Infof("error setting user to cache: %s", err)
}
return u, nil
}
func (s *userService) GetVerificated(userID int) (domain.User, error) {
u, err := s.ur.GetByID(userID)
if err != nil {
return u, err
}
if u.Role < domain.VerificatedUser {
return u, domain.UnverifiedUserError
}
return u, err
}
func (s *userService) GetAll(username string) ([]domain.User, error) {
users, err := s.ur.GetAll(username)
return users, err
}
func (s *userService) FindOne(username, email string) (domain.User, error) {
user, err := s.ur.FindOne(username, email)
if err != nil {
return domain.User{}, domain.InternalServerError
}
return user, nil
}
func (s *userService) Register(userData domain.UserRegister) (string, error) {
hashedPassword, err := s.auth.HashPassword(userData.Password)
if err != nil {
return "", domain.InternalServerError
}
user, err := s.ur.Register(userData.Email, hashedPassword, userData.Username, userData.DateOfBirth.Time)
if err != nil {
if errors.Is(err, domain.UserAlreadyExistsError) {
return "", err
}
return "", domain.InternalServerError
}
authToken, err := s.auth.EncodeAuthToken(user.ID)
if err != nil {
return "", domain.InternalServerError
}
return authToken, err
}