Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -15,8 +14,8 @@ public interface UserRepository extends JpaRepository<User, Integer> {
Optional<User> findByGeneralGroup (GeneralGroup generalGroup);

@Query("SELECT g.name FROM User u LEFT JOIN u.generalGroup g where u.email = :email")
Optional<String> findGroupByUserEmail (@Param("email") String userEmail);

@Transactional
void deleteUserByEmail (String email);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.pkwmtt.exceptions;

public class UserAlreadyAssignedException extends RuntimeException {
public UserAlreadyAssignedException (String message) {
super(message);
}
}
5 changes: 5 additions & 0 deletions src/main/java/org/pkwmtt/otp/OTPExceptionHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ public ResponseEntity<ErrorResponseDTO> handleBadRequests (Exception e) {
return new ResponseEntity<>(new ErrorResponseDTO(e.getMessage()), HttpStatus.BAD_REQUEST);
}

@ExceptionHandler(UserAlreadyAssignedException.class)
public ResponseEntity<ErrorResponseDTO> handleConflict (Exception e) {
return new ResponseEntity<>(new ErrorResponseDTO(e.getMessage()), HttpStatus.CONFLICT);
}

@ExceptionHandler({MailCouldNotBeSendException.class})
public ResponseEntity<ErrorResponseDTO> handleServerErrors (Exception e) {
return new ResponseEntity<>(new ErrorResponseDTO(e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
Expand Down
46 changes: 32 additions & 14 deletions src/main/java/org/pkwmtt/otp/OTPService.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,56 +57,74 @@ public void sendOTPCodesForManyGroups (List<OTPRequest> 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())
.generalGroup(generalGroup.get())
.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);
Expand Down
4 changes: 2 additions & 2 deletions src/test/java/org/pkwmtt/otp/OTPServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class OTPServiceTest {
@Test
void shouldSendCorrectMailWithRepresentativePayload () {
//given
List<OTPRequest> requests = List.of(new OTPRequest("test@localhost", "12K"));
List<OTPRequest> requests = List.of(new OTPRequest("test2@localhost", "12K"));
Pattern pattern = Pattern.compile("[A-Z0-9]{6}");
//when
otpService.sendOTPCodesForManyGroups(requests);
Expand All @@ -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());
Expand Down