From 177e0db393abcef321beb04eae5e38fba4e8ba05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Florczak?= <84631301+florczaq@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:07:13 +0200 Subject: [PATCH 1/2] Fix: Deleting different types of subjects --- .../repository/UserRepository.java | 3 +- .../UserAlreadyAssignedException.java | 7 +++ .../org/pkwmtt/otp/OTPExceptionHandler.java | 5 ++ src/main/java/org/pkwmtt/otp/OTPService.java | 46 +++++++++++++------ 4 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 src/main/java/org/pkwmtt/exceptions/UserAlreadyAssignedException.java diff --git a/src/main/java/org/pkwmtt/examCalendar/repository/UserRepository.java b/src/main/java/org/pkwmtt/examCalendar/repository/UserRepository.java index 9992798..6add845 100644 --- a/src/main/java/org/pkwmtt/examCalendar/repository/UserRepository.java +++ b/src/main/java/org/pkwmtt/examCalendar/repository/UserRepository.java @@ -5,7 +5,6 @@ import org.pkwmtt.examCalendar.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import java.util.Optional; @@ -15,8 +14,8 @@ public interface UserRepository extends JpaRepository { Optional findByGeneralGroup (GeneralGroup generalGroup); @Query("SELECT g.name FROM User u LEFT JOIN u.generalGroup g where u.email = :email") - Optional findGroupByUserEmail (@Param("email") String userEmail); @Transactional void deleteUserByEmail (String email); + } \ No newline at end of file diff --git a/src/main/java/org/pkwmtt/exceptions/UserAlreadyAssignedException.java b/src/main/java/org/pkwmtt/exceptions/UserAlreadyAssignedException.java new file mode 100644 index 0000000..56ef57f --- /dev/null +++ b/src/main/java/org/pkwmtt/exceptions/UserAlreadyAssignedException.java @@ -0,0 +1,7 @@ +package org.pkwmtt.exceptions; + +public class UserAlreadyAssignedException extends RuntimeException { + public UserAlreadyAssignedException (String message) { + super(message); + } +} diff --git a/src/main/java/org/pkwmtt/otp/OTPExceptionHandler.java b/src/main/java/org/pkwmtt/otp/OTPExceptionHandler.java index 1cfc14c..6494829 100644 --- a/src/main/java/org/pkwmtt/otp/OTPExceptionHandler.java +++ b/src/main/java/org/pkwmtt/otp/OTPExceptionHandler.java @@ -19,6 +19,11 @@ public ResponseEntity handleBadRequests (Exception e) { return new ResponseEntity<>(new ErrorResponseDTO(e.getMessage()), HttpStatus.BAD_REQUEST); } + @ExceptionHandler(UserAlreadyAssignedException.class) + public ResponseEntity handleConflict (Exception e) { + return new ResponseEntity<>(new ErrorResponseDTO(e.getMessage()), HttpStatus.CONFLICT); + } + @ExceptionHandler({MailCouldNotBeSendException.class}) public ResponseEntity handleServerErrors (Exception e) { return new ResponseEntity<>(new ErrorResponseDTO(e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR); diff --git a/src/main/java/org/pkwmtt/otp/OTPService.java b/src/main/java/org/pkwmtt/otp/OTPService.java index 1f4b073..0d9a6b9 100644 --- a/src/main/java/org/pkwmtt/otp/OTPService.java +++ b/src/main/java/org/pkwmtt/otp/OTPService.java @@ -57,40 +57,54 @@ public void sendOTPCodesForManyGroups (List requests) throws MailCouldNotBeSendException, WrongArgumentException, SpecifiedSubGroupDoesntExistsException, IllegalArgumentException { requests.forEach(this::sendOtpCode); } - - public void sendOtpCode(OTPRequest request) - throws MailCouldNotBeSendException, WrongArgumentException, SpecifiedSubGroupDoesntExistsException, IllegalArgumentException { + + public void sendOtpCode (OTPRequest request) + throws MailCouldNotBeSendException, WrongArgumentException, SpecifiedSubGroupDoesntExistsException, IllegalArgumentException { var code = generateNewCode(); var mail = createMail(request, code); var groupName = request.getGeneralGroupName(); var groupNameLength = groupName.length(); - - if (groupNameLength > 3 && Character.isDigit(groupName.charAt(groupNameLength - 1))) { //Check general group name + + if (groupNameLength > 3 && Character.isDigit( + groupName.charAt(groupNameLength - 1))) { //Check general group name throw new WrongArgumentException( "Wrong general group provided. Make sure you are not providing subgroup. (f.e 12K1 -> wrong, 12K -> good)"); } - + if (!generalGroupExists(groupName)) { // Check if general group with provided name exists throw new SpecifiedGeneralGroupDoesntExistsException(); } - + var generalGroup = generalGroupRepository.findByName(groupName); - + if (generalGroup.isPresent()) { //Check if general group is already saved in database - if (otpRepository.existsOTPCodeByGeneralGroup(generalGroup.get())) { //Check if provided general group has assigned code + if (otpRepository.existsOTPCodeByGeneralGroup( + generalGroup.get())) { //Check if provided general group has assigned code otpRepository.deleteByGeneralGroup(generalGroup.get()); // Delete existing code } } else { //Save general group to database generalGroup = Optional.of(generalGroupRepository.save(new GeneralGroup(null, groupName))); } - + + var userByEmail = userRepository.findByEmail(request.getEmail()); + + //Check if user isn't already assigned to different general group + if (userByEmail.isPresent()) { + if (!userByEmail.get() + .getGeneralGroup() + .equals(generalGroup.get())) { + throw new UserAlreadyAssignedException( + "User with this email is already assigned to different group."); + } + } + try { emailService.send(mail); //Send email } catch (MessagingException e) { throw new MailCouldNotBeSendException("Couldn't send mail for group: " + groupName); } - + var user = User .builder() .email(request.getEmail()) @@ -98,15 +112,19 @@ public void sendOtpCode(OTPRequest request) .role(Role.REPRESENTATIVE) .isActive(true) .build(); - + + + + + userRepository .findByGeneralGroup(generalGroup.get()) .ifPresent(value -> userRepository.deleteUserByEmail(value.getEmail())); - + userRepository.save(user); otpRepository.save(new OTPCode(code, generalGroup.get())); } - + private GeneralGroup getGeneralGroupAssignedToCode (String code) throws OTPCodeNotFoundException, WrongOTPFormatException { this.validateCode(code); From 754f5c8d4deb593f3e2e6f92f100b8c8d558fd10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Florczak?= <84631301+florczaq@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:15:57 +0200 Subject: [PATCH 2/2] Fix: Correct Test --- src/test/java/org/pkwmtt/otp/OTPServiceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/pkwmtt/otp/OTPServiceTest.java b/src/test/java/org/pkwmtt/otp/OTPServiceTest.java index 9fa98fc..10814aa 100644 --- a/src/test/java/org/pkwmtt/otp/OTPServiceTest.java +++ b/src/test/java/org/pkwmtt/otp/OTPServiceTest.java @@ -50,7 +50,7 @@ class OTPServiceTest { @Test void shouldSendCorrectMailWithRepresentativePayload () { //given - List requests = List.of(new OTPRequest("test@localhost", "12K")); + List requests = List.of(new OTPRequest("test2@localhost", "12K")); Pattern pattern = Pattern.compile("[A-Z0-9]{6}"); //when otpService.sendOTPCodesForManyGroups(requests); @@ -61,7 +61,7 @@ void shouldSendCorrectMailWithRepresentativePayload () { MimeMessage receivedMessage = greenMail.getReceivedMessages()[0]; assertEquals("Kod Starosty 12K", receivedMessage.getSubject()); - assertEquals("test@localhost", receivedMessage.getAllRecipients()[0].toString()); + assertEquals("test2@localhost", receivedMessage.getAllRecipients()[0].toString()); Matcher matcher = pattern.matcher(Objects.requireNonNull(extractBody(receivedMessage))); assertTrue(matcher.find());