generated from VLADIMIR/template
fix
This commit is contained in:
@@ -18,6 +18,11 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
ErrTeamNotFound = errors.New("Команда не найдена")
|
||||
ErrGameNotFound = errors.New("Игра не найдена")
|
||||
ErrReviewNotFound = errors.New("Отзыв не найден")
|
||||
ErrReviewExists = errors.New("Отзыв от команды уже оставлен")
|
||||
ErrInvalidStatus = errors.New("Недопустимый статус модерации")
|
||||
ErrGameNotFinished = errors.New("Оценить можно только завершённую игру")
|
||||
ErrInvalidReview = errors.New("Оценка должна быть от 1 до 5, текст обязателен")
|
||||
)
|
||||
@@ -39,11 +44,20 @@ func (s *GameReviewService) Create(ctx context.Context, gameID, teamID int, pass
|
||||
return nil, ErrInvalidReview
|
||||
}
|
||||
team, err := s.teams.GetTeamByID(ctx, teamID)
|
||||
if err != nil || team.GameID != gameID || team.Password != password || team.ParticipationStatus == "cancelled" {
|
||||
return nil, teams_repo.ErrTeamNotFound
|
||||
if err != nil {
|
||||
if errors.Is(err, teams_repo.ErrTeamNotFound) {
|
||||
return nil, ErrTeamNotFound
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
if team.GameID != gameID || team.Password != password || team.ParticipationStatus == "cancelled" {
|
||||
return nil, ErrTeamNotFound
|
||||
}
|
||||
game, err := s.games.GetGameByID(ctx, gameID)
|
||||
if err != nil {
|
||||
if errors.Is(err, games_repo.ErrGameNotFound) {
|
||||
return nil, ErrGameNotFound
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
if game.Status != "finish" {
|
||||
@@ -51,6 +65,9 @@ func (s *GameReviewService) Create(ctx context.Context, gameID, teamID int, pass
|
||||
}
|
||||
review, err := s.reviews.Create(ctx, gameID, teamID, rating, strings.TrimSpace(text))
|
||||
if err != nil {
|
||||
if errors.Is(err, game_reviews_repo.ErrReviewExists) {
|
||||
return nil, ErrReviewExists
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
return mapReview(review), nil
|
||||
@@ -58,6 +75,9 @@ func (s *GameReviewService) Create(ctx context.Context, gameID, teamID int, pass
|
||||
|
||||
func (s *GameReviewService) List(ctx context.Context, gameID int, all bool) ([]*Review, float64, int32, error) {
|
||||
if _, err := s.games.GetGameByID(ctx, gameID); err != nil {
|
||||
if errors.Is(err, games_repo.ErrGameNotFound) {
|
||||
return nil, 0, 0, ErrGameNotFound
|
||||
}
|
||||
return nil, 0, 0, err
|
||||
}
|
||||
reviews, average, count, err := s.reviews.List(ctx, gameID, all)
|
||||
@@ -72,6 +92,12 @@ func (s *GameReviewService) ListForModeration(ctx context.Context) ([]*Review, e
|
||||
func (s *GameReviewService) Moderate(ctx context.Context, id int, status string) (*Review, error) {
|
||||
review, err := s.reviews.Moderate(ctx, id, status)
|
||||
if err != nil {
|
||||
if errors.Is(err, game_reviews_repo.ErrReviewNotFound) {
|
||||
return nil, ErrReviewNotFound
|
||||
}
|
||||
if errors.Is(err, game_reviews_repo.ErrInvalidStatus) {
|
||||
return nil, ErrInvalidStatus
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
return mapReview(review), nil
|
||||
|
||||
@@ -19,9 +19,9 @@ const maxTicketsPerRequest = 100
|
||||
var (
|
||||
ErrInvalidTicketCount = errors.New("количество билетов должно быть от 1 до 100")
|
||||
ErrInvalidBaseURL = errors.New("необходимо настроить APP_BASE_URL — публичный адрес приложения")
|
||||
ErrTicketNotFound = tickets_repo.ErrTicketNotFound
|
||||
ErrTicketUsed = tickets_repo.ErrTicketUsed
|
||||
ErrGameFinished = tickets_repo.ErrGameFinished
|
||||
ErrTicketNotFound = errors.New("Билет не найден")
|
||||
ErrTicketUsed = errors.New("Билет уже использован")
|
||||
ErrGameFinished = errors.New("Игра уже завершена")
|
||||
)
|
||||
|
||||
type Ticket struct {
|
||||
@@ -93,7 +93,7 @@ func (s *TicketService) Get(ctx context.Context, token string) (*Page, error) {
|
||||
}
|
||||
info, err := s.repo.GetByHash(ctx, hash)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, mapTicketError(err)
|
||||
}
|
||||
return &Page{
|
||||
ID: info.ID,
|
||||
@@ -114,11 +114,24 @@ func (s *TicketService) Accept(ctx context.Context, token string, userID int) (*
|
||||
}
|
||||
info, err := s.repo.Accept(ctx, hash, userID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, mapTicketError(err)
|
||||
}
|
||||
return &Page{ID: info.ID, Status: info.Status, GameName: info.GameName, StartAt: info.StartAt, Location: info.Location, GameStatus: info.GameStatus, UsedAt: info.UsedAt, UsedBy: info.UsedBy}, nil
|
||||
}
|
||||
|
||||
func mapTicketError(err error) error {
|
||||
switch {
|
||||
case errors.Is(err, tickets_repo.ErrTicketNotFound):
|
||||
return ErrTicketNotFound
|
||||
case errors.Is(err, tickets_repo.ErrTicketUsed):
|
||||
return ErrTicketUsed
|
||||
case errors.Is(err, tickets_repo.ErrGameFinished):
|
||||
return ErrGameFinished
|
||||
default:
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
func newToken() (string, error) {
|
||||
data := make([]byte, 32)
|
||||
if _, err := rand.Read(data); err != nil {
|
||||
|
||||
@@ -82,8 +82,15 @@ func NewUsersService(
|
||||
}
|
||||
}
|
||||
|
||||
// ErrTermsNotAccepted — регистрация невозможна без акцепта соглашений.
|
||||
var ErrTermsNotAccepted = errors.New("Необходимо принять Пользовательское соглашение и Политику конфиденциальности")
|
||||
var (
|
||||
// ErrTermsNotAccepted — регистрация невозможна без акцепта соглашений.
|
||||
ErrTermsNotAccepted = errors.New("Необходимо принять Пользовательское соглашение и Политику конфиденциальности")
|
||||
ErrInvalidEmail = errors.New("Некорректный email")
|
||||
ErrInvalidCredentials = errors.New("Не верен email или пароль")
|
||||
ErrInvalidAccountPassword = errors.New("Неверный пароль")
|
||||
ErrInvalidRefreshToken = errors.New("Пользователь не найден")
|
||||
ErrInvalidRole = errors.New("Недопустимая роль")
|
||||
)
|
||||
|
||||
func (s *UsersService) AddUser(
|
||||
ctx context.Context,
|
||||
@@ -170,12 +177,19 @@ func (s *UsersService) DeleteAccount(
|
||||
) error {
|
||||
user, err := s.usersRepo.GetUserByID(ctx, userID)
|
||||
if err != nil {
|
||||
if errors.Is(err, users_repo.ErrUserNotFound) {
|
||||
return ErrUserNotFound
|
||||
}
|
||||
return err
|
||||
}
|
||||
if err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(password)); err != nil {
|
||||
return errors.New("Неверный пароль")
|
||||
return ErrInvalidAccountPassword
|
||||
}
|
||||
return s.usersRepo.DeleteUser(ctx, userID)
|
||||
err = s.usersRepo.DeleteUser(ctx, userID)
|
||||
if errors.Is(err, users_repo.ErrUserNotFound) {
|
||||
return ErrUserNotFound
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *UsersService) RefreshPassword(
|
||||
@@ -225,15 +239,15 @@ func (s *UsersService) RefreshPassword(
|
||||
// validateEmail проверяет, что строка является одиночным email-адресом.
|
||||
func validateEmail(email string) error {
|
||||
if email == "" {
|
||||
return errors.New("Email не указан")
|
||||
return ErrInvalidEmail
|
||||
}
|
||||
addr, err := mail.ParseAddress(email)
|
||||
if err != nil {
|
||||
return errors.New("Некорректный email")
|
||||
return ErrInvalidEmail
|
||||
}
|
||||
// Отклоняем форму "Имя <a@b.c>" и всё, что не является чистым адресом.
|
||||
if !strings.EqualFold(addr.Address, email) {
|
||||
return errors.New("Некорректный email")
|
||||
return ErrInvalidEmail
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -249,11 +263,14 @@ func (s *UsersService) Login(
|
||||
strings.TrimSpace(email),
|
||||
)
|
||||
if err != nil {
|
||||
if errors.Is(err, users_repo.ErrUserNotFound) {
|
||||
return "", "", err
|
||||
}
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
if err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(password)); err != nil {
|
||||
return "", "", errors.New("Не верен email или пароль")
|
||||
return "", "", ErrInvalidCredentials
|
||||
}
|
||||
|
||||
accessToken, err := s.processorJWT.GenerateAccessToken(user.ID, user.Email, user.Roles)
|
||||
@@ -283,7 +300,7 @@ func (s *UsersService) Refresh(
|
||||
) (string, string, error) {
|
||||
claims, err := s.processorJWT.GetClaims(token)
|
||||
if err != nil {
|
||||
return "", "", errors.New("Пользователь не найден")
|
||||
return "", "", ErrInvalidRefreshToken
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
@@ -292,7 +309,7 @@ func (s *UsersService) Refresh(
|
||||
return "", "", err
|
||||
}
|
||||
if !ok {
|
||||
return "", "", errors.New("Пользователь не найден")
|
||||
return "", "", ErrInvalidRefreshToken
|
||||
}
|
||||
if err := s.refreshTokensRepo.DeleteRefreshTokenByJti(ctx, claims.ID); err != nil {
|
||||
return "", "", err
|
||||
@@ -300,6 +317,9 @@ func (s *UsersService) Refresh(
|
||||
|
||||
user, err := s.usersRepo.GetUserByID(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
if errors.Is(err, users_repo.ErrUserNotFound) {
|
||||
return "", "", ErrInvalidRefreshToken
|
||||
}
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
@@ -340,6 +360,9 @@ func (s *UsersService) GetUserByID(
|
||||
) (*User, error) {
|
||||
user, err := s.usersRepo.GetUserByID(ctx, userID)
|
||||
if err != nil {
|
||||
if errors.Is(err, users_repo.ErrUserNotFound) {
|
||||
return nil, ErrUserNotFound
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
return mapUser(user), nil
|
||||
@@ -351,9 +374,13 @@ func (s *UsersService) AddUserRole(
|
||||
role string,
|
||||
) error {
|
||||
if !slices.Contains(roles.AllRoles, role) {
|
||||
return fmt.Errorf("role %s not support", role)
|
||||
return ErrInvalidRole
|
||||
}
|
||||
return s.usersRepo.AddUserRole(ctx, userID, role)
|
||||
err := s.usersRepo.AddUserRole(ctx, userID, role)
|
||||
if errors.Is(err, users_repo.ErrUserNotFound) {
|
||||
return ErrUserNotFound
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *UsersService) DeleteUserRole(
|
||||
@@ -362,9 +389,13 @@ func (s *UsersService) DeleteUserRole(
|
||||
role string,
|
||||
) error {
|
||||
if !slices.Contains(roles.AllRoles, role) {
|
||||
return fmt.Errorf("role %s not support", role)
|
||||
return ErrInvalidRole
|
||||
}
|
||||
return s.usersRepo.DeleteUserRole(ctx, userID, role)
|
||||
err := s.usersRepo.DeleteUserRole(ctx, userID, role)
|
||||
if errors.Is(err, users_repo.ErrUserNotFound) {
|
||||
return ErrUserNotFound
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
var (
|
||||
|
||||
Reference in New Issue
Block a user