errors = PreUserValidator.validate(request);
+
+ if (request.getDni() != null && repository.existsByDni(request.getDni())) {
+ errors.put("dni", "There is already an user with that NIF/NIE");
+ }
+
+ if (request.getEmail() != null && repository.existsByEmail(request.getEmail())) {
+ errors.put("email", "There is already an user with that email");
+ }
+
+ return errors;
+ }
}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/RequestService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/RequestService.java
index 034b38d..829dd92 100644
--- a/huertos/src/main/java/net/miarma/backend/huertos/service/RequestService.java
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/RequestService.java
@@ -8,7 +8,6 @@ import net.miarma.backend.huertos.dto.PreUserDto;
import net.miarma.backend.huertos.dto.RequestDto;
import net.miarma.backend.huertos.mapper.PreUserMapper;
import net.miarma.backend.huertos.mapper.RequestMapper;
-import net.miarma.backend.huertos.model.HuertosUserMetadata;
import net.miarma.backend.huertos.model.PreUser;
import net.miarma.backend.huertos.repository.PreUserRepository;
import net.miarma.backlib.exception.BadRequestException;
@@ -64,7 +63,7 @@ public class RequestService {
.toList();
}
- public Request create(Request request) {
+ public Request createWaitlist(Request request) {
if (request.getType() == null) {
throw new BadRequestException("type is required");
}
@@ -82,8 +81,8 @@ public class RequestService {
}
@Transactional
- public RequestDto.Response create(RequestDto.Request requestDto,
- PreUserDto.Request preUserDto) {
+ public RequestDto.Response createWaitlist(RequestDto.Request requestDto,
+ PreUserDto.Request preUserDto) {
PreUser preUser = preUserRepository.save(PreUserMapper.toEntity(preUserDto));
Request request = requestRepository.save(RequestMapper.toEntity(requestDto));
return RequestMapper.toResponse(request);
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/validation/DniValidator.java b/huertos/src/main/java/net/miarma/backend/huertos/validation/DniValidator.java
new file mode 100644
index 0000000..10af1f6
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/validation/DniValidator.java
@@ -0,0 +1,66 @@
+package net.miarma.backend.huertos.validation;
+
+/**
+ * Validador de DNI/NIE español.
+ *
+ * Este validador comprueba si un DNI o NIE es válido según las reglas establecidas por la legislación española.
+ * Un DNI debe tener 8 dígitos seguidos de una letra, y un NIE debe comenzar con X, Y o Z seguido de 7 dígitos y una letra.
+ *
+ * @author José Manuel Amador Gallardo
+ */
+public class DniValidator {
+
+ /**
+ * Valida un DNI o NIE español.
+ *
+ * @param id El DNI o NIE a validar.
+ * @return true si el DNI/NIE es válido, false en caso contrario.
+ */
+ public static boolean isValid(String id) {
+ if (id == null || id.length() != 9) {
+ return false;
+ }
+
+ id = id.toUpperCase(); // Pa evitar problemas con minúsculas
+ String numberPart;
+ char letterPart = id.charAt(8);
+
+ if (id.startsWith("X") || id.startsWith("Y") || id.startsWith("Z")) {
+ // NIE
+ char prefix = id.charAt(0);
+ String numericPrefix = switch (prefix) {
+ case 'X' -> "0";
+ case 'Y' -> "1";
+ case 'Z' -> "2";
+ default -> null;
+ };
+
+ if (numericPrefix == null) return false;
+
+ numberPart = numericPrefix + id.substring(1, 8);
+ } else {
+ // DNI
+ numberPart = id.substring(0, 8);
+ }
+
+ if (!numberPart.matches("\\d{8}")) {
+ return false;
+ }
+
+ int number = Integer.parseInt(numberPart);
+ char expectedLetter = calculateLetter(number);
+
+ return letterPart == expectedLetter;
+ }
+
+ /**
+ * Calcula la letra correspondiente a un número de DNI.
+ *
+ * @param number El número del DNI (8 dígitos).
+ * @return La letra correspondiente.
+ */
+ private static char calculateLetter(int number) {
+ String letters = "TRWAGMYFPDXBNJZSQVHLCKE";
+ return letters.charAt(number % 23);
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/validation/PreUserValidator.java b/huertos/src/main/java/net/miarma/backend/huertos/validation/PreUserValidator.java
new file mode 100644
index 0000000..7fa97b4
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/validation/PreUserValidator.java
@@ -0,0 +1,61 @@
+package net.miarma.backend.huertos.validation;
+
+import net.miarma.backend.huertos.dto.PreUserDto;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class PreUserValidator {
+
+ public static Map validate(PreUserDto.Request dto) {
+ Map errors = new HashMap<>();
+
+ if (dto.getUserName() == null || dto.getUserName().isBlank()) {
+ errors.put("userName", "El nombre de usuario es obligatorio");
+ } else if (dto.getUserName().length() < 3) {
+ errors.put("userName", "El nombre de usuario debe tener al menos 3 caracteres");
+ }
+
+ if (dto.getDisplayName() == null || dto.getDisplayName().isBlank()) {
+ errors.put("displayName", "El nombre visible es obligatorio");
+ }
+
+ if (dto.getDni() == null || dto.getDni().isBlank()) {
+ errors.put("dni", "El DNI es obligatorio");
+ } else if (!dto.getDni().matches("^[0-9]{8}[A-Za-z]$")) {
+ errors.put("dni", "DNI inválido");
+ }
+
+ if (dto.getEmail() == null || dto.getEmail().isBlank()) {
+ errors.put("email", "El email es obligatorio");
+ } else if (!dto.getEmail().matches("^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,4}$")) {
+ errors.put("email", "Email inválido");
+ }
+
+ if (dto.getPhone() == null || dto.getPhone().isBlank()) {
+ errors.put("phone", "El teléfono es obligatorio");
+ } else if (!dto.getPhone().matches("^[0-9]{9}$")) {
+ errors.put("phone", "Teléfono inválido");
+ }
+
+ if (dto.getAddress() == null || dto.getAddress().isBlank()) {
+ errors.put("address", "La dirección es obligatoria");
+ }
+
+ if (dto.getZipCode() == null || dto.getZipCode().isBlank()) {
+ errors.put("zipCode", "El código postal es obligatorio");
+ }
+
+ if (dto.getCity() == null || dto.getCity().isBlank()) {
+ errors.put("city", "La ciudad es obligatoria");
+ }
+
+ if (dto.getPassword() == null || dto.getPassword().isBlank()) {
+ errors.put("password", "La contraseña es obligatoria");
+ } else if (dto.getPassword().length() < 6) {
+ errors.put("password", "La contraseña debe tener al menos 6 caracteres");
+ }
+
+ return errors;
+ }
+}
\ No newline at end of file