2025-12-10 19:12:54 +07:00
|
|
|
package ru.soune.nocopy.controller;
|
2025-12-10 02:37:31 +07:00
|
|
|
|
2025-12-10 12:17:08 +07:00
|
|
|
import jakarta.annotation.PostConstruct;
|
2025-12-10 02:37:31 +07:00
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
2025-12-10 12:17:08 +07:00
|
|
|
import org.springframework.context.ApplicationContext;
|
2025-12-10 02:37:31 +07:00
|
|
|
import org.springframework.http.ResponseEntity;
|
|
|
|
|
import org.springframework.validation.BindingResult;
|
|
|
|
|
import org.springframework.validation.FieldError;
|
|
|
|
|
import org.springframework.web.bind.annotation.*;
|
2025-12-10 19:12:54 +07:00
|
|
|
import ru.soune.nocopy.dto.BaseRequest;
|
|
|
|
|
import ru.soune.nocopy.dto.BaseResponse;
|
|
|
|
|
import ru.soune.nocopy.dto.MessageCode;
|
|
|
|
|
import ru.soune.nocopy.dto.RegAnswer;
|
|
|
|
|
import ru.soune.nocopy.exception.NotValidFieldException;
|
|
|
|
|
import ru.soune.nocopy.exception.ValidationException;
|
|
|
|
|
import ru.soune.nocopy.handler.LoginRequestHandler;
|
|
|
|
|
import ru.soune.nocopy.handler.RegRequestHandler;
|
|
|
|
|
import ru.soune.nocopy.handler.RequestHandler;
|
2025-12-10 02:37:31 +07:00
|
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
@RestController
|
|
|
|
|
@RequestMapping("/api")
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
public class ApiController {
|
2025-12-10 12:17:08 +07:00
|
|
|
private final ApplicationContext applicationContext;
|
2025-12-10 02:37:31 +07:00
|
|
|
|
2025-12-10 12:17:08 +07:00
|
|
|
private Map<Integer, RequestHandler> handlers = new HashMap<>();
|
2025-12-10 02:37:31 +07:00
|
|
|
|
2025-12-10 12:17:08 +07:00
|
|
|
@PostConstruct
|
|
|
|
|
public void init() {
|
|
|
|
|
RegRequestHandler regHandler = applicationContext.getBean(RegRequestHandler.class);
|
|
|
|
|
LoginRequestHandler loginHandler = applicationContext.getBean(LoginRequestHandler.class);
|
2025-12-10 02:37:31 +07:00
|
|
|
|
2025-12-10 12:17:08 +07:00
|
|
|
handlers.put(20002, regHandler);
|
|
|
|
|
handlers.put(20001, loginHandler);
|
|
|
|
|
}
|
2025-12-10 02:37:31 +07:00
|
|
|
|
|
|
|
|
@PostMapping("/v{version}/data")
|
2025-12-10 12:17:08 +07:00
|
|
|
public ResponseEntity<?> handlePostRequest(@RequestBody BaseRequest request,
|
|
|
|
|
@PathVariable("version") int version) {
|
2025-12-10 02:37:31 +07:00
|
|
|
Integer msgId = request.getMsgId();
|
2025-12-10 17:17:48 +07:00
|
|
|
BaseResponse response;
|
2025-12-10 02:37:31 +07:00
|
|
|
|
2025-12-10 12:17:08 +07:00
|
|
|
try {
|
|
|
|
|
RequestHandler handler = handlers.get(msgId);
|
2025-12-10 02:37:31 +07:00
|
|
|
|
2025-12-10 12:17:08 +07:00
|
|
|
if (handler == null) {
|
2025-12-10 17:17:48 +07:00
|
|
|
response = new BaseResponse(msgId,
|
2025-12-10 12:17:08 +07:00
|
|
|
MessageCode.MSG_ID_NOT_FOUND.getCode(),
|
2025-12-10 15:27:14 +07:00
|
|
|
MessageCode.MSG_ID_NOT_FOUND.getDescription(),
|
|
|
|
|
new HashMap<>());
|
2025-12-10 17:17:48 +07:00
|
|
|
} else {
|
|
|
|
|
response = handler.handle(request);
|
2025-12-10 12:17:08 +07:00
|
|
|
}
|
2025-12-10 02:37:31 +07:00
|
|
|
|
2025-12-10 12:17:08 +07:00
|
|
|
return ResponseEntity.ok().body(response);
|
|
|
|
|
} catch (ValidationException e) {
|
|
|
|
|
return createValidationErrorResponse(e.getBindingResult(), e.getMsgId());
|
|
|
|
|
} catch (NotValidFieldException e) {
|
|
|
|
|
throw e;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("Handler execution failed for msgId: {}", msgId, e);
|
|
|
|
|
throw new RuntimeException("Handler execution failed", e);
|
|
|
|
|
}
|
2025-12-10 02:37:31 +07:00
|
|
|
}
|
|
|
|
|
|
2025-12-10 15:27:14 +07:00
|
|
|
private ResponseEntity<BaseResponse> createValidationErrorResponse(BindingResult bindingResult, Integer msgId) {
|
2025-12-10 02:37:31 +07:00
|
|
|
List<Map<String, String>> fieldErrors = bindingResult.getFieldErrors()
|
|
|
|
|
.stream()
|
|
|
|
|
.map(this::createErrorDetail)
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
2025-12-10 15:27:14 +07:00
|
|
|
RegAnswer regAnswer = new RegAnswer();
|
|
|
|
|
regAnswer.setFieldErrors(fieldErrors);
|
2025-12-10 02:37:31 +07:00
|
|
|
|
2025-12-10 15:27:14 +07:00
|
|
|
return ResponseEntity.ok().body(new BaseResponse(msgId, MessageCode.INVALID_FIELD.getCode(),
|
|
|
|
|
MessageCode.INVALID_FIELD.getDescription(), regAnswer));
|
2025-12-10 02:37:31 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Map<String, String> createErrorDetail(FieldError fieldError) {
|
|
|
|
|
Map<String, String> errorDetail = new HashMap<>();
|
|
|
|
|
errorDetail.put("field", fieldError.getField());
|
|
|
|
|
errorDetail.put("code", fieldError.getCode() != null ? fieldError.getCode() : "VALIDATION_ERROR");
|
|
|
|
|
errorDetail.put("message", fieldError.getDefaultMessage());
|
|
|
|
|
|
|
|
|
|
if (fieldError.getRejectedValue() != null &&
|
|
|
|
|
!fieldError.getField().toLowerCase().contains("password")) {
|
|
|
|
|
errorDetail.put("rejected_value", fieldError.getRejectedValue().toString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return errorDetail;
|
|
|
|
|
}
|
|
|
|
|
}
|