stringHashMap = new HashMap<>();
- public String generateTemporaryPassword() {
- return java.util.UUID.randomUUID().toString();
- }
+ public String generateTemporaryPassword() {
+ return java.util.UUID.randomUUID().toString();
+ }
- public void generateAndStoreToken(String email, String password) {
- String hashedPassword = generateRecoveryToken(email, password);
- stringHashMap.put(hashedPassword, email);
- }
+ public void generateAndStoreToken(String email, String password) {
+ String hashedPassword = generateRecoveryToken(email, password);
+ stringHashMap.put(hashedPassword, email);
+ }
- public String retrieveEmailFromToken(String hashedPassword) {
- return stringHashMap.get(hashedPassword);
- }
+ public String retrieveEmailFromToken(String hashedPassword) {
+ return stringHashMap.get(hashedPassword);
+ }
- public boolean isRecoveryTokenValid(String Token, String email) {
- return stringHashMap.get(Token).equals(email);
- }
+ public boolean isRecoveryTokenValid(String token, String email) {
+ return stringHashMap.get(token).equals(email);
+ }
- private String generateRecoveryToken(String email, String password) {
- return BCryptEncoderComponent.encrypt(email + password);
- }
+ private static String generateRecoveryToken(String email, String password) {
+ return BCryptEncoderComponent.encrypt(email + password);
+ }
}
diff --git a/src/main/java/leonardo/labutilities/qualitylabpro/utils/components/RulesValidatorComponent.java b/src/main/java/leonardo/labutilities/qualitylabpro/utils/components/RulesValidatorComponent.java
index 3ee12e9..f5cc8ad 100644
--- a/src/main/java/leonardo/labutilities/qualitylabpro/utils/components/RulesValidatorComponent.java
+++ b/src/main/java/leonardo/labutilities/qualitylabpro/utils/components/RulesValidatorComponent.java
@@ -7,22 +7,28 @@
@Component
public class RulesValidatorComponent {
- String description;
- String rules;
+ private String description;
+ private String rules;
- public void validator(Double value, Double mean, Double sd) {
- double[] thresholds = {mean + sd, mean + 2 * sd, mean + 3 * sd, mean - sd, mean - 2 * sd, mean - 3 * sd};
- String[] descriptions = {"Approved", "Approved", "Failed", "Approved", "Approved", "Failed"};
- String[] rules = {"+1s", "+2s", "+3s", "-1s", "-2s", "-3s"};
+ public void validator(Double value, Double mean, Double sd) {
+ double[] thresholds =
+ {mean + sd, mean + 2 * sd, mean + 3 * sd, mean - sd, mean - 2 * sd, mean - 3 * sd};
+ String[] descriptions =
+ {"Approved", "Approved", "Failed", "Approved", "Approved", "Failed"};
+ String[] rules = {"+1s", "+2s", "+3s", "-1s", "-2s", "-3s"};
- for (int i = 2; i >= 0; i--) {
- if (value >= thresholds[i] || value <= thresholds[i + 3]) {
- this.description = descriptions[i];
- this.rules = value >= thresholds[i] ? rules[i] : rules[i + 3];
- return;
- }
- }
- this.description = "Approved";
- this.rules = "Average";
- }
-}
\ No newline at end of file
+ for (int i = 2; i >= 0; i--) {
+ if (value >= thresholds[i] || value <= thresholds[i + 3]) {
+ this.description = descriptions[i];
+ if (value >= thresholds[i]) {
+ this.rules = rules[i];
+ } else {
+ this.rules = rules[i + 3];
+ }
+ return;
+ }
+ }
+ this.description = "Approved";
+ this.rules = "Average";
+ }
+}
diff --git a/src/main/java/leonardo/labutilities/qualitylabpro/utils/components/StringToLocalDateTimeConverter.java b/src/main/java/leonardo/labutilities/qualitylabpro/utils/components/StringToLocalDateTimeConverter.java
index d63175c..d327e25 100644
--- a/src/main/java/leonardo/labutilities/qualitylabpro/utils/components/StringToLocalDateTimeConverter.java
+++ b/src/main/java/leonardo/labutilities/qualitylabpro/utils/components/StringToLocalDateTimeConverter.java
@@ -47,7 +47,7 @@ public LocalDateTime convert(String source) {
throw new IllegalArgumentException("Unable to parse date: " + source, lastException);
}
- private String sanitizeDate(String date) {
+ private static String sanitizeDate(String date) {
return date.trim().replaceAll("--", "-") // Fix double dashes
.replaceAll("\\s+", " ") // Fix multiple spaces
.replaceAll("T\\s", "T") // Fix space after T
diff --git a/src/main/java/leonardo/labutilities/qualitylabpro/utils/constants/EmailTemplate.java b/src/main/java/leonardo/labutilities/qualitylabpro/utils/constants/EmailTemplate.java
index c7be1bf..a01bff8 100644
--- a/src/main/java/leonardo/labutilities/qualitylabpro/utils/constants/EmailTemplate.java
+++ b/src/main/java/leonardo/labutilities/qualitylabpro/utils/constants/EmailTemplate.java
@@ -16,44 +16,49 @@ public class EmailTemplate {
""";
public static final String EMAIL_SUBJECT_PREFIX = "LabGraph - ";
public static final String HTML_TEMPLATE = "%s";
- public static final String TABLE_STYLE = """
-
-
-
- Name |
- Level |
- Value |
- Expected Value |
- Rules |
- Status |
- Date |
-
-
-
- %s
-
-
- """;
- public static final String TABLE_ROW = """
-
- %s |
- %s |
- %s |
- %s |
- %s |
- %s |
- %s |
-
""";
- public static final String ANALYTICS_WARNING_HEADER = """
-
- ⚠️ Quality Control Alert: Westgard violations
-
-
- The following laboratory control measurements have triggered quality control violations based on
- Westgard multi-rules. These violations may indicate systematic or random errors in the analytical process:
-
- """;
+ public static final String TABLE_STYLE =
+ """
+
+
+
+ Name |
+ Level |
+ Value |
+ Expected Value |
+ Rules |
+ Status |
+ Date |
+
+
+
+ %s
+
+
+ """;
+ public static final String TABLE_ROW =
+ """
+
+ %s |
+ %s |
+ %s |
+ %s |
+ %s |
+ %s |
+ %s |
+
""";
+ public static final String ANALYTICS_WARNING_HEADER =
+ """
+
+ ⚠️ Quality Control Alert: Westgard violations
+
+
+ The following laboratory control measurements have triggered quality control violations based on
+ Westgard multi-rules. These violations may indicate systematic or random errors in the analytical process:
+
+ """;
public static final String LAST_ANALYTICS_PARAGRAPH = """
- Please take the necessary actions to address these issues.
- """;
-}
\ No newline at end of file
+ Please take the necessary actions to address these issues.
+ """;
+}
diff --git a/src/main/java/leonardo/labutilities/qualitylabpro/utils/exception/ApiError.java b/src/main/java/leonardo/labutilities/qualitylabpro/utils/exception/ApiError.java
index 8ce335e..aad8db6 100644
--- a/src/main/java/leonardo/labutilities/qualitylabpro/utils/exception/ApiError.java
+++ b/src/main/java/leonardo/labutilities/qualitylabpro/utils/exception/ApiError.java
@@ -10,27 +10,27 @@
@Getter
public class ApiError {
- private final LocalDateTime timestamp;
- private final int status;
- private final String error;
- private final String message;
- private final String path;
- private List details;
+ private final LocalDateTime timestamp;
+ private final int status;
+ private final String error;
+ private final String message;
+ private final String path;
+ private List details;
- public ApiError(HttpStatus status, String message, String path) {
- this.timestamp = LocalDateTime.now();
- this.status = status.value();
- this.error = status.getReasonPhrase();
- this.message = message;
- this.path = path;
- this.details = new ArrayList<>();
- }
+ public ApiError(HttpStatus status, String message, String path) {
+ this.timestamp = LocalDateTime.now();
+ this.status = status.value();
+ this.error = status.getReasonPhrase();
+ this.message = message;
+ this.path = path;
+ this.details = new ArrayList<>();
+ }
- public void setDetails(List details) {
- this.details = details;
- }
+ public void setDetails(List details) {
+ this.details = new ArrayList<>(details);
+ }
- public void addValidationErrors(Map validationErrors) {
- validationErrors.forEach((field, message) -> this.details.add(field + ": " + message));
- }
+ public void addValidationErrors(Map validationErrors) {
+ validationErrors.forEach((field, message) -> this.details.add(field + ": " + message));
+ }
}
diff --git a/src/main/java/leonardo/labutilities/qualitylabpro/utils/exception/CustomGlobalErrorHandling.java b/src/main/java/leonardo/labutilities/qualitylabpro/utils/exception/CustomGlobalErrorHandling.java
index 5c22bc4..d62f522 100644
--- a/src/main/java/leonardo/labutilities/qualitylabpro/utils/exception/CustomGlobalErrorHandling.java
+++ b/src/main/java/leonardo/labutilities/qualitylabpro/utils/exception/CustomGlobalErrorHandling.java
@@ -25,7 +25,7 @@ public class CustomGlobalErrorHandling {
public ResponseEntity handleValidationExceptions(MethodArgumentNotValidException ex,
HttpServletRequest request) {
Map errors = ex.getBindingResult().getFieldErrors().stream()
- .collect(Collectors.toMap(FieldError::getField, error -> {
+ .collect(Collectors.toMap(FieldError::getField, (FieldError error) -> {
error.getDefaultMessage();
return error.getDefaultMessage();
}));
@@ -164,19 +164,13 @@ public UserAlreadyExistException() {
public static class UserNotFoundException extends RuntimeException {
public UserNotFoundException() {
- super();
- }
-
- public UserNotFoundException(String message) {
- super(message);
+ super("User not found - Invalid credentials or user does not exist");
}
}
public static class RecoveryTokenInvalidException extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
public RecoveryTokenInvalidException() {
- super("Recovery token is invalid or expired");
+ super("Token invalid - Recovery token is invalid or expired");
}
public RecoveryTokenInvalidException(String message) {
diff --git a/src/main/java/leonardo/labutilities/qualitylabpro/utils/mappers/AnalyticMapper.java b/src/main/java/leonardo/labutilities/qualitylabpro/utils/mappers/AnalyticMapper.java
index da12f04..fe847a1 100644
--- a/src/main/java/leonardo/labutilities/qualitylabpro/utils/mappers/AnalyticMapper.java
+++ b/src/main/java/leonardo/labutilities/qualitylabpro/utils/mappers/AnalyticMapper.java
@@ -5,41 +5,32 @@
import leonardo.labutilities.qualitylabpro.utils.components.RulesValidatorComponent;
public class AnalyticMapper {
- public static final RulesValidatorComponent rulesValidatorComponent = new RulesValidatorComponent();
+ public static final RulesValidatorComponent rulesValidatorComponent =
+ new RulesValidatorComponent();
- public static Analytic toEntity(AnalyticsDTO record) {
- Analytic analytic =
- new Analytic();
- analytic.setDate(record.date());
- analytic.setLevelLot(record.level_lot());
- analytic.setTestLot(record.test_lot());
- analytic.setName(record.name());
- analytic.setLevel(record.level());
- analytic.setValue(record.value());
- analytic.setMean(record.mean());
- analytic.setSd(record.sd());
- analytic.setUnitValue(record.unit_value());
- rulesValidatorComponent.validator(record.value(), record.mean(), record.sd());
- analytic.setRules(rulesValidatorComponent.getRules());
- analytic.setDescription(rulesValidatorComponent.getDescription());
+ public static Analytic toEntity(AnalyticsDTO analyticsDTO) {
+ Analytic analytic = new Analytic();
+ analytic.setDate(analyticsDTO.date());
+ analytic.setLevelLot(analyticsDTO.level_lot());
+ analytic.setTestLot(analyticsDTO.test_lot());
+ analytic.setName(analyticsDTO.name());
+ analytic.setLevel(analyticsDTO.level());
+ analytic.setValue(analyticsDTO.value());
+ analytic.setMean(analyticsDTO.mean());
+ analytic.setSd(analyticsDTO.sd());
+ analytic.setUnitValue(analyticsDTO.unit_value());
+ rulesValidatorComponent.validator(analyticsDTO.value(), analyticsDTO.mean(),
+ analyticsDTO.sd());
+ analytic.setRules(rulesValidatorComponent.getRules());
+ analytic.setDescription(rulesValidatorComponent.getDescription());
- return analytic;
- }
+ return analytic;
+ }
- public static AnalyticsDTO toRecord(Analytic analytic) {
- return new AnalyticsDTO(
- analytic.getId(),
- analytic.getDate(),
- analytic.getLevelLot(),
- analytic.getTestLot(),
- analytic.getName(),
- analytic.getLevel(),
- analytic.getValue(),
- analytic.getMean(),
- analytic.getSd(),
- analytic.getUnitValue(),
- analytic.getRules(),
- analytic.getDescription()
- );
- }
+ public static AnalyticsDTO toRecord(Analytic analytic) {
+ return new AnalyticsDTO(analytic.getId(), analytic.getDate(), analytic.getLevelLot(),
+ analytic.getTestLot(), analytic.getName(), analytic.getLevel(), analytic.getValue(),
+ analytic.getMean(), analytic.getSd(), analytic.getUnitValue(), analytic.getRules(),
+ analytic.getDescription());
+ }
}
diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties
index 35c0f8c..1f265e9 100644
--- a/src/main/resources/application-local.properties
+++ b/src/main/resources/application-local.properties
@@ -7,15 +7,13 @@ server.error.include-stacktrace=never
# ===============================
# = LOGGING CONFIGURATION
# ===============================
-logging.level.leonardo=DEBUG
+logging.level.leonardo=TRACE
# ===============================
# = MANAGEMENT CONFIGURATION
# ===============================
-management.endpoints.web.exposure.include=health
-management.endpoint.health.show-details=never
-management.health.ssl.enabled=false
-management.health.email.enabled=false
+management.endpoints.web.exposure.include=*
+management.endpoint.health.show-details=always
# ===============================
# = DATABASE CONFIGURATION
diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties
index d687599..866a791 100644
--- a/src/main/resources/application-prod.properties
+++ b/src/main/resources/application-prod.properties
@@ -9,7 +9,7 @@ server.error.include-stacktrace=never
# ===============================
# = LOGGING CONFIGURATION
# ===============================
-logging.level.leonardo=DEBUG
+logging.level.leonardo=INFO
spring.mail.properties.mail.debug=true
# ===============================
diff --git a/src/test/java/leonardo/labutilities/qualitylabpro/ControlApplicationTests.java b/src/test/java/leonardo/labutilities/qualitylabpro/ControlApplicationTests.java
index 8c73641..d62486c 100644
--- a/src/test/java/leonardo/labutilities/qualitylabpro/ControlApplicationTests.java
+++ b/src/test/java/leonardo/labutilities/qualitylabpro/ControlApplicationTests.java
@@ -2,13 +2,9 @@
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.cache.annotation.EnableCaching;
-import org.springframework.data.web.config.EnableSpringDataWebSupport;
import org.springframework.test.context.ActiveProfiles;
-@EnableCaching
-@EnableSpringDataWebSupport(
- pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO)
+
@SpringBootTest
@ActiveProfiles("test")
class ControlApplicationTests {
diff --git a/src/test/java/leonardo/labutilities/qualitylabpro/repositories/UserRepositoryTest.java b/src/test/java/leonardo/labutilities/qualitylabpro/repositories/UserRepositoryTest.java
index d223823..65b817f 100644
--- a/src/test/java/leonardo/labutilities/qualitylabpro/repositories/UserRepositoryTest.java
+++ b/src/test/java/leonardo/labutilities/qualitylabpro/repositories/UserRepositoryTest.java
@@ -20,58 +20,58 @@
@ActiveProfiles("test")
class UserRepositoryTest {
- @Autowired
- UserRepository userRepository;
+ @Autowired
+ UserRepository userRepository;
- @BeforeEach
- void clearDatabase(@Autowired Flyway flyway) {
- flyway.clean();
- flyway.migrate();
- }
+ @BeforeEach
+ void clearDatabase(@Autowired Flyway flyway) {
+ flyway.clean();
+ flyway.migrate();
+ }
- public void setupTestData() {
- var user = new User("UserTest", BCryptEncoderComponent.encrypt("12345"), "leo@hotmail.com",
- UserRoles.USER);
+ public void setupTestData() {
+ var user = new User("UserTest", BCryptEncoderComponent.encrypt("12345"), "leo@hotmail.com",
+ UserRoles.USER);
- userRepository.save(user);
- }
+ userRepository.save(user);
+ }
- @Test
- @DisplayName("return 200 when user is exists")
- @Transactional
- void findByLoginUserDataBaseIsUserExists() {
- setupTestData();
- var userNotNull = userRepository.getReferenceByUsername("UserTest");
- assertThat(userNotNull).isNotNull();
- }
+ @Test
+ @DisplayName("return 200 when user is exists")
+ @Transactional
+ void findByLoginUserDataBaseIsUserExists() {
+ setupTestData();
+ var userNotNull = userRepository.getReferenceByUsername("UserTest");
+ assertThat(userNotNull).isNotNull();
+ }
- @Test
- @DisplayName("return null when user is empty")
- @Transactional
- void findByLoginUserDataBaseIsUserNotExists() {
- var userEmpty = userRepository.getReferenceByUsername("");
- assertThat(userEmpty).isNull();
- }
+ @Test
+ @DisplayName("return null when user is empty")
+ @Transactional
+ void findByLoginUserDataBaseIsUserNotExists() {
+ var userEmpty = userRepository.getReferenceByUsername("");
+ assertThat(userEmpty).isNull();
+ }
- @Test
- @DisplayName("return True when update passwords successful")
- @Transactional
- void setPasswordWhereByUsername() {
- setupTestData();
- String username = "UserTest";
- String oldPassword = "12345";
- String newPassword = "249195Leo@@";
+ @Test
+ @DisplayName("return True when update passwords successful")
+ @Transactional
+ void setPasswordWhereByUsername() {
+ setupTestData();
+ String username = "UserTest";
+ String oldPassword = "12345";
+ String newPassword = "249195Leo@@";
- var userWithOldPassword =
- userRepository.getReferenceByUsernameAndEmail("UserTest", "leo@hotmail.com");
+ var userWithOldPassword =
+ userRepository.getReferenceByUsernameAndEmail("UserTest", "leo@hotmail.com");
- userRepository.setPasswordWhereByUsername(username, newPassword);
+ userRepository.setPasswordWhereByUsername(username, newPassword);
- var userWithNewPassword =
- userRepository.getReferenceByUsernameAndEmail("UserTest", "leo@hotmail.com");
+ var userWithNewPassword =
+ userRepository.getReferenceByUsernameAndEmail("UserTest", "leo@hotmail.com");
- assertThat(BCryptEncoderComponent.decrypt(oldPassword, userWithOldPassword.getPassword())
- || BCryptEncoderComponent.decrypt(newPassword, userWithNewPassword.getPassword()))
- .isTrue();
- }
+ assertThat(BCryptEncoderComponent.decrypt(oldPassword, userWithOldPassword.getPassword())
+ || BCryptEncoderComponent.decrypt(newPassword, userWithNewPassword.getPassword()))
+ .isTrue();
+ }
}
diff --git a/src/test/java/leonardo/labutilities/qualitylabpro/services/AnalyticHelperServiceTests.java b/src/test/java/leonardo/labutilities/qualitylabpro/services/AnalyticHelperServiceTests.java
index 9b18150..2b66c6c 100644
--- a/src/test/java/leonardo/labutilities/qualitylabpro/services/AnalyticHelperServiceTests.java
+++ b/src/test/java/leonardo/labutilities/qualitylabpro/services/AnalyticHelperServiceTests.java
@@ -5,11 +5,10 @@
import leonardo.labutilities.qualitylabpro.dtos.analytics.UpdateAnalyticsMeanDTO;
import leonardo.labutilities.qualitylabpro.entities.Analytic;
import leonardo.labutilities.qualitylabpro.repositories.AnalyticsRepository;
-import leonardo.labutilities.qualitylabpro.services.analytics.AnalyticHelperService;
+import leonardo.labutilities.qualitylabpro.services.analytics.AbstractAnalyticHelperService;
import leonardo.labutilities.qualitylabpro.services.email.EmailService;
import leonardo.labutilities.qualitylabpro.utils.components.ControlRulesValidators;
import leonardo.labutilities.qualitylabpro.utils.components.RulesValidatorComponent;
-import leonardo.labutilities.qualitylabpro.utils.constants.AvailableBiochemistryAnalytics;
import leonardo.labutilities.qualitylabpro.utils.exception.CustomGlobalErrorHandling;
import leonardo.labutilities.qualitylabpro.utils.mappers.AnalyticMapper;
import org.junit.jupiter.api.BeforeEach;
@@ -32,12 +31,10 @@
@ExtendWith(MockitoExtension.class)
class AnalyticHelperServiceTests {
- private static final List ANALYTICS_NAME_LIST =
- new AvailableBiochemistryAnalytics().availableBioAnalytics();
@Mock
private AnalyticsRepository analyticsRepository;
@Mock
- private AnalyticHelperService analyticHelperService;
+ private AbstractAnalyticHelperService analyticHelperService;
@Mock
private EmailService emailService;
@Mock
@@ -46,8 +43,8 @@ class AnalyticHelperServiceTests {
@BeforeEach
void setUp() {
try (AutoCloseable closeable = MockitoAnnotations.openMocks(this)) {
- analyticHelperService = new AnalyticHelperService(analyticsRepository, emailService,
- controlRulesValidators) {
+ analyticHelperService = new AbstractAnalyticHelperService(analyticsRepository,
+ emailService, controlRulesValidators) {
@Override
public List findAnalyticsByNameAndLevel(Pageable pageable,
@@ -71,29 +68,9 @@ public List findAnalyticsByNameAndLevelAndDate(String name,
}
}
- // @Test
- // public void findAllAnalyticsByLevel() {
- // var mockPageable = PageRequest.of(0, 10);
- // var mockLevel = "PCCC1";
- // var mockList = ANALYTICS_NAME_LIST;
- // LocalDateTime startDate = LocalDateTime.of(2024, 1, 1, 0, 0);
- // LocalDateTime endDate = LocalDateTime.of(2024, 1, 2, 0, 0);
- //
- // List expectedRecords =
- // createDateRangeRecords().stream().map(AnalyticMapper::toEntity).toList();
- // Page
- // when(analyticsRepository.findByNameInAndLevelAndDateBetween(mockList, mockLevel, startDate,
- // endDate, mockPageable))
- // .thenReturn(expectedRecords);
- //
- // analyticHelperService.findAnalyticsByNameInByLevelBaseMethod(mockList, mockLevel, startDate,
- // endDate, mockPageable);
- // verify(analyticsRepository).findByNameInAndLevelAndDateBetween(mockList, mockLevel,
- // startDate, endDate, mockPageable);
- // }
@Test
- public void updateAnalyticsMean() {
+ void updateAnalyticsMean() {
var mockDto = new UpdateAnalyticsMeanDTO("Glucose", "PCCC1", "076587", 1.0);
analyticHelperService.updateAnalyticsMeanByNameAndLevelAndLevelLot(mockDto.name(),
mockDto.level(), mockDto.levelLot(), mockDto.mean());