From 71eae6b2398ff701dd8d6b4d720557f8e9c7acc6 Mon Sep 17 00:00:00 2001 From: Sven F <9976560+sven1103@users.noreply.github.com> Date: Mon, 1 Jul 2024 08:20:06 +0200 Subject: [PATCH 1/2] Fix singleton UI scope for password reset use case (#654) --------- Co-authored-by: Steffengreiner --- .../user/registration/ConfirmEmailInput.java | 18 --- .../user/registration/ConfirmEmailOutput.java | 14 --- .../EmailAddressConfirmation.java | 38 ------ .../user/registration/RegisterUserInput.java | 30 ----- .../user/registration/RegisterUserOutput.java | 27 ---- .../java/life/qbic/datamanager/AppConfig.java | 8 +- .../life/qbic/datamanager/Application.java | 23 ---- .../datamanager/views/login/LoginHandler.java | 102 +-------------- .../views/login/LoginHandlerInterface.java | 28 ----- .../datamanager/views/login/LoginLayout.java | 118 +++++++++++++++--- .../login/newpassword/NewPasswordHandler.java | 69 +--------- .../NewPasswordHandlerInterface.java | 30 ----- .../login/newpassword/NewPasswordLayout.java | 101 ++++++++++++--- .../newpassword/NewPasswordSetLayout.java | 2 +- .../login/passwordreset/LinkSentLayout.java | 2 +- .../passwordreset/PasswordResetHandler.java | 95 -------------- .../PasswordResetHandlerInterface.java | 20 --- .../passwordreset/ResetPasswordLayout.java | 79 +++++++++++- 18 files changed, 277 insertions(+), 527 deletions(-) delete mode 100644 identity/src/main/java/life/qbic/identity/application/user/registration/ConfirmEmailInput.java delete mode 100644 identity/src/main/java/life/qbic/identity/application/user/registration/ConfirmEmailOutput.java delete mode 100644 identity/src/main/java/life/qbic/identity/application/user/registration/EmailAddressConfirmation.java delete mode 100644 identity/src/main/java/life/qbic/identity/application/user/registration/RegisterUserInput.java delete mode 100644 identity/src/main/java/life/qbic/identity/application/user/registration/RegisterUserOutput.java delete mode 100644 user-interface/src/main/java/life/qbic/datamanager/views/login/LoginHandlerInterface.java delete mode 100644 user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordHandlerInterface.java delete mode 100644 user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/PasswordResetHandler.java delete mode 100644 user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/PasswordResetHandlerInterface.java diff --git a/identity/src/main/java/life/qbic/identity/application/user/registration/ConfirmEmailInput.java b/identity/src/main/java/life/qbic/identity/application/user/registration/ConfirmEmailInput.java deleted file mode 100644 index 49e64780c..000000000 --- a/identity/src/main/java/life/qbic/identity/application/user/registration/ConfirmEmailInput.java +++ /dev/null @@ -1,18 +0,0 @@ -package life.qbic.identity.application.user.registration; - -/** - * Confirm Email use case input - * - * @since 1.0.0 - */ -public interface ConfirmEmailInput { - - /** - * Confirms the user's mail address - * - * @param userID the user whose mail address is to be confirmed - * @since 1.0.0 - */ - void confirmEmailAddress(String userID); - -} diff --git a/identity/src/main/java/life/qbic/identity/application/user/registration/ConfirmEmailOutput.java b/identity/src/main/java/life/qbic/identity/application/user/registration/ConfirmEmailOutput.java deleted file mode 100644 index 30047e12e..000000000 --- a/identity/src/main/java/life/qbic/identity/application/user/registration/ConfirmEmailOutput.java +++ /dev/null @@ -1,14 +0,0 @@ -package life.qbic.identity.application.user.registration; - -/** - * Confirm Email use case output - * - * @since 1.0.0 - */ -public interface ConfirmEmailOutput { - - void onEmailConfirmationSuccess(); - - void onEmailConfirmationFailure(String reason); - -} diff --git a/identity/src/main/java/life/qbic/identity/application/user/registration/EmailAddressConfirmation.java b/identity/src/main/java/life/qbic/identity/application/user/registration/EmailAddressConfirmation.java deleted file mode 100644 index 876499e70..000000000 --- a/identity/src/main/java/life/qbic/identity/application/user/registration/EmailAddressConfirmation.java +++ /dev/null @@ -1,38 +0,0 @@ -package life.qbic.identity.application.user.registration; - -import java.util.Objects; -import life.qbic.identity.application.user.IdentityService; -import life.qbic.identity.application.user.UserNotFoundException; - -/** - * Email Address Confirmation use case - *

- * Activates a user with a given user id. - * - * @since 1.0.0 - */ -public class EmailAddressConfirmation implements ConfirmEmailInput { - - private ConfirmEmailOutput confirmEmailOutput; - - private final IdentityService identityService; - - public EmailAddressConfirmation(IdentityService identityService) { - this.identityService = Objects.requireNonNull(identityService); - } - - public void setConfirmEmailOutput(ConfirmEmailOutput confirmEmailOutput) { - this.confirmEmailOutput = confirmEmailOutput; - } - - @Override - public void confirmEmailAddress(String userID) { - Objects.requireNonNull(confirmEmailOutput, "No use case output was set yet"); - try { - identityService.confirmUserEmail(userID); - confirmEmailOutput.onEmailConfirmationSuccess(); - } catch (UserNotFoundException e) { - confirmEmailOutput.onEmailConfirmationFailure("Unknown user"); - } - } -} diff --git a/identity/src/main/java/life/qbic/identity/application/user/registration/RegisterUserInput.java b/identity/src/main/java/life/qbic/identity/application/user/registration/RegisterUserInput.java deleted file mode 100644 index f72c834c0..000000000 --- a/identity/src/main/java/life/qbic/identity/application/user/registration/RegisterUserInput.java +++ /dev/null @@ -1,30 +0,0 @@ -package life.qbic.identity.application.user.registration; - -/** - * Input interface to register a new user in the application. - * - * @since 1.0.0 - */ -public interface RegisterUserInput { - - /** - * Registers a new user in the application. - * - *

The raw password passed needs to be cleared, after it has been successfully processed. - * - * @param fullName the full name of the user - * @param email the user's mail address - * @param rawPassword the user selected raw password for authentication - * @param userName - * @since 1.0.0 - */ - void register(String fullName, String email, char[] rawPassword, String userName); - - /** - * Set the output the use case shall call, when finished. - * - * @param output the output to call when the registration has been performed - * @since 1.0.0 - */ - void setOutput(RegisterUserOutput output); -} diff --git a/identity/src/main/java/life/qbic/identity/application/user/registration/RegisterUserOutput.java b/identity/src/main/java/life/qbic/identity/application/user/registration/RegisterUserOutput.java deleted file mode 100644 index b32e11649..000000000 --- a/identity/src/main/java/life/qbic/identity/application/user/registration/RegisterUserOutput.java +++ /dev/null @@ -1,27 +0,0 @@ -package life.qbic.identity.application.user.registration; - -/** - * Output interface for the user registration use case - * - * @since 1.0.0 - */ -public interface RegisterUserOutput { - - /** - * Callback is executed, when the user registration has been successful. - * - * @since 1.0.0 - */ - void onUserRegistrationSucceeded(); - - /** - * Callback is executed, when the user registration failed. - * - * @param userRegistrationException the Exception containing the reasons for the user registration - * failure - * @since 1.0.0 - */ - void onUnexpectedFailure(UserRegistrationException userRegistrationException); - - void onUnexpectedFailure(String reason); -} diff --git a/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java b/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java index fdf93849c..4c68912b7 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java +++ b/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java @@ -19,7 +19,6 @@ import life.qbic.identity.application.user.policy.directive.WhenUserActivatedSubmitIntegrationEvent; import life.qbic.identity.application.user.policy.directive.WhenUserRegisteredSendConfirmationEmail; import life.qbic.identity.application.user.policy.directive.WhenUserRegisteredSubmitIntegrationEvent; -import life.qbic.identity.application.user.registration.EmailAddressConfirmation; import life.qbic.identity.domain.repository.UserDataStorage; import life.qbic.identity.domain.repository.UserRepository; import life.qbic.infrastructure.email.EmailServiceProvider; @@ -41,11 +40,11 @@ import life.qbic.projectmanagement.application.policy.MeasurementUpdatedPolicy; import life.qbic.projectmanagement.application.policy.OfferAddedPolicy; import life.qbic.projectmanagement.application.policy.ProjectAccessGrantedPolicy; +import life.qbic.projectmanagement.application.policy.ProjectChangedPolicy; import life.qbic.projectmanagement.application.policy.ProjectRegisteredPolicy; import life.qbic.projectmanagement.application.policy.QCAddedPolicy; import life.qbic.projectmanagement.application.policy.SampleDeletedPolicy; import life.qbic.projectmanagement.application.policy.SampleRegisteredPolicy; -import life.qbic.projectmanagement.application.policy.ProjectChangedPolicy; import life.qbic.projectmanagement.application.policy.directive.AddSampleToBatch; import life.qbic.projectmanagement.application.policy.directive.CreateNewSampleStatisticsEntry; import life.qbic.projectmanagement.application.policy.directive.DeleteSampleFromBatch; @@ -89,11 +88,6 @@ public class AppConfig { Section starts below */ - @Bean - public EmailAddressConfirmation confirmEmailInput( - IdentityService identityService) { - return new EmailAddressConfirmation(identityService); - } @Bean public IdentityService userRegistrationService( diff --git a/user-interface/src/main/java/life/qbic/datamanager/Application.java b/user-interface/src/main/java/life/qbic/datamanager/Application.java index 42e7a0093..af8b5c903 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/Application.java +++ b/user-interface/src/main/java/life/qbic/datamanager/Application.java @@ -6,22 +6,15 @@ import com.vaadin.flow.server.PWA; import com.vaadin.flow.theme.Theme; import java.io.Serial; -import life.qbic.datamanager.views.login.LoginHandler; import life.qbic.datamanager.views.login.newpassword.NewPasswordHandler; -import life.qbic.datamanager.views.login.passwordreset.PasswordResetHandler; import life.qbic.identity.application.user.password.NewPassword; import life.qbic.identity.application.user.password.NewPasswordOutput; -import life.qbic.identity.application.user.password.PasswordResetOutput; -import life.qbic.identity.application.user.password.PasswordResetRequest; -import life.qbic.identity.application.user.registration.ConfirmEmailOutput; -import life.qbic.identity.application.user.registration.EmailAddressConfirmation; import life.qbic.identity.domain.registry.DomainRegistry; import life.qbic.identity.domain.repository.UserRepository; import life.qbic.identity.domain.service.UserDomainService; import life.qbic.logging.api.Logger; import life.qbic.logging.service.LoggerFactory; import life.qbic.projectmanagement.application.DataRepoConnectionTester; -import org.springframework.beans.BeansException; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration; @@ -70,21 +63,5 @@ public static void main(String[] args) { // We need to set up the domain registry and register important services: var userRepository = appContext.getBean(UserRepository.class); DomainRegistry.instance().registerService(new UserDomainService(userRepository)); - - setupUseCases(appContext); - } - - private static void setupUseCases(ConfigurableApplicationContext context) { - var emailAddressConfirmation = context.getBean(EmailAddressConfirmation.class); - var loginHandler = (ConfirmEmailOutput) context.getBean(LoginHandler.class); - emailAddressConfirmation.setConfirmEmailOutput(loginHandler); - - var passwordReset = context.getBean(PasswordResetRequest.class); - var passwordResetHandler = (PasswordResetOutput) context.getBean(PasswordResetHandler.class); - passwordReset.setUseCaseOutput(passwordResetHandler); - - var newPassword = context.getBean(NewPassword.class); - var newPasswordHandler = (NewPasswordOutput) context.getBean(NewPasswordHandler.class); - newPassword.setUseCaseOutput(newPasswordHandler); } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginHandler.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginHandler.java index 3b80a7b3d..d1c2999e9 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginHandler.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginHandler.java @@ -1,15 +1,7 @@ package life.qbic.datamanager.views.login; -import com.vaadin.flow.router.BeforeEvent; -import java.util.List; -import java.util.Map; +import java.util.Objects; import life.qbic.datamanager.Application; -import life.qbic.datamanager.views.AppRoutes; -import life.qbic.datamanager.views.AppRoutes.Projects; -import life.qbic.datamanager.views.notifications.ErrorMessage; -import life.qbic.datamanager.views.notifications.InformationMessage; -import life.qbic.identity.application.user.registration.ConfirmEmailInput; -import life.qbic.identity.application.user.registration.ConfirmEmailOutput; import life.qbic.logging.api.Logger; import life.qbic.logging.service.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -22,102 +14,20 @@ * @since 1.0.0 */ @Component -public class LoginHandler implements LoginHandlerInterface, ConfirmEmailOutput { +public class LoginHandler { private static final Logger logger = LoggerFactory.logger(Application.class.getName()); - private LoginLayout registeredLoginView; - - private final ConfirmEmailInput confirmEmailInput; private final String emailConfirmationParameter; @Autowired - LoginHandler(ConfirmEmailInput confirmEmailInput, - @Value("${EMAIL_CONFIRMATION_PARAMETER:confirm-email}") String emailConfirmationParameter) { - this.confirmEmailInput = confirmEmailInput; - this.emailConfirmationParameter = emailConfirmationParameter; - } - - @Override - public void handle(LoginLayout loginView) { - if (registeredLoginView != loginView) { - registeredLoginView = loginView; - } - initFields(); - addListener(); - } - - private void initFields() { - clearNotifications(); - } - - private void showInvalidCredentialsError() { - showError("Incorrect username or password", "Please try again."); - } - - private void showEmailConfirmationInformation() { - showInformation("Email address confirmed", "You can now login with your credentials."); - } - - private void showEmailConfirmationReminder() { - showInformation("Registration mail sent", - "Please check your mail inbox to confirm your registration"); - } - - public void clearNotifications() { - registeredLoginView.notificationLayout.removeAll(); - } - - public void showError(String title, String description) { - clearNotifications(); - ErrorMessage errorMessage = new ErrorMessage(title, description); - registeredLoginView.notificationLayout.add(errorMessage); - } - - public void showInformation(String title, String description) { - clearNotifications(); - InformationMessage informationMessage = new InformationMessage(title, description); - registeredLoginView.notificationLayout.add(informationMessage); - } - - private void addListener() { - registeredLoginView.addLoginListener(it -> - onLoginSucceeded()); - registeredLoginView.addForgotPasswordListener( - it -> it.getSource().getUI().ifPresent(ui -> ui.navigate(AppRoutes.RESET_PASSWORD))); - } - - private void onLoginSucceeded() { - clearNotifications(); - registeredLoginView.getUI().ifPresentOrElse( - ui -> ui.navigate(Projects.PROJECTS), - () -> logger.error("No UI found!")); + LoginHandler(@Value("${EMAIL_CONFIRMATION_PARAMETER:confirm-email}") String emailConfirmationParameter) { + this.emailConfirmationParameter = Objects.requireNonNull(emailConfirmationParameter); } - @Override - public void handle(BeforeEvent beforeEvent) { - Map> queryParams = beforeEvent.getLocation().getQueryParameters() - .getParameters(); - if (queryParams.containsKey("error")) { - showInvalidCredentialsError(); - } - if (queryParams.containsKey(emailConfirmationParameter)) { - String userId = queryParams.get(emailConfirmationParameter).iterator().next(); - confirmEmailInput.confirmEmailAddress(userId); - } - if (queryParams.containsKey("userRegistered")) { - showEmailConfirmationReminder(); - } + public String emailConfirmationParameter() { + return emailConfirmationParameter; } - @Override - public void onEmailConfirmationSuccess() { - showEmailConfirmationInformation(); - } - - @Override - public void onEmailConfirmationFailure(String reason) { - showError("Email confirmation failed", reason); - } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginHandlerInterface.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginHandlerInterface.java deleted file mode 100644 index 17c514955..000000000 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginHandlerInterface.java +++ /dev/null @@ -1,28 +0,0 @@ -package life.qbic.datamanager.views.login; - -import com.vaadin.flow.router.BeforeEvent; - -/** - * Interface to handle the {@link LoginLayout} to the {@link LoginHandler}. - * - * @since 1.0.0 - */ -public interface LoginHandlerInterface { - - /** - * Register the {@link LoginLayout} to the implementing class - * - * @param loginView The view that is being registered - * @since 1.0.0 - */ - void handle(LoginLayout loginView); - - /** - * Passes a before event to the handler, so that the handler can decide how to react and - * orchestrate the layout properly. - * - * @param beforeEvent an event triggered before the router navigates to the view - * @since 1.0.0 - */ - void handle(BeforeEvent beforeEvent); -} diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginLayout.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginLayout.java index 225318506..da521bff0 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginLayout.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/login/LoginLayout.java @@ -1,5 +1,7 @@ package life.qbic.datamanager.views.login; +import static life.qbic.logging.service.LoggerFactory.logger; + import com.vaadin.flow.component.ComponentEventListener; import com.vaadin.flow.component.Text; import com.vaadin.flow.component.dependency.CssImport; @@ -16,9 +18,19 @@ import com.vaadin.flow.router.Route; import com.vaadin.flow.router.RouterLink; import com.vaadin.flow.server.auth.AnonymousAllowed; +import com.vaadin.flow.spring.annotation.UIScope; +import java.util.List; +import java.util.Map; +import java.util.Objects; import life.qbic.datamanager.views.AppRoutes; +import life.qbic.datamanager.views.AppRoutes.Projects; import life.qbic.datamanager.views.landing.LandingPageLayout; +import life.qbic.datamanager.views.notifications.ErrorMessage; +import life.qbic.datamanager.views.notifications.InformationMessage; import life.qbic.datamanager.views.register.UserRegistrationLayout; +import life.qbic.identity.application.user.IdentityService; +import life.qbic.identity.application.user.UserNotFoundException; +import life.qbic.logging.api.Logger; import org.springframework.beans.factory.annotation.Autowired; /** @@ -30,24 +42,27 @@ @Route(value = AppRoutes.LOGIN, layout = LandingPageLayout.class) @CssImport("./styles/views/login/login-view.css") @AnonymousAllowed +@UIScope public class LoginLayout extends VerticalLayout implements HasUrlParameter { - private VerticalLayout contentLayout; - + private static final Logger log = logger(LoginLayout.class); + private final String emailConfirmationParameter; public VerticalLayout notificationLayout; + private VerticalLayout contentLayout; private H2 title; - private ConfigurableLoginForm loginForm; - private Div registrationSection; + private final IdentityService identityService; - private final transient LoginHandlerInterface viewHandler; - - public LoginLayout(@Autowired LoginHandlerInterface loginHandlerInterface) { + public LoginLayout(@Autowired LoginHandler loginHandler, + @Autowired IdentityService identityService) { + Objects.requireNonNull(loginHandler); + this.identityService = Objects.requireNonNull(identityService); + emailConfirmationParameter = loginHandler.emailConfirmationParameter(); initLayout(); styleLayout(); - viewHandler = loginHandlerInterface; - registerToHandler(viewHandler); + initFields(); + addListener(); } private void initLayout() { @@ -59,11 +74,7 @@ private void initLayout() { contentLayout.add(title, notificationLayout, loginForm, registrationSection); add(contentLayout); } - - private void registerToHandler(LoginHandlerInterface loginHandler) { - loginHandler.handle(this); - } - + private void styleLayout() { styleNotificationLayout(); styleFormLayout(); @@ -121,6 +132,83 @@ public void addForgotPasswordListener(ComponentEventListener + onLoginSucceeded()); + addForgotPasswordListener( + it -> it.getSource().getUI().ifPresent(ui -> ui.navigate(AppRoutes.RESET_PASSWORD))); + } + + private void onLoginSucceeded() { + clearNotifications(); + getUI().ifPresentOrElse( + ui -> ui.navigate(Projects.PROJECTS), + () -> log.error("No UI found!")); + } + + public void handle(BeforeEvent beforeEvent) { + Map> queryParams = beforeEvent.getLocation().getQueryParameters() + .getParameters(); + if (queryParams.containsKey("error")) { + showInvalidCredentialsError(); + } + if (queryParams.containsKey(emailConfirmationParameter)) { + String userId = queryParams.get(emailConfirmationParameter).iterator().next(); + try { + identityService.confirmUserEmail(userId); + onEmailConfirmationSuccess(); + } catch (UserNotFoundException e) { + log.error("User %s not found!".formatted(userId), e); + onEmailConfirmationFailure("Unknown user for request. If the issue persists, please contact our helpdesk."); + } + + } + if (queryParams.containsKey("userRegistered")) { + showEmailConfirmationReminder(); + } + } + + public void onEmailConfirmationSuccess() { + showEmailConfirmationInformation(); + } + + public void onEmailConfirmationFailure(String reason) { + showError("Email confirmation failed", reason); } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordHandler.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordHandler.java index f880f03d5..2f6b0c592 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordHandler.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordHandler.java @@ -1,13 +1,5 @@ package life.qbic.datamanager.views.login.newpassword; -import com.vaadin.flow.component.Key; -import com.vaadin.flow.router.BeforeEvent; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import life.qbic.identity.application.user.password.NewPasswordInput; -import life.qbic.identity.application.user.password.NewPasswordOutput; -import org.apache.commons.lang3.NotImplementedException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -20,70 +12,17 @@ * @since 1.0.0 */ @Component -public class NewPasswordHandler implements NewPasswordHandlerInterface, NewPasswordOutput { - - private String currentUserId; - - private NewPasswordLayout newPasswordLayout; - private final NewPasswordInput passwordReset; +public class NewPasswordHandler { private final String passwordResetQueryParameter; @Autowired - NewPasswordHandler(NewPasswordInput newPasswordUseCase, - @Value("${password-reset-parameter}") String newPasswordParam) { - this.passwordReset = newPasswordUseCase; - this.currentUserId = ""; + NewPasswordHandler(@Value("${password-reset-parameter}") String newPasswordParam) { this.passwordResetQueryParameter = newPasswordParam; } - @Override - public void handle(NewPasswordLayout layout) { - if (newPasswordLayout != layout) { - this.newPasswordLayout = layout; - addClickListeners(); - } - } - - @Override - public void handle(BeforeEvent beforeEvent) { - Map> params = beforeEvent.getLocation().getQueryParameters() - .getParameters(); - var resetParam = params.keySet().stream() - .filter(entry -> Objects.equals( - entry, passwordResetQueryParameter)).findAny(); - if (resetParam.isPresent()) { - currentUserId = params.get(passwordResetQueryParameter).get(0); - } else { - throw new NotImplementedException(); - } - } - - private void addClickListeners() { - newPasswordLayout.sendButton().addClickListener(buttonClickEvent -> - passwordReset.setNewUserPassword(currentUserId, - newPasswordLayout.newPassword().getValue().toCharArray())); - newPasswordLayout.sendButton().addClickShortcut(Key.ENTER); - - newPasswordLayout.newPasswordSetLayout().loginButton().addClickListener( - buttonClickEvent -> - newPasswordLayout.newPasswordSetLayout().getUI() - .ifPresent(ui -> ui.navigate("login"))); - } - - @Override - public void onSuccessfulNewPassword() { - newPasswordLayout.provideNewPasswordLayout().setVisible(false); - newPasswordLayout.newPasswordSetLayout().setVisible(true); + public String passwordResetQueryParameter() { + return passwordResetQueryParameter; } - @Override - public void onPasswordValidationFailure() { - throw new UnsupportedOperationException(); - } - - @Override - public void onUnexpectedFailure() { - throw new UnsupportedOperationException(); - } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordHandlerInterface.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordHandlerInterface.java deleted file mode 100644 index e280f3058..000000000 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordHandlerInterface.java +++ /dev/null @@ -1,30 +0,0 @@ -package life.qbic.datamanager.views.login.newpassword; - -import com.vaadin.flow.router.BeforeEvent; - -/** - * Handles the {@link NewPasswordLayout} components - * - *

This class is responsible for enabling buttons or triggering other view relevant changes on - * the view class components - * - * @since 1.0.0 - */ -public interface NewPasswordHandlerInterface { - - /** - * Registers a {@link NewPasswordLayout} to an implementing class - * - * @param registerLayout The view that is being handled - * @since 1.0.0 - */ - void handle(NewPasswordLayout registerLayout); - - /** - * Notifies the handler about {@link BeforeEvent }. - * - * @param beforeEvent a before event from the registered layout - * @since 1.0.0 - */ - void handle(BeforeEvent beforeEvent); -} diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordLayout.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordLayout.java index b08867934..56ecaa359 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordLayout.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordLayout.java @@ -1,5 +1,8 @@ package life.qbic.datamanager.views.login.newpassword; +import static life.qbic.logging.service.LoggerFactory.logger; + +import com.vaadin.flow.component.Key; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.button.ButtonVariant; import com.vaadin.flow.component.orderedlayout.VerticalLayout; @@ -10,10 +13,20 @@ import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import com.vaadin.flow.server.auth.AnonymousAllowed; +import com.vaadin.flow.spring.annotation.UIScope; import java.io.Serial; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Predicate; +import life.qbic.application.commons.Result; import life.qbic.datamanager.views.AppRoutes; import life.qbic.datamanager.views.landing.LandingPageLayout; import life.qbic.datamanager.views.layouts.BoxLayout; +import life.qbic.identity.application.user.IdentityService; +import life.qbic.identity.domain.model.EncryptedPassword.PasswordValidationException; +import life.qbic.logging.api.Logger; +import org.apache.commons.lang3.NotImplementedException; import org.springframework.beans.factory.annotation.Autowired; @@ -25,22 +38,31 @@ @PageTitle("New Password") @Route(value = AppRoutes.NEW_PASSWORD, layout = LandingPageLayout.class) @AnonymousAllowed +@UIScope public class NewPasswordLayout extends VerticalLayout implements HasUrlParameter { + private static final Logger log = logger(NewPasswordLayout.class); + @Serial private static final long serialVersionUID = 4884878964166607894L; + private final IdentityService identityService; private PasswordField newPassword; private Button sendButton; private BoxLayout provideNewPasswordLayout; private NewPasswordSetLayout newPasswordSetLayout; - private transient NewPasswordHandlerInterface handlerInterface; + private transient String currentUserId; + + private final NewPasswordHandler newPasswordHandler; - public NewPasswordLayout(@Autowired NewPasswordHandlerInterface passwordResetHandler) { + public NewPasswordLayout(@Autowired NewPasswordHandler newPasswordHandler, + @Autowired IdentityService identityService) { + this.newPasswordHandler = Objects.requireNonNull(newPasswordHandler); + this.identityService = Objects.requireNonNull(identityService); initLayout(); styleLayout(); - registerToHandler(passwordResetHandler); + addClickListeners(); } public PasswordField newPassword() { @@ -59,15 +81,6 @@ public NewPasswordSetLayout newPasswordSetLayout() { return newPasswordSetLayout; } - public NewPasswordHandlerInterface handlerInterface() { - return handlerInterface; - } - - private void registerToHandler(NewPasswordHandlerInterface passwordResetHandler) { - passwordResetHandler.handle(this); - handlerInterface = passwordResetHandler; - } - private void initLayout() { initPasswordSetLayout(); @@ -99,7 +112,6 @@ private void styleLayout() { styleFieldLayout(); styleSendButton(); - setSizeFull(); setAlignItems(Alignment.CENTER); setJustifyContentMode(JustifyContentMode.CENTER); } @@ -119,6 +131,67 @@ private void styleSendButton() { @Override public void setParameter(BeforeEvent beforeEvent, @OptionalParameter String parameter) { - handlerInterface.handle(beforeEvent); + handle(beforeEvent); + } + + public void handle(BeforeEvent beforeEvent) { + Map> params = beforeEvent.getLocation().getQueryParameters() + .getParameters(); + var resetParam = params.keySet().stream() + .filter(entry -> Objects.equals( + entry, newPasswordHandler.passwordResetQueryParameter())).findAny(); + if (resetParam.isPresent()) { + currentUserId = params.get(newPasswordHandler.passwordResetQueryParameter()).get(0); + } else { + throw new NotImplementedException(); + } + } + + private void addClickListeners() { + sendButton().addClickListener(buttonClickEvent -> { + Result applicationResponse = identityService.newUserPassword(currentUserId, + newPassword().getValue().toCharArray()); + if (applicationResponse.isError()) { + handleNewPasswordError(applicationResponse); + } + handleSuccess(); + } + ); + sendButton().addClickShortcut(Key.ENTER); + + newPasswordSetLayout().loginButton().addClickListener( + buttonClickEvent -> + newPasswordSetLayout().getUI() + .ifPresent(ui -> ui.navigate("login"))); + } + + private void handleNewPasswordError(Result applicationResponse) { + Predicate isPasswordValidationException = e -> e instanceof PasswordValidationException; + applicationResponse + .onErrorMatching(isPasswordValidationException, ignored -> { + log.error("Could not set new password for user."); + onPasswordValidationFailure(); + }) + .onErrorMatching(isPasswordValidationException.negate(), ignored -> { + log.error("Unexpected failure on password reset for user."); + onUnexpectedFailure(); + }); + } + + private void handleSuccess() { + onSuccessfulNewPassword(); + } + + public void onSuccessfulNewPassword() { + provideNewPasswordLayout().setVisible(false); + newPasswordSetLayout().setVisible(true); + } + + public void onPasswordValidationFailure() { + throw new UnsupportedOperationException(); + } + + public void onUnexpectedFailure() { + throw new UnsupportedOperationException(); } } diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordSetLayout.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordSetLayout.java index fde1646e8..5accdfb09 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordSetLayout.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/login/newpassword/NewPasswordSetLayout.java @@ -9,7 +9,7 @@ * * @since 1.0.0 */ -public class NewPasswordSetLayout extends BoxLayout { +class NewPasswordSetLayout extends BoxLayout { private Button loginButton; diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/LinkSentLayout.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/LinkSentLayout.java index 059169c42..e889d60c0 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/LinkSentLayout.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/LinkSentLayout.java @@ -9,7 +9,7 @@ * * @since 1.0.0 */ -public class LinkSentLayout extends BoxLayout { +class LinkSentLayout extends BoxLayout { public Button loginButton; diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/PasswordResetHandler.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/PasswordResetHandler.java deleted file mode 100644 index 5361dc039..000000000 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/PasswordResetHandler.java +++ /dev/null @@ -1,95 +0,0 @@ -package life.qbic.datamanager.views.login.passwordreset; - -import com.vaadin.flow.component.Key; -import life.qbic.application.commons.ApplicationResponse; -import life.qbic.datamanager.views.notifications.ErrorMessage; -import life.qbic.identity.application.user.IdentityService; -import life.qbic.identity.application.user.UserNotFoundException; -import life.qbic.identity.application.user.password.PasswordResetInput; -import life.qbic.identity.application.user.password.PasswordResetOutput; -import life.qbic.identity.domain.model.EmailAddress; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * Handles the password reset - * - *

When a password reset is triggered the handler starts the use case. On success the view is - * toggled and the user can login again. On failure the user sees an error notification - * - * @since 1.0.0 - */ -@Component -public class PasswordResetHandler implements PasswordResetHandlerInterface, PasswordResetOutput { - - private ResetPasswordLayout registeredPasswordResetLayout; - private final PasswordResetInput passwordReset; - - @Autowired - PasswordResetHandler(PasswordResetInput passwordReset) { - this.passwordReset = passwordReset; - } - - @Override - public void handle(ResetPasswordLayout layout) { - if (registeredPasswordResetLayout != layout) { - this.registeredPasswordResetLayout = layout; - addClickListeners(); - } - } - - private void addClickListeners() { - registeredPasswordResetLayout.sendButton.addClickListener( - buttonClickEvent -> { - clearNotifications(); - passwordReset.resetPassword(registeredPasswordResetLayout.email.getValue()); - }); - registeredPasswordResetLayout.sendButton.addClickShortcut(Key.ENTER); - - registeredPasswordResetLayout.linkSentLayout.loginButton.addClickListener( - buttonClickEvent -> - registeredPasswordResetLayout - .linkSentLayout - .getUI() - .ifPresent(ui -> ui.navigate("login"))); - } - - public void clearNotifications() { - registeredPasswordResetLayout.enterEmailLayout.removeNotifications(); - } - - public void showError(String title, String description) { - clearNotifications(); - ErrorMessage errorMessage = new ErrorMessage(title, description); - registeredPasswordResetLayout.enterEmailLayout.setNotification(errorMessage); - } - - private void showPasswordResetFailedError(String error, String description) { - showError(error, description); - } - - @Override - public void onPasswordResetSucceeded() { - registeredPasswordResetLayout.linkSentLayout.setVisible(true); - registeredPasswordResetLayout.enterEmailLayout.setVisible(false); - } - - @Override - public void onPasswordResetFailed(ApplicationResponse response) { - for (RuntimeException failure : response.failures()) { - if (failure instanceof EmailAddress.EmailValidationException) { - showPasswordResetFailedError("Invalid mail address format", - "Please provide a valid mail address."); - } else if (failure instanceof UserNotFoundException) { - showPasswordResetFailedError( - "User not found", "No user with the provided mail address is known."); - } else if (failure instanceof IdentityService.UserNotActivatedException) { - showPasswordResetFailedError("User not active", - "Please activate your account first to reset the password."); - } else { - showPasswordResetFailedError( - "An unexpected error occurred", "Please contact support@qbic.zendesk.com for help."); - } - } - } -} diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/PasswordResetHandlerInterface.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/PasswordResetHandlerInterface.java deleted file mode 100644 index e313d599f..000000000 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/PasswordResetHandlerInterface.java +++ /dev/null @@ -1,20 +0,0 @@ -package life.qbic.datamanager.views.login.passwordreset; - -/** - * Handles the {@link ResetPasswordLayout} components - * - *

This class is responsible for enabling buttons or triggering other view relevant changes on - * the view class components - * - * @since 1.0.0 - */ -public interface PasswordResetHandlerInterface { - - /** - * Registers a {@link ResetPasswordLayout} to an implementing class - * - * @param registerLayout The view that is being handled - * @since 1.0.0 - */ - void handle(ResetPasswordLayout registerLayout); -} diff --git a/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/ResetPasswordLayout.java b/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/ResetPasswordLayout.java index 9eca5ad1e..10940bd3a 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/ResetPasswordLayout.java +++ b/user-interface/src/main/java/life/qbic/datamanager/views/login/passwordreset/ResetPasswordLayout.java @@ -1,5 +1,6 @@ package life.qbic.datamanager.views.login.passwordreset; +import com.vaadin.flow.component.Key; import com.vaadin.flow.component.Text; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.button.ButtonVariant; @@ -11,10 +12,17 @@ import com.vaadin.flow.router.Route; import com.vaadin.flow.router.RouterLink; import com.vaadin.flow.server.auth.AnonymousAllowed; +import com.vaadin.flow.spring.annotation.UIScope; +import java.util.Objects; +import life.qbic.application.commons.ApplicationResponse; import life.qbic.datamanager.views.AppRoutes; import life.qbic.datamanager.views.landing.LandingPageLayout; import life.qbic.datamanager.views.layouts.BoxLayout; +import life.qbic.datamanager.views.notifications.ErrorMessage; import life.qbic.datamanager.views.register.UserRegistrationLayout; +import life.qbic.identity.application.user.IdentityService; +import life.qbic.identity.application.user.UserNotFoundException; +import life.qbic.identity.domain.model.EmailAddress; import org.springframework.beans.factory.annotation.Autowired; @@ -26,23 +34,23 @@ @PageTitle("Reset Password") @Route(value = AppRoutes.RESET_PASSWORD, layout = LandingPageLayout.class) @AnonymousAllowed +@UIScope public class ResetPasswordLayout extends VerticalLayout { + private final IdentityService identityService; public EmailField email; public Button sendButton; public Span registerSpan; public BoxLayout enterEmailLayout; public LinkSentLayout linkSentLayout; - public ResetPasswordLayout(@Autowired PasswordResetHandlerInterface passwordResetHandler) { + public ResetPasswordLayout(@Autowired IdentityService identityService) { + this.identityService = Objects.requireNonNull(identityService); initLayout(); styleLayout(); - registerToHandler(passwordResetHandler); + addClickListeners(); } - private void registerToHandler(PasswordResetHandlerInterface passwordResetHandler) { - passwordResetHandler.handle(this); - } private void initLayout() { initLinkSentLayout(); @@ -99,4 +107,65 @@ private void styleSendButton() { sendButton.setWidthFull(); sendButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY); } + + private void addClickListeners() { + sendButton.addClickListener( + buttonClickEvent -> { + clearNotifications(); + resetPassword(email.getValue()); + }); + sendButton.addClickShortcut(Key.ENTER); + + linkSentLayout.loginButton.addClickListener( + buttonClickEvent -> + linkSentLayout + .getUI() + .ifPresent(ui -> ui.navigate("login"))); + } + + private void resetPassword(String value) { + var response = identityService.requestPasswordReset(value); + if (response.hasFailures()) { + onPasswordResetFailed(response); + } else { + onPasswordResetSucceeded(); + } + } + + public void clearNotifications() { + enterEmailLayout.removeNotifications(); + } + + public void showError(String title, String description) { + clearNotifications(); + ErrorMessage errorMessage = new ErrorMessage(title, description); + enterEmailLayout.setNotification(errorMessage); + } + + private void showPasswordResetFailedError(String error, String description) { + showError(error, description); + } + + public void onPasswordResetSucceeded() { + linkSentLayout.setVisible(true); + enterEmailLayout.setVisible(false); + } + + public void onPasswordResetFailed(ApplicationResponse response) { + for (RuntimeException failure : response.failures()) { + if (failure instanceof EmailAddress.EmailValidationException) { + showPasswordResetFailedError("Invalid mail address format", + "Please provide a valid mail address."); + } else if (failure instanceof UserNotFoundException) { + showPasswordResetFailedError( + "User not found", "No user with the provided mail address is known."); + } else if (failure instanceof IdentityService.UserNotActivatedException) { + showPasswordResetFailedError("User not active", + "Please activate your account first to reset the password."); + } else { + showPasswordResetFailedError( + "An unexpected error occurred", "Please contact support@qbic.zendesk.com for help."); + } + } + } } From 621338f55722afc66197a2827dad80683e52995c Mon Sep 17 00:00:00 2001 From: JohnnyQ5 Date: Mon, 1 Jul 2024 06:28:10 +0000 Subject: [PATCH 2/2] Set version to 1.0.5 --- application-commons/pom.xml | 2 +- broadcasting/pom.xml | 2 +- domain-concept/pom.xml | 2 +- email-service-provider/pom.xml | 6 +++--- finances-api/pom.xml | 2 +- finances-infrastructure/pom.xml | 4 ++-- finances/pom.xml | 4 ++-- identity-api/pom.xml | 4 ++-- identity-infrastructure/pom.xml | 4 ++-- identity/pom.xml | 12 ++++++------ logging/pom.xml | 4 ++-- pom.xml | 2 +- project-management-infrastructure/pom.xml | 4 ++-- project-management/pom.xml | 12 ++++++------ subscription-api/pom.xml | 2 +- subscription-provider/pom.xml | 4 ++-- user-interface/pom.xml | 24 +++++++++++------------ 17 files changed, 47 insertions(+), 47 deletions(-) diff --git a/application-commons/pom.xml b/application-commons/pom.xml index 0b4602cc1..340b5c78f 100644 --- a/application-commons/pom.xml +++ b/application-commons/pom.xml @@ -5,7 +5,7 @@ datamanager life.qbic - 1.0.4 + 1.0.5 4.0.0 application-commons diff --git a/broadcasting/pom.xml b/broadcasting/pom.xml index a07ff387a..552077c85 100644 --- a/broadcasting/pom.xml +++ b/broadcasting/pom.xml @@ -5,7 +5,7 @@ datamanager life.qbic - 1.0.4 + 1.0.5 4.0.0 broadcasting diff --git a/domain-concept/pom.xml b/domain-concept/pom.xml index d53694e00..335cda647 100644 --- a/domain-concept/pom.xml +++ b/domain-concept/pom.xml @@ -6,7 +6,7 @@ life.qbic datamanager - 1.0.4 + 1.0.5 domain-concept diff --git a/email-service-provider/pom.xml b/email-service-provider/pom.xml index 03104544f..2748ef4f4 100644 --- a/email-service-provider/pom.xml +++ b/email-service-provider/pom.xml @@ -6,7 +6,7 @@ life.qbic datamanager - 1.0.4 + 1.0.5 life.qbic.infrastructure @@ -21,13 +21,13 @@ life.qbic identity - 1.0.4 + 1.0.5 compile life.qbic project-management - 1.0.4 + 1.0.5 compile diff --git a/finances-api/pom.xml b/finances-api/pom.xml index 0a23d5c13..0c1f776bc 100644 --- a/finances-api/pom.xml +++ b/finances-api/pom.xml @@ -6,7 +6,7 @@ life.qbic datamanager - 1.0.4 + 1.0.5 life.qbic.finances diff --git a/finances-infrastructure/pom.xml b/finances-infrastructure/pom.xml index c8dd5a1b1..428221833 100644 --- a/finances-infrastructure/pom.xml +++ b/finances-infrastructure/pom.xml @@ -6,7 +6,7 @@ life.qbic datamanager - 1.0.4 + 1.0.5 finances-infrastructure @@ -20,7 +20,7 @@ life.qbic finances - 1.0.4 + 1.0.5 compile diff --git a/finances/pom.xml b/finances/pom.xml index a269a1f27..e0c18eb87 100644 --- a/finances/pom.xml +++ b/finances/pom.xml @@ -5,7 +5,7 @@ datamanager life.qbic - 1.0.4 + 1.0.5 4.0.0 finances @@ -38,7 +38,7 @@ life.qbic.finances finances-api - 1.0.4 + 1.0.5 compile diff --git a/identity-api/pom.xml b/identity-api/pom.xml index dbf11562b..0d3d71cd9 100644 --- a/identity-api/pom.xml +++ b/identity-api/pom.xml @@ -6,7 +6,7 @@ life.qbic datamanager - 1.0.4 + 1.0.5 life.qbic.datamanager @@ -21,7 +21,7 @@ life.qbic application-commons - 1.0.4 + 1.0.5 compile diff --git a/identity-infrastructure/pom.xml b/identity-infrastructure/pom.xml index 91b81eded..1640bbdab 100644 --- a/identity-infrastructure/pom.xml +++ b/identity-infrastructure/pom.xml @@ -6,14 +6,14 @@ life.qbic datamanager - 1.0.4 + 1.0.5 identity-infrastructure life.qbic identity - 1.0.4 + 1.0.5 compile diff --git a/identity/pom.xml b/identity/pom.xml index 7c5c8a862..610ea64b2 100644 --- a/identity/pom.xml +++ b/identity/pom.xml @@ -5,7 +5,7 @@ datamanager life.qbic - 1.0.4 + 1.0.5 4.0.0 @@ -45,25 +45,25 @@ life.qbic broadcasting - 1.0.4 + 1.0.5 compile life.qbic application-commons - 1.0.4 + 1.0.5 compile life.qbic logging - 1.0.4 + 1.0.5 compile life.qbic domain-concept - 1.0.4 + 1.0.5 compile @@ -86,7 +86,7 @@ life.qbic.datamanager identity-api - 1.0.4 + 1.0.5 compile diff --git a/logging/pom.xml b/logging/pom.xml index dd2762acd..a50d6acd7 100644 --- a/logging/pom.xml +++ b/logging/pom.xml @@ -5,7 +5,7 @@ datamanager life.qbic - 1.0.4 + 1.0.5 4.0.0 logging @@ -53,7 +53,7 @@ life.qbic.logging subscription-api - 1.0.4 + 1.0.5 compile diff --git a/pom.xml b/pom.xml index 48da618a4..72458e22e 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ life.qbic datamanager Data Manager - 1.0.4 + 1.0.5 user-interface identity diff --git a/project-management-infrastructure/pom.xml b/project-management-infrastructure/pom.xml index 355293851..254a372da 100644 --- a/project-management-infrastructure/pom.xml +++ b/project-management-infrastructure/pom.xml @@ -6,7 +6,7 @@ life.qbic datamanager - 1.0.4 + 1.0.5 life.qbic.identity @@ -29,7 +29,7 @@ life.qbic project-management - 1.0.4 + 1.0.5 compile diff --git a/project-management/pom.xml b/project-management/pom.xml index 1236cb970..8e6678c88 100644 --- a/project-management/pom.xml +++ b/project-management/pom.xml @@ -4,7 +4,7 @@ datamanager life.qbic - 1.0.4 + 1.0.5 4.0.0 project-management @@ -37,13 +37,13 @@ life.qbic application-commons - 1.0.4 + 1.0.5 compile life.qbic logging - 1.0.4 + 1.0.5 compile @@ -55,7 +55,7 @@ life.qbic domain-concept - 1.0.4 + 1.0.5 compile @@ -78,13 +78,13 @@ life.qbic.datamanager identity-api - 1.0.4 + 1.0.5 compile life.qbic.finances finances-api - 1.0.4 + 1.0.5 compile diff --git a/subscription-api/pom.xml b/subscription-api/pom.xml index 10193735e..3af3a7498 100644 --- a/subscription-api/pom.xml +++ b/subscription-api/pom.xml @@ -5,7 +5,7 @@ datamanager life.qbic - 1.0.4 + 1.0.5 4.0.0 life.qbic.logging diff --git a/subscription-provider/pom.xml b/subscription-provider/pom.xml index 9c2b5eadf..bf5cb93fe 100644 --- a/subscription-provider/pom.xml +++ b/subscription-provider/pom.xml @@ -5,7 +5,7 @@ datamanager life.qbic - 1.0.4 + 1.0.5 4.0.0 life.qbic.logging @@ -14,7 +14,7 @@ life.qbic.logging subscription-api - 1.0.4 + 1.0.5 compile diff --git a/user-interface/pom.xml b/user-interface/pom.xml index e37ee58d7..28348e0c5 100644 --- a/user-interface/pom.xml +++ b/user-interface/pom.xml @@ -11,7 +11,7 @@ life.qbic datamanager - 1.0.4 + 1.0.5 @@ -185,31 +185,31 @@ life.qbic identity - 1.0.4 + 1.0.5 compile life.qbic identity-infrastructure - 1.0.4 + 1.0.5 compile life.qbic broadcasting - 1.0.4 + 1.0.5 compile life.qbic application-commons - 1.0.4 + 1.0.5 compile life.qbic logging - 1.0.4 + 1.0.5 compile @@ -219,24 +219,24 @@ life.qbic project-management - 1.0.4 + 1.0.5 compile life.qbic.logging subscription-provider - 1.0.4 + 1.0.5 life.qbic domain-concept - 1.0.4 + 1.0.5 compile life.qbic finances-infrastructure - 1.0.4 + 1.0.5 compile @@ -246,13 +246,13 @@ life.qbic.identity project-management-infrastructure - 1.0.4 + 1.0.5 compile life.qbic.infrastructure email-service-provider - 1.0.4 + 1.0.5 compile