Enhance staff application flow with email verification checks, refined error handling, and improved user feedback in frontend and backend.
This commit is contained in:
+26
-36
@@ -38,45 +38,37 @@ public class ApplicationController implements ApplicationsApi {
|
||||
public ResponseEntity<FormResponseDto> submitStaffApplication(StaffApplicationDto staffApplicationDto) {
|
||||
UUID userUuid = AuthenticatedUuid.getAuthenticatedUserUuid();
|
||||
|
||||
String email = staffApplicationDto.getEmail() == null ? null : staffApplicationDto.getEmail().toLowerCase();
|
||||
Optional<EmailVerification> optionalEmail = fetchEmailVerification(userUuid, email);
|
||||
if (optionalEmail.isEmpty() || !optionalEmail.get().verified()) {
|
||||
log.warn("User {} attempted to submit an application without a verified email {}", userUuid, email);
|
||||
return ResponseEntity.badRequest().build();
|
||||
}
|
||||
|
||||
// Map and persist application
|
||||
StaffApplication application = staffApplicationDataMapper.map(userUuid, staffApplicationDto);
|
||||
saveApplication(application);
|
||||
|
||||
Optional<EmailVerification> optionalEmail = fetchEmailVerification(userUuid, application.email());
|
||||
boolean verified = optionalEmail.map(EmailVerification::verified).orElse(false);
|
||||
|
||||
boolean success = true;
|
||||
if (verified) {
|
||||
// Send mail first; only if sent, send to Discord, then mark as sent
|
||||
boolean mailSent = false;
|
||||
try {
|
||||
mailSent = staffApplicationMail.sendApplicationEmail(application);
|
||||
} catch (Exception e) {
|
||||
log.error("Error while sending staff application email for {}", application.id(), e);
|
||||
success = false;
|
||||
try {
|
||||
if (!staffApplicationMail.sendApplicationEmail(application)) {
|
||||
log.warn("Failed to send staff application email for {}", application.id());
|
||||
return ResponseEntity.internalServerError().build();
|
||||
}
|
||||
|
||||
if (mailSent) {
|
||||
try {
|
||||
staffApplicationDiscord.sendApplicationToDiscord(application);
|
||||
} catch (Exception e) {
|
||||
log.error("Failed to send staff application {} to Discord", application.id(), e);
|
||||
success = false;
|
||||
}
|
||||
} else {
|
||||
success = false;
|
||||
}
|
||||
|
||||
if (success) {
|
||||
markAsSent(application.id());
|
||||
}
|
||||
}
|
||||
|
||||
if (verified && !success) {
|
||||
} catch (Exception e) {
|
||||
log.error("Error while sending staff application email for {}", application.id(), e);
|
||||
return ResponseEntity.internalServerError().build();
|
||||
}
|
||||
|
||||
FormResponseDto response = buildResponse(application, verified);
|
||||
return ResponseEntity.status(201).body(response);
|
||||
try {
|
||||
staffApplicationDiscord.sendApplicationToDiscord(application);
|
||||
} catch (Exception e) {
|
||||
log.error("Failed to send staff application {} to Discord", application.id(), e);
|
||||
return ResponseEntity.internalServerError().build();
|
||||
}
|
||||
markAsSent(application.id());
|
||||
|
||||
FormResponseDto response = buildResponse(application);
|
||||
return ResponseEntity.status(200).body(response);
|
||||
}
|
||||
|
||||
private void saveApplication(StaffApplication application) {
|
||||
@@ -110,10 +102,8 @@ public class ApplicationController implements ApplicationsApi {
|
||||
.runQuery(sqlSession -> sqlSession.getMapper(StaffApplicationMapper.class).markAsSent(applicationId));
|
||||
}
|
||||
|
||||
private FormResponseDto buildResponse(StaffApplication application, boolean verified) {
|
||||
String message = verified
|
||||
? "Your staff application has been submitted. You will be notified when it has been reviewed."
|
||||
: "Application created. Please verify your email to complete submission.";
|
||||
private FormResponseDto buildResponse(StaffApplication application) {
|
||||
String message = "Your staff application has been submitted. You will be notified when it has been reviewed.";
|
||||
return new FormResponseDto(
|
||||
application.id().toString(),
|
||||
message,
|
||||
|
||||
Reference in New Issue
Block a user