package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.BindingResult; import ru.soune.nocopy.dto.*; import ru.soune.nocopy.entity.AuthToken; import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.exception.ValidationException; import ru.soune.nocopy.handler.validator.RegRequestValidator; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.auth.AuthService; import java.util.Arrays; import java.util.Map; @Slf4j @Component @RequiredArgsConstructor public class RegRequestHandler implements RequestHandler { private final UserRepository userRepository; private final RegRequestValidator regRequestValidator; private final AuthService authService; private final ObjectMapper objectMapper; @Override public BaseResponse handle(BaseRequest request) throws ValidationException { RegRequest regRequest = objectMapper.convertValue(request.getMessageBody(), RegRequest.class); if (userRepository.existsByEmail(regRequest.getEmail()) || userRepository.existsByPhone(regRequest.getPhone())) { RegAnswer regAnswer = new RegAnswer(); regAnswer.setFieldErrors(Arrays.asList(Map.of("email", regRequest.getEmail()))); regAnswer.setFieldErrors(Arrays.asList(Map.of("phone", regRequest.getPhone()))); throw new NotValidFieldException("User already exists with email:" + regRequest.getEmail() + " or phone: " + regRequest.getPhone(), new BaseResponse(request.getMsgId(), MessageCode.REG_EMAIL_OR_PHONE_EXISTS.getCode(), MessageCode.REG_EMAIL_OR_PHONE_EXISTS.getDescription(), regAnswer)); } BindingResult bindingResult = new BeanPropertyBindingResult(regRequest, "regRequest"); regRequestValidator.validate(regRequest, bindingResult); if (bindingResult.hasErrors()) { throw new ValidationException(bindingResult, request.getMsgId()); } AuthToken authToken = authService.register(regRequest); String token = authToken.getToken(); authService.useUserAuthToken(token); RegAnswer regAnswer = new RegAnswer(); regAnswer.setToken(token); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), regAnswer); } }