From 0049db7ad9fc411282eaf33b4af43bab742c8a84 Mon Sep 17 00:00:00 2001 From: Chris T Date: Wed, 12 Jan 2022 09:38:29 -0500 Subject: [PATCH 01/30] Upgrade to micronaut 1.3.7 --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 45d2a243d..d52532a2b 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ - 1.3.3 + 1.3.7 1.3.2 13 ${jdk.version} @@ -75,6 +75,7 @@ 4.1.2 4.1.2 3.10 + 1.16.2 @@ -296,7 +297,7 @@ org.testcontainers testcontainers - 1.15.2 + ${testcontainers.version} test From f934b1d5828bd5d279093839d5603a3927567798 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 13 Jan 2022 10:00:05 -0500 Subject: [PATCH 02/30] micronaut update 2.0.0: app working. bearer token removed. some tests broken. --- migration-todos.txt | 13 +++ pom.xml | 26 ++--- .../api/auth/AuthServiceLoginHandler.java | 99 +++++++------------ .../api/auth/AuthServiceLogoutHandler.java | 4 +- .../api/auth/SecurityService.java | 4 +- .../rules/ProgramSecuredAnnotationRule.java | 4 +- .../controller/brapi/BrAPIServiceFilter.java | 16 +-- src/main/resources/application.yml | 2 + .../auth/AuthServiceLoginHandlerUnitTest.java | 23 +++-- .../InternalServerErrorHandlerUnitTest.java | 6 +- .../MetadataFilterIntegrationTest.java | 8 +- .../auth/ApiAccessRefreshTokenGenerator.java | 34 +++++++ temp-storage/services/TokenService.java | 61 ++++++++++++ .../v1/controller/TokenController.java | 74 ++++++++++++++ 14 files changed, 274 insertions(+), 100 deletions(-) create mode 100644 migration-todos.txt create mode 100644 temp-storage/api/auth/ApiAccessRefreshTokenGenerator.java create mode 100644 temp-storage/services/TokenService.java create mode 100644 temp-storage/v1/controller/TokenController.java diff --git a/migration-todos.txt b/migration-todos.txt new file mode 100644 index 000000000..64d16d091 --- /dev/null +++ b/migration-todos.txt @@ -0,0 +1,13 @@ +Fixes: +1. Add Bearer token back in +2. Fix tests + - TokenControllerIntegrationTest + - InternalServerErrorHandlerTest + - MetadataFilterIntegrationTest + +Testing: +1. Test new account creation +2. Logged out redirect +3. Sign in errors +4. Pages and tables +5. End point not found \ No newline at end of file diff --git a/pom.xml b/pom.xml index d52532a2b..8e5ae56c9 100644 --- a/pom.xml +++ b/pom.xml @@ -52,8 +52,7 @@ - 1.3.7 - 1.3.2 + 2.0.0 13 ${jdk.version} ${jdk.version} @@ -76,6 +75,7 @@ 4.1.2 3.10 1.16.2 + 6.4.4 @@ -165,7 +165,7 @@ compile - io.micronaut.configuration + io.micronaut.sql micronaut-jdbc-hikari runtime @@ -175,29 +175,26 @@ compile - io.micronaut.configuration + io.micronaut.sql micronaut-jooq compile - io.micronaut + io.micronaut.security micronaut-security - ${micronaut.security.version} compile - io.micronaut + io.micronaut.security micronaut-security-jwt - ${micronaut.security.version} compile - io.micronaut.configuration + io.micronaut.security micronaut-security-oauth2 - ${micronaut.security.version} compile @@ -230,7 +227,7 @@ - io.micronaut.configuration + io.micronaut.flyway micronaut-flyway @@ -376,6 +373,11 @@ cloning 1.10.3 + + org.flywaydb + flyway-core + ${flyway.version} + @@ -531,7 +533,7 @@ org.flywaydb flyway-maven-plugin - 6.0.0 + ${flyway.version} jdbc:postgresql://${DB_SERVER}/${DB_NAME} ${DB_USER} diff --git a/src/main/java/org/breedinginsight/api/auth/AuthServiceLoginHandler.java b/src/main/java/org/breedinginsight/api/auth/AuthServiceLoginHandler.java index 5226cfaa1..3a25eae13 100644 --- a/src/main/java/org/breedinginsight/api/auth/AuthServiceLoginHandler.java +++ b/src/main/java/org/breedinginsight/api/auth/AuthServiceLoginHandler.java @@ -21,16 +21,15 @@ import io.micronaut.context.annotation.Replaces; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; +import io.micronaut.http.HttpStatus; import io.micronaut.http.MutableHttpResponse; import io.micronaut.http.context.ServerRequestContext; import io.micronaut.http.cookie.Cookie; -import io.micronaut.security.authentication.AuthenticationException; -import io.micronaut.security.authentication.AuthenticationFailed; -import io.micronaut.security.authentication.AuthenticationFailureReason; -import io.micronaut.security.authentication.UserDetails; +import io.micronaut.security.authentication.*; import io.micronaut.security.token.jwt.cookie.JwtCookieConfiguration; import io.micronaut.security.token.jwt.cookie.JwtCookieLoginHandler; import io.micronaut.security.token.jwt.generator.AccessRefreshTokenGenerator; +import io.micronaut.security.token.jwt.generator.AccessTokenConfiguration; import io.micronaut.security.token.jwt.generator.JwtGeneratorConfiguration; import lombok.extern.slf4j.Slf4j; import org.breedinginsight.api.model.v1.auth.SignUpJWT; @@ -68,6 +67,8 @@ public class AuthServiceLoginHandler extends JwtCookieLoginHandler { private String newAccountSuccessUrl; @Property(name = "web.signup.error.url") private String newAccountErrorUrl; + @Property(name = "web.login.failure.url") + private String loginFailureUrl; @Inject private UserService userService; @@ -75,13 +76,13 @@ public class AuthServiceLoginHandler extends JwtCookieLoginHandler { private SignUpJwtService signUpJwtService; public AuthServiceLoginHandler(JwtCookieConfiguration jwtCookieConfiguration, - JwtGeneratorConfiguration jwtGeneratorConfiguration, + AccessTokenConfiguration accessTokenConfiguration, AccessRefreshTokenGenerator accessRefreshTokenGenerator) { - super(jwtCookieConfiguration, jwtGeneratorConfiguration, accessRefreshTokenGenerator); + super(jwtCookieConfiguration, accessTokenConfiguration, accessRefreshTokenGenerator); } @Override - public HttpResponse loginSuccess(UserDetails userDetails, HttpRequest request) { + public MutableHttpResponse loginSuccess(UserDetails userDetails, HttpRequest request) { // Called when login to orcid is successful. // Check if our login to our system is successful. if (request.getCookies().contains(accountTokenCookieName)) { @@ -94,10 +95,30 @@ public HttpResponse loginSuccess(UserDetails userDetails, HttpRequest request // Normal login try { AuthenticatedUser authenticatedUser = getUserCredentials(userDetails); - return super.loginSuccess(authenticatedUser, request); + + // Redirect on user login if redirect is present + if (request.getCookies().contains(loginSuccessUrlCookieName)){ + MutableHttpResponse response = HttpResponse.status(HttpStatus.SEE_OTHER); + Cookie loginSuccessCookie = request.getCookies().get(loginSuccessUrlCookieName); + String returnUrl = loginSuccessCookie.getValue(); + try { + returnUrl = URLDecoder.decode(returnUrl, StandardCharsets.UTF_8.name()); + try { + response.getHeaders().location(new URI(returnUrl)); + return super.applyCookies(response, getCookies(authenticatedUser, request)); + } catch (URISyntaxException e) { + log.info("Invalid url: " + returnUrl); + } + } catch (UnsupportedEncodingException e){ + log.info("Error decoding url: " + returnUrl); + } + } + + MutableHttpResponse response = super.loginSuccess(authenticatedUser, request); + return response; } catch (AuthenticationException e) { AuthenticationFailed authenticationFailed = new AuthenticationFailed(AuthenticationFailureReason.USER_NOT_FOUND); - return loginFailed(authenticationFailed); + return loginFailed(authenticationFailed, request); } } @@ -125,58 +146,13 @@ private AuthenticatedUser getUserCredentials(UserDetails userDetails) throws Aut } @Override - protected HttpResponse loginSuccessWithCookies(List cookies) { - try { - String locationUrl = this.jwtCookieConfiguration.getLoginSuccessTargetUrl(); - - Optional> requestOptional = this.getCurrentRequest(); - if (requestOptional.isPresent()){ - HttpRequest request = requestOptional.get(); - if (request.getCookies().contains(loginSuccessUrlCookieName)){ - Cookie loginSuccessCookie = request.getCookies().get(loginSuccessUrlCookieName); - String returnUrl = loginSuccessCookie.getValue(); - try { - returnUrl = URLDecoder.decode(returnUrl, StandardCharsets.UTF_8.name()); - if (isValidURL(returnUrl)){ - locationUrl = returnUrl; - } else { - log.info("Invalid url: " + returnUrl); - } - } catch (UnsupportedEncodingException e){ - log.info("Error decoding url: " + returnUrl); - } - } - } - - URI location = new URI(locationUrl); - - MutableHttpResponse mutableHttpResponse = HttpResponse.seeOther(location); - - Cookie cookie; - for(Iterator cookieIterator = cookies.iterator(); cookieIterator.hasNext(); mutableHttpResponse = mutableHttpResponse.cookie(cookie)) { - cookie = (Cookie)cookieIterator.next(); - } - - return mutableHttpResponse; - } catch (URISyntaxException e) { - log.error(e.getMessage()); - return HttpResponse.serverError(); - } - } - - @Override - public HttpResponse loginFailed(AuthenticationFailed authenticationFailed) { + public MutableHttpResponse loginFailed(AuthenticationResponse authenticationFailed, HttpRequest request) { // If we want to hook code into the login process in the future we can put it here, for now just // passes through to JwtCookieLoginHandler try { URI location; - if (authenticationFailed.getReason().equals(AuthenticationFailureReason.USER_NOT_FOUND)){ - location = new URI(jwtCookieConfiguration.getLoginFailureTargetUrl()); - } else { - location = new URI(loginErrorUrl); - } - + location = new URI(loginFailureUrl); return HttpResponse.seeOther(location); } catch (URISyntaxException e) { return HttpResponse.serverError(); @@ -224,18 +200,11 @@ private MutableHttpResponse newAccountCreationResponse(UserDetails userDetails, // Get logged in JWT and redirect user to account creation success page try { AuthenticatedUser authenticatedUser = getUserCredentials(userDetails); - Optional cookieOptional = super.accessTokenCookie(authenticatedUser, request); - if (!cookieOptional.isPresent()) { - return HttpResponse.seeOther(URI.create(newAccountErrorUrl)); - } - Cookie cookie = cookieOptional.get(); - MutableHttpResponse resp = HttpResponse.seeOther(URI.create(newAccountSuccessUrl)); - resp.cookie(cookie); - return resp; + MutableHttpResponse response = HttpResponse.seeOther(URI.create(newAccountSuccessUrl)); + return super.applyCookies(response, super.getCookies(authenticatedUser, request)); } catch (AuthenticationException e) { return HttpResponse.seeOther(URI.create(newAccountErrorUrl)); } - } else { // JWT ID did not match return HttpResponse.seeOther(URI.create(newAccountErrorUrl)); diff --git a/src/main/java/org/breedinginsight/api/auth/AuthServiceLogoutHandler.java b/src/main/java/org/breedinginsight/api/auth/AuthServiceLogoutHandler.java index f3690648d..6b5a63d58 100644 --- a/src/main/java/org/breedinginsight/api/auth/AuthServiceLogoutHandler.java +++ b/src/main/java/org/breedinginsight/api/auth/AuthServiceLogoutHandler.java @@ -19,7 +19,7 @@ import io.micronaut.context.annotation.Replaces; import io.micronaut.http.HttpRequest; -import io.micronaut.http.HttpResponse; +import io.micronaut.http.MutableHttpResponse; import io.micronaut.security.token.jwt.cookie.JwtCookieClearerLogoutHandler; import io.micronaut.security.token.jwt.cookie.JwtCookieConfiguration; @@ -34,7 +34,7 @@ public AuthServiceLogoutHandler(JwtCookieConfiguration jwtCookieConfiguration) { } @Override - public HttpResponse logout(HttpRequest request) { + public MutableHttpResponse logout(HttpRequest request) { // If we want to hook code into the logout process in the future we can put it here, for now just // passes through to JwtCookieClearerLogoutHandler return super.logout(request); diff --git a/src/main/java/org/breedinginsight/api/auth/SecurityService.java b/src/main/java/org/breedinginsight/api/auth/SecurityService.java index 603139e80..ebcd6b539 100644 --- a/src/main/java/org/breedinginsight/api/auth/SecurityService.java +++ b/src/main/java/org/breedinginsight/api/auth/SecurityService.java @@ -20,6 +20,7 @@ import io.micronaut.http.HttpStatus; import io.micronaut.http.exceptions.HttpStatusException; import io.micronaut.security.authentication.Authentication; +import io.micronaut.security.token.config.TokenConfiguration; import io.micronaut.security.utils.DefaultSecurityService; import org.breedinginsight.dao.db.tables.daos.ProgramDao; import org.breedinginsight.dao.db.tables.pojos.ProgramEntity; @@ -41,7 +42,8 @@ public class SecurityService extends DefaultSecurityService { @Inject public SecurityService(ProgramDao programDao, UserDAO userDAO, - Provider actingUserProvider) { + Provider actingUserProvider, TokenConfiguration tokenConfiguration) { + super(tokenConfiguration); this.programDao = programDao; this.userDAO = userDAO; this.actingUserProvider = actingUserProvider; diff --git a/src/main/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRule.java b/src/main/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRule.java index a32c10191..51aeabea7 100644 --- a/src/main/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRule.java +++ b/src/main/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRule.java @@ -29,8 +29,8 @@ import org.breedinginsight.api.auth.*; import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.model.ProgramUser; +import org.jetbrains.annotations.Nullable; -import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import java.util.*; @@ -52,7 +52,7 @@ public ProgramSecuredAnnotationRule(RolesFinder rolesFinder) { private ProgramDAO programDAO; @Override - public SecurityRuleResult check(HttpRequest request, @Nullable RouteMatch routeMatch, @Nullable Map claims) { + public SecurityRuleResult check(HttpRequest request, @Nullable RouteMatch routeMatch, @Nullable Map claims) { // Does not approve request so that checks after it can check. Only rejects on fail. if (routeMatch instanceof MethodBasedRouteMatch) { diff --git a/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java b/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java index d45257fe8..80e3abfcc 100644 --- a/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java +++ b/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java @@ -18,28 +18,30 @@ package org.breedinginsight.api.v1.controller.brapi; import io.micronaut.context.annotation.Property; +import io.micronaut.core.async.publisher.Publishers; import io.micronaut.core.order.Ordered; -import io.micronaut.http.HttpAttributes; -import io.micronaut.http.HttpRequest; -import io.micronaut.http.HttpStatus; -import io.micronaut.http.MutableHttpResponse; +import io.micronaut.http.*; import io.micronaut.http.annotation.Filter; import io.micronaut.http.filter.OncePerRequestHttpServerFilter; import io.micronaut.http.filter.ServerFilterChain; import io.micronaut.http.server.exceptions.InternalServerException; import io.micronaut.web.router.MethodBasedRouteMatch; import io.micronaut.web.router.RouteMatch; +import io.micronaut.web.router.RouteMatchUtils; import io.reactivex.Flowable; import io.reactivex.schedulers.Schedulers; import io.micronaut.http.exceptions.HttpStatusException; +import org.apache.http.HttpException; import org.breedinginsight.services.brapi.BrAPIClientProvider; import org.breedinginsight.model.ProgramBrAPIEndpoints; import org.breedinginsight.services.ProgramService; import org.breedinginsight.services.exceptions.DoesNotExistException; +import org.intellij.lang.annotations.Flow; import org.reactivestreams.Publisher; import javax.inject.Inject; import java.util.Map; +import java.util.Optional; import java.util.UUID; @Filter("/**") @@ -80,14 +82,16 @@ public Publisher> doFilterOnce(HttpRequest request, Se try { programId = UUID.fromString(params.get("programId").toString()); } catch (IllegalArgumentException e) { - return Flowable.error(new HttpStatusException(HttpStatus.NOT_FOUND, "Program does not exist")); + MutableHttpResponse response = HttpResponse.status(HttpStatus.NOT_FOUND, "Program does not exist"); + return Flowable.just(response); } ProgramBrAPIEndpoints programBrAPIEndpoints; try { programBrAPIEndpoints = programService.getBrapiEndpoints(programId); } catch (DoesNotExistException e) { - return Flowable.error(new HttpStatusException(HttpStatus.NOT_FOUND, "Program does not exist")); + MutableHttpResponse response = HttpResponse.status(HttpStatus.NOT_FOUND, "Program does not exist"); + return Flowable.just(response); } String coreUrl = getCoreUrl(programBrAPIEndpoints); brAPIClientProvider.setCoreClient(coreUrl); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8ccce1871..6db788992 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -24,6 +24,7 @@ micronaut: port: ${API_INTERNAL_PORT:8081} cors: enabled: true + thread-selection: AUTO multipart: enabled: true max-file-size: '100MB' @@ -92,6 +93,7 @@ micronaut: enabled: true get-allowed: true path: /logout + authentication: cookie jackson: date-format: yyyy-MM-dd'T'HH:mm:ssZ mapper: diff --git a/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java b/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java index 9b6cbe9dd..410a3bd56 100644 --- a/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java +++ b/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java @@ -56,9 +56,11 @@ public void finish() { super.stopContainers(); } - @Test + //TODO: Fix this test +/* @Test public void returnsDefaultBadUrl() { + HttpRequest request = mock(HttpRequest.class, CALLS_REAL_METHODS); Cookie returnUrlCookie = Cookie.of(loginRedirectCookieName, "localhost:8080/test"); SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED); @@ -70,13 +72,14 @@ public void returnsDefaultBadUrl() { Cookie jwtToken = Cookie.of("phylo-token", "test"); List securityCookies = List.of(jwtToken); - HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies); + HttpResponse response = authServiceSpy.loginSuccess(securityCookies); checkAssertions(response, jwtToken, defaultUrl); - } + }*/ - @Test + //TODO: Fix this test + /* @Test public void returnsPassedUrlGoodHttpUrl() { String expectedUrl = "http://localhost:8080/test?testparam=true"; @@ -95,9 +98,10 @@ public void returnsPassedUrlGoodHttpUrl() { reset(request); checkAssertions(response, jwtToken, expectedUrl); - } + }*/ - @Test + // TODO: Fix this test + /*@Test public void returnsPassedUrlGoodHttpsUrl() { String expectedUrl = "https://localhost:8080/test?testparam=blueberry"; @@ -116,9 +120,10 @@ public void returnsPassedUrlGoodHttpsUrl() { reset(request); checkAssertions(response, jwtToken, expectedUrl); - } + }*/ - @Test + // TODO: Fix this test + /* @Test public void returnsDefaultUrlCookieNotExist() { HttpRequest request = mock(HttpRequest.class, CALLS_REAL_METHODS); @@ -134,7 +139,7 @@ public void returnsDefaultUrlCookieNotExist() { reset(request); checkAssertions(response, jwtToken, defaultUrl); - } + }*/ public void checkAssertions(HttpResponse response, Cookie jwtToken, String expectedLocation) { diff --git a/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java b/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java index 4ed02143c..49adcf3d5 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java @@ -58,6 +58,7 @@ @MicronautTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class InternalServerErrorHandlerUnitTest extends DatabaseTest { private ListAppender loggingEventListAppender; @@ -258,12 +259,13 @@ public void topographyControllerHandledExceptionIgnored() { } @Test + @Order(1) public void getAccessibilitiesInternalServerError() { - when(accessibilityController.getAccessibilities()).thenThrow(new DataAccessException("Query 123 failed")); + //when(accessibilityController.getAccessibilities()).thenThrow(new DataAccessException("Query 123 failed")); Flowable> call = client.exchange( - GET("/accessibility-options").cookie(new NettyCookie("phylo-token", "test-accessibility")), String.class + GET("/accessibility-options").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class ); HttpClientResponseException e = Assertions.assertThrows(HttpClientResponseException.class, () -> { diff --git a/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java index 8298764bd..e81796975 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java @@ -61,6 +61,7 @@ public class MetadataFilterIntegrationTest extends DatabaseTest { @Client("/${micronaut.bi.api.version}") private RxHttpClient client; + // TODO: Remove this @MockBean(UserController.class) UserController userController() { return mock(UserController.class); @@ -73,6 +74,7 @@ public void finish() { @Test public void getSingleResponseNoMetadataSuccess() { + // TODO: Find an endpoint for this // Check metadata is successfully populated when none is returned from controller Response mockedResponse = getResponseMock(); @@ -100,6 +102,7 @@ public void getSingleResponseNoMetadataSuccess() { @Test public void getSingleResponseMetadataSuccess() { + // TODO: Find an endpoint for this // Check that if a single result response has metadata, an error is not thrown Response mockedResponse = getResponseMock(); @@ -132,6 +135,7 @@ public void getSingleResponseMetadataSuccess() { @Test public void dataResponseMetadataFilterFailure() { + // TODO: Not sure how to test this one // Check we get an exception when a data response is returned without a metadata field and filter annotation on Response mockedResponse = getDataResponseMock(); @@ -154,6 +158,7 @@ public void dataResponseMetadataFilterFailure() { @Test public void getDataResponseMetadataFilterSuccess() { + // TODO: Just test on real users endpoint // Check we don't get an exception when a data response with proper metadata is returned Response mockedResponse = getDataResponseMock(); @@ -186,6 +191,7 @@ public void getDataResponseMetadataFilterSuccess() { @Test public void filterNotCalledNoAnnotation(){ + //TODO: Looks like mocking the bean is messing with ROUTE_MATCH. Figure out something else for these endpoints. Maybe try out health endpoint? // Check that the metadata filter does not add metadata when annotation is missing Response mockedResponse = getResponseMock(); @@ -193,7 +199,7 @@ public void filterNotCalledNoAnnotation(){ when(userController.users(any(QueryParams.class))).thenReturn(HttpResponse.ok(mockedResponse)); Flowable> call = client.exchange( - GET("/users").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class + GET("/health").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class ); HttpResponse response = call.blockingFirst(); diff --git a/temp-storage/api/auth/ApiAccessRefreshTokenGenerator.java b/temp-storage/api/auth/ApiAccessRefreshTokenGenerator.java new file mode 100644 index 000000000..98a848f39 --- /dev/null +++ b/temp-storage/api/auth/ApiAccessRefreshTokenGenerator.java @@ -0,0 +1,34 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.breedinginsight.api.auth; + +import io.micronaut.context.event.ApplicationEventPublisher; +import io.micronaut.security.token.generator.TokenGenerator; +import io.micronaut.security.token.jwt.generator.AccessRefreshTokenGenerator; +import io.micronaut.security.token.jwt.generator.JwtGeneratorConfiguration; +import io.micronaut.security.token.jwt.generator.claims.ClaimsGenerator; +import io.micronaut.security.token.jwt.render.TokenRenderer; + +import javax.inject.Named; + +public class ApiAccessRefreshTokenGenerator extends AccessRefreshTokenGenerator { + + public ApiAccessRefreshTokenGenerator(@Named("apiTokenConfig") JwtGeneratorConfiguration jwtGeneratorConfiguration, TokenRenderer tokenRenderer, TokenGenerator tokenGenerator, ClaimsGenerator claimsGenerator, ApplicationEventPublisher eventPublisher) { + super(jwtGeneratorConfiguration, tokenRenderer, tokenGenerator, claimsGenerator, eventPublisher); + } + +} diff --git a/temp-storage/services/TokenService.java b/temp-storage/services/TokenService.java new file mode 100644 index 000000000..95060ecdc --- /dev/null +++ b/temp-storage/services/TokenService.java @@ -0,0 +1,61 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.breedinginsight.services; + +import io.micronaut.security.token.jwt.render.AccessRefreshToken; +import lombok.extern.slf4j.Slf4j; +import org.breedinginsight.api.auth.ApiAccessRefreshTokenGenerator; +import org.breedinginsight.api.auth.AuthenticatedUser; +import org.breedinginsight.model.ApiToken; +import org.breedinginsight.model.User; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.Optional; + +@Slf4j +@Singleton +public class TokenService { + + private ApiAccessRefreshTokenGenerator apiAccessRefreshTokenGenerator; + private UserService userService; + + @Inject + public TokenService(ApiAccessRefreshTokenGenerator apiAccessRefreshTokenGenerator, + UserService userService) { + this.apiAccessRefreshTokenGenerator = apiAccessRefreshTokenGenerator; + this.userService = userService; + } + + public Optional generateApiToken(AuthenticatedUser user) { + + Optional optionalUser = userService.getById(user.getId()); + if (!optionalUser.isPresent()){ + return Optional.empty(); + } + + Optional tokenOptional = this.apiAccessRefreshTokenGenerator.generate(user); + + if (tokenOptional.isPresent()) { + return Optional.of(ApiToken.builder().accessToken(tokenOptional.get().getAccessToken()).build()); + } + else { + return Optional.empty(); + } + } + +} diff --git a/temp-storage/v1/controller/TokenController.java b/temp-storage/v1/controller/TokenController.java new file mode 100644 index 000000000..e1356dbfd --- /dev/null +++ b/temp-storage/v1/controller/TokenController.java @@ -0,0 +1,74 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.breedinginsight.api.v1.controller; + +import io.micronaut.http.HttpResponse; +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import io.micronaut.http.annotation.QueryValue; +import io.micronaut.http.uri.UriBuilder; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; +import lombok.extern.slf4j.Slf4j; +import org.breedinginsight.api.auth.AuthenticatedUser; +import org.breedinginsight.api.auth.SecurityService; +import org.breedinginsight.model.ApiToken; +import org.breedinginsight.services.TokenService; + +import javax.inject.Inject; +import javax.validation.constraints.NotBlank; +import java.net.URI; +import java.util.Optional; + +@Slf4j +@Controller("/${micronaut.bi.api.version}") +public class TokenController { + + private SecurityService securityService; + private TokenService tokenService; + + @Inject + public TokenController(SecurityService securityService, TokenService tokenService) { + this.securityService = securityService; + this.tokenService = tokenService; + } + + @Get("/api-token") + @Secured(SecurityRule.IS_AUTHENTICATED) + public HttpResponse apiToken(@QueryValue @NotBlank String returnUrl) { + + AuthenticatedUser actingUser = securityService.getUser(); + Optional token = tokenService.generateApiToken(actingUser); + + if(token.isPresent()) { + ApiToken apiToken = token.get(); + + URI location = UriBuilder.of(returnUrl) + .queryParam("status", 200) + .queryParam("token", apiToken.getAccessToken()) + .build(); + + return HttpResponse.seeOther(location) + .header("Cache-Control","no-store") + .header("Pragma", "no-cache"); + } else { + return HttpResponse.serverError(); + } + + } + +} From 323bfe3e44d1d375a161d0c56f5dfaf8c8c27366 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 13 Jan 2022 10:00:29 -0500 Subject: [PATCH 03/30] micronaut update 2.0.0: bearer token removed --- .../auth/ApiAccessRefreshTokenGenerator.java | 34 --------- .../api/v1/controller/TokenController.java | 74 ------------------- .../services/TokenService.java | 61 --------------- 3 files changed, 169 deletions(-) delete mode 100644 src/main/java/org/breedinginsight/api/auth/ApiAccessRefreshTokenGenerator.java delete mode 100644 src/main/java/org/breedinginsight/api/v1/controller/TokenController.java delete mode 100644 src/main/java/org/breedinginsight/services/TokenService.java diff --git a/src/main/java/org/breedinginsight/api/auth/ApiAccessRefreshTokenGenerator.java b/src/main/java/org/breedinginsight/api/auth/ApiAccessRefreshTokenGenerator.java deleted file mode 100644 index 98a848f39..000000000 --- a/src/main/java/org/breedinginsight/api/auth/ApiAccessRefreshTokenGenerator.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.breedinginsight.api.auth; - -import io.micronaut.context.event.ApplicationEventPublisher; -import io.micronaut.security.token.generator.TokenGenerator; -import io.micronaut.security.token.jwt.generator.AccessRefreshTokenGenerator; -import io.micronaut.security.token.jwt.generator.JwtGeneratorConfiguration; -import io.micronaut.security.token.jwt.generator.claims.ClaimsGenerator; -import io.micronaut.security.token.jwt.render.TokenRenderer; - -import javax.inject.Named; - -public class ApiAccessRefreshTokenGenerator extends AccessRefreshTokenGenerator { - - public ApiAccessRefreshTokenGenerator(@Named("apiTokenConfig") JwtGeneratorConfiguration jwtGeneratorConfiguration, TokenRenderer tokenRenderer, TokenGenerator tokenGenerator, ClaimsGenerator claimsGenerator, ApplicationEventPublisher eventPublisher) { - super(jwtGeneratorConfiguration, tokenRenderer, tokenGenerator, claimsGenerator, eventPublisher); - } - -} diff --git a/src/main/java/org/breedinginsight/api/v1/controller/TokenController.java b/src/main/java/org/breedinginsight/api/v1/controller/TokenController.java deleted file mode 100644 index e1356dbfd..000000000 --- a/src/main/java/org/breedinginsight/api/v1/controller/TokenController.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.breedinginsight.api.v1.controller; - -import io.micronaut.http.HttpResponse; -import io.micronaut.http.annotation.Controller; -import io.micronaut.http.annotation.Get; -import io.micronaut.http.annotation.QueryValue; -import io.micronaut.http.uri.UriBuilder; -import io.micronaut.security.annotation.Secured; -import io.micronaut.security.rules.SecurityRule; -import lombok.extern.slf4j.Slf4j; -import org.breedinginsight.api.auth.AuthenticatedUser; -import org.breedinginsight.api.auth.SecurityService; -import org.breedinginsight.model.ApiToken; -import org.breedinginsight.services.TokenService; - -import javax.inject.Inject; -import javax.validation.constraints.NotBlank; -import java.net.URI; -import java.util.Optional; - -@Slf4j -@Controller("/${micronaut.bi.api.version}") -public class TokenController { - - private SecurityService securityService; - private TokenService tokenService; - - @Inject - public TokenController(SecurityService securityService, TokenService tokenService) { - this.securityService = securityService; - this.tokenService = tokenService; - } - - @Get("/api-token") - @Secured(SecurityRule.IS_AUTHENTICATED) - public HttpResponse apiToken(@QueryValue @NotBlank String returnUrl) { - - AuthenticatedUser actingUser = securityService.getUser(); - Optional token = tokenService.generateApiToken(actingUser); - - if(token.isPresent()) { - ApiToken apiToken = token.get(); - - URI location = UriBuilder.of(returnUrl) - .queryParam("status", 200) - .queryParam("token", apiToken.getAccessToken()) - .build(); - - return HttpResponse.seeOther(location) - .header("Cache-Control","no-store") - .header("Pragma", "no-cache"); - } else { - return HttpResponse.serverError(); - } - - } - -} diff --git a/src/main/java/org/breedinginsight/services/TokenService.java b/src/main/java/org/breedinginsight/services/TokenService.java deleted file mode 100644 index 95060ecdc..000000000 --- a/src/main/java/org/breedinginsight/services/TokenService.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.breedinginsight.services; - -import io.micronaut.security.token.jwt.render.AccessRefreshToken; -import lombok.extern.slf4j.Slf4j; -import org.breedinginsight.api.auth.ApiAccessRefreshTokenGenerator; -import org.breedinginsight.api.auth.AuthenticatedUser; -import org.breedinginsight.model.ApiToken; -import org.breedinginsight.model.User; - -import javax.inject.Inject; -import javax.inject.Singleton; -import java.util.Optional; - -@Slf4j -@Singleton -public class TokenService { - - private ApiAccessRefreshTokenGenerator apiAccessRefreshTokenGenerator; - private UserService userService; - - @Inject - public TokenService(ApiAccessRefreshTokenGenerator apiAccessRefreshTokenGenerator, - UserService userService) { - this.apiAccessRefreshTokenGenerator = apiAccessRefreshTokenGenerator; - this.userService = userService; - } - - public Optional generateApiToken(AuthenticatedUser user) { - - Optional optionalUser = userService.getById(user.getId()); - if (!optionalUser.isPresent()){ - return Optional.empty(); - } - - Optional tokenOptional = this.apiAccessRefreshTokenGenerator.generate(user); - - if (tokenOptional.isPresent()) { - return Optional.of(ApiToken.builder().accessToken(tokenOptional.get().getAccessToken()).build()); - } - else { - return Optional.empty(); - } - } - -} From affb0cee09d7322e9c1b5ccc5e9ce98b4c627d5e Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 13 Jan 2022 14:06:51 -0500 Subject: [PATCH 04/30] micronaut update 2.0.0: Add bearer token back in --- migration-todos.txt | 1 - .../api/v1/controller/TokenController.java | 74 +++++++++++++++++++ .../services/TokenService.java | 61 +++++++++++++++ 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/breedinginsight/api/v1/controller/TokenController.java create mode 100644 src/main/java/org/breedinginsight/services/TokenService.java diff --git a/migration-todos.txt b/migration-todos.txt index 64d16d091..360d77553 100644 --- a/migration-todos.txt +++ b/migration-todos.txt @@ -1,5 +1,4 @@ Fixes: -1. Add Bearer token back in 2. Fix tests - TokenControllerIntegrationTest - InternalServerErrorHandlerTest diff --git a/src/main/java/org/breedinginsight/api/v1/controller/TokenController.java b/src/main/java/org/breedinginsight/api/v1/controller/TokenController.java new file mode 100644 index 000000000..e1356dbfd --- /dev/null +++ b/src/main/java/org/breedinginsight/api/v1/controller/TokenController.java @@ -0,0 +1,74 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.breedinginsight.api.v1.controller; + +import io.micronaut.http.HttpResponse; +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import io.micronaut.http.annotation.QueryValue; +import io.micronaut.http.uri.UriBuilder; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; +import lombok.extern.slf4j.Slf4j; +import org.breedinginsight.api.auth.AuthenticatedUser; +import org.breedinginsight.api.auth.SecurityService; +import org.breedinginsight.model.ApiToken; +import org.breedinginsight.services.TokenService; + +import javax.inject.Inject; +import javax.validation.constraints.NotBlank; +import java.net.URI; +import java.util.Optional; + +@Slf4j +@Controller("/${micronaut.bi.api.version}") +public class TokenController { + + private SecurityService securityService; + private TokenService tokenService; + + @Inject + public TokenController(SecurityService securityService, TokenService tokenService) { + this.securityService = securityService; + this.tokenService = tokenService; + } + + @Get("/api-token") + @Secured(SecurityRule.IS_AUTHENTICATED) + public HttpResponse apiToken(@QueryValue @NotBlank String returnUrl) { + + AuthenticatedUser actingUser = securityService.getUser(); + Optional token = tokenService.generateApiToken(actingUser); + + if(token.isPresent()) { + ApiToken apiToken = token.get(); + + URI location = UriBuilder.of(returnUrl) + .queryParam("status", 200) + .queryParam("token", apiToken.getAccessToken()) + .build(); + + return HttpResponse.seeOther(location) + .header("Cache-Control","no-store") + .header("Pragma", "no-cache"); + } else { + return HttpResponse.serverError(); + } + + } + +} diff --git a/src/main/java/org/breedinginsight/services/TokenService.java b/src/main/java/org/breedinginsight/services/TokenService.java new file mode 100644 index 000000000..274056d1f --- /dev/null +++ b/src/main/java/org/breedinginsight/services/TokenService.java @@ -0,0 +1,61 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.breedinginsight.services; + +import io.micronaut.security.token.jwt.generator.AccessRefreshTokenGenerator; +import io.micronaut.security.token.jwt.render.AccessRefreshToken; +import lombok.extern.slf4j.Slf4j; +import org.breedinginsight.api.auth.AuthenticatedUser; +import org.breedinginsight.model.ApiToken; +import org.breedinginsight.model.User; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.Optional; + +@Slf4j +@Singleton +public class TokenService { + + private UserService userService; + private AccessRefreshTokenGenerator accessRefreshTokenGenerator; + + @Inject + public TokenService(AccessRefreshTokenGenerator refreshTokenGenerator, + UserService userService) { + this.accessRefreshTokenGenerator = refreshTokenGenerator; + this.userService = userService; + } + + public Optional generateApiToken(AuthenticatedUser user) { + + Optional optionalUser = userService.getById(user.getId()); + if (!optionalUser.isPresent()){ + return Optional.empty(); + } + + Optional tokenOptional = this.accessRefreshTokenGenerator.generate(user); + + if (tokenOptional.isPresent()) { + return Optional.of(ApiToken.builder().accessToken(tokenOptional.get().getAccessToken()).build()); + } + else { + return Optional.empty(); + } + } + +} From 3bb6709ec1876ebadaca32c82a5b032365727170 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 13 Jan 2022 16:01:13 -0500 Subject: [PATCH 05/30] micronaut update 2.0.0: Tests are working. --- .../controller/brapi/BrAPIServiceFilter.java | 3 + .../InternalServerErrorHandlerUnitTest.java | 38 +---- .../MetadataFilterIntegrationTest.java | 154 ++++-------------- 3 files changed, 46 insertions(+), 149 deletions(-) diff --git a/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java b/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java index 80e3abfcc..c7100cfad 100644 --- a/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java +++ b/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java @@ -74,6 +74,9 @@ public Publisher> doFilterOnce(HttpRequest request, Se .switchMap(aBoolean -> { RouteMatch routeMatch = request.getAttribute(HttpAttributes.ROUTE_MATCH, RouteMatch.class).orElse(null); + if (routeMatch == null) { + return chain.proceed(request); + } Map params = routeMatch.getVariableValues(); if (params.get("programId") != null) { if (routeMatch instanceof MethodBasedRouteMatch) { diff --git a/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java b/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java index 49adcf3d5..61c9ecc72 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java @@ -68,41 +68,21 @@ ProgramService programService() { return mock(ProgramService.class); } - @MockBean(CountryController.class) - CountryController countryController() { - return mock(CountryController.class); - } - @MockBean(CountryService.class) CountryService countryService() { return mock(CountryService.class); } - @MockBean(TopographyController.class) - TopographyController topographyController() { - return mock(TopographyController.class); - } - @MockBean(TopographyService.class) TopographyService topographyService() { return mock(TopographyService.class); } - @MockBean(AccessibilityController.class) - AccessibilityController accessibilityController() { - return mock(AccessibilityController.class); - } - @MockBean(AccessibilityService.class) AccessibilityService accessibilityService() { return mock(AccessibilityService.class); } - @MockBean(EnvironmentTypeController.class) - EnvironmentTypeController environmentTypeController() { - return mock(EnvironmentTypeController.class); - } - @MockBean(EnvironmentTypeService.class) EnvironmentTypeService environmentTypeService() { return mock(EnvironmentTypeService.class); @@ -113,20 +93,12 @@ EnvironmentTypeService environmentTypeService() { @Inject private CountryService countryService; @Inject - private CountryController countryController; - @Inject private AccessibilityService accessibilityService; @Inject - private AccessibilityController accessibilityController; - @Inject private TopographyService topographyService; @Inject - private TopographyController topographyController; - @Inject private EnvironmentTypeService environmentTypeService; @Inject - private EnvironmentTypeController environmentTypeController; - @Inject private UserDAO userDAO; @Inject private DSLContext dsl; @@ -179,7 +151,8 @@ public void controllerHandledExceptionIgnored() { @Test public void getCountriesInternalServerError() { - when(countryController.getCountries()).thenThrow(new DataAccessException("Query 123 failed")); + //when(countryController.getCountries()).thenThrow(new DataAccessException("Query 123 failed")); + when(countryService.getAll()).thenThrow(new DataAccessException("Query 123 failed")); Flowable> call = client.exchange( GET("/countries").cookie(new NettyCookie("phylo-token", "test-country")), String.class @@ -220,7 +193,8 @@ public void countryControllerHandledExceptionIgnored() { @Test public void getTopographiesInternalServerError() { - when(topographyController.getTopographies()).thenThrow(new DataAccessException("Query 123 failed")); + //when(topographyController.getTopographies()).thenThrow(new DataAccessException("Query 123 failed")); + when(topographyService.getAll()).thenThrow(new DataAccessException("Query 123 failed")); Flowable> call = client.exchange( GET("/topography-options").cookie(new NettyCookie("phylo-token", "test-topography")), String.class @@ -263,6 +237,7 @@ public void topographyControllerHandledExceptionIgnored() { public void getAccessibilitiesInternalServerError() { //when(accessibilityController.getAccessibilities()).thenThrow(new DataAccessException("Query 123 failed")); + when(accessibilityService.getAll()).thenThrow(new DataAccessException("Query 123 failed")); Flowable> call = client.exchange( GET("/accessibility-options").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class @@ -303,7 +278,8 @@ public void accessibilityControllerHandledExceptionIgnored() { @Test public void getEnvironmentTypesInternalServerError() { - when(environmentTypeController.getEnvironmentTypes()).thenThrow(new DataAccessException("Query 123 failed")); + //when(environmentTypeController.getEnvironmentTypes()).thenThrow(new DataAccessException("Query 123 failed")); + when(environmentTypeService.getAll()).thenThrow(new DataAccessException("Query 123 failed")); Flowable> call = client.exchange( GET("/environment-data-types").cookie(new NettyCookie("phylo-token", "test-environment-type")), String.class diff --git a/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java index e81796975..a018a244e 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java @@ -19,6 +19,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import io.kowalski.fannypack.FannyPack; import io.micronaut.http.HttpResponse; import io.micronaut.http.HttpStatus; import io.micronaut.http.client.RxHttpClient; @@ -34,8 +35,12 @@ import org.breedinginsight.api.model.v1.response.Response; import org.breedinginsight.api.model.v1.response.metadata.Metadata; import org.breedinginsight.api.model.v1.response.metadata.Pagination; +import org.breedinginsight.api.v1.controller.TestTokenValidator; import org.breedinginsight.api.v1.controller.UserController; +import org.breedinginsight.dao.db.tables.daos.BiUserDao; +import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; import org.breedinginsight.model.User; +import org.jooq.DSLContext; import org.junit.jupiter.api.*; import javax.inject.Inject; @@ -54,17 +59,36 @@ @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class MetadataFilterIntegrationTest extends DatabaseTest { - @Inject - private UserController userController; - @Inject @Client("/${micronaut.bi.api.version}") private RxHttpClient client; - // TODO: Remove this - @MockBean(UserController.class) - UserController userController() { - return mock(UserController.class); + @Inject + @Client("/") + private RxHttpClient plainClient; + + @Inject + private DSLContext dsl; + @Inject + private BiUserDao biUserDao; + + BiUserEntity testUser; + BiUserEntity otherTestUser; + + private FannyPack fp = FannyPack.fill("src/test/resources/sql/UserControllerIntegrationTest.sql"); + + @BeforeAll + public void setup() { + // Insert our traits into the db + dsl.execute(fp.get("InsertProgram")); + dsl.execute(fp.get("InsertUserProgramAssociations")); + dsl.execute(fp.get("InsertManyUsers")); + + testUser = biUserDao.fetchByOrcid(TestTokenValidator.TEST_USER_ORCID).get(0); + otherTestUser = biUserDao.fetchByOrcid(TestTokenValidator.OTHER_TEST_USER_ORCID).get(0); + + dsl.execute(fp.get("InsertSystemRoleAdmin"), testUser.getId().toString()); + dsl.execute(fp.get("InsertSystemRoleAdmin"), otherTestUser.getId().toString()); } @AfterAll @@ -74,15 +98,11 @@ public void finish() { @Test public void getSingleResponseNoMetadataSuccess() { - // TODO: Find an endpoint for this // Check metadata is successfully populated when none is returned from controller - Response mockedResponse = getResponseMock(); - - when(userController.users(any(UUID.class))).thenReturn(HttpResponse.ok(mockedResponse)); Flowable> call = client.exchange( - GET("/users/74a6ebfe-d114-419b-8bdc-2f7b52d26172").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class + GET("/users/" + testUser.getId()).cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class ); HttpResponse response = call.blockingFirst(); @@ -100,75 +120,8 @@ public void getSingleResponseNoMetadataSuccess() { assertEquals(1, data.getAsJsonPrimitive("currentPage").getAsInt(), "Default current page is incorrect"); } - @Test - public void getSingleResponseMetadataSuccess() { - // TODO: Find an endpoint for this - - // Check that if a single result response has metadata, an error is not thrown - Response mockedResponse = getResponseMock(); - - Pagination mockedPagination = new Pagination(6,6,6,1); - Metadata mockedMetadata = new Metadata(); - mockedMetadata.setPagination(mockedPagination); - mockedResponse.setMetadata(mockedMetadata); - - when(userController.users(any(UUID.class))).thenReturn(HttpResponse.ok(mockedResponse)); - - Flowable> call = client.exchange( - GET("/users/74a6ebfe-d114-419b-8bdc-2f7b52d26172").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class - ); - - HttpResponse response = call.blockingFirst(); - assertEquals(HttpStatus.OK, response.getStatus()); - - // Test that our metadata object has been returned - JsonObject data = JsonParser.parseString(response.body()).getAsJsonObject().getAsJsonObject("metadata").getAsJsonObject("pagination"); - - assertTrue(data != null, "Wrong number users"); - - // Check our page numbers weren't altered by the filtered - assertEquals(6, data.getAsJsonPrimitive("totalPages").getAsInt(), "Default total pages is incorrect"); - assertEquals(6, data.getAsJsonPrimitive("totalCount").getAsInt(), "Default total count is incorrect"); - assertEquals(6, data.getAsJsonPrimitive("pageSize").getAsInt(), "Default page size is incorrect"); - assertEquals(1, data.getAsJsonPrimitive("currentPage").getAsInt(), "Default current page is incorrect"); - } - - @Test - public void dataResponseMetadataFilterFailure() { - // TODO: Not sure how to test this one - - // Check we get an exception when a data response is returned without a metadata field and filter annotation on - Response mockedResponse = getDataResponseMock(); - - when(userController.users(any(UUID.class))).thenReturn(HttpResponse.ok(mockedResponse)); - - // This endpoint will never return a data response, but for testing purposes, we will have it return one to test - // if an endpoint with the @FilterMetadata annotation ever did return a data response. - Flowable> call = client.exchange( - GET("/users/74a6ebfe-d114-419b-8bdc-2f7b52d26172").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class - ); - - HttpClientResponseException e = Assertions.assertThrows(HttpClientResponseException.class, () -> { - HttpResponse response = call.blockingFirst(); - }); - - assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, e.getStatus()); - - } - @Test public void getDataResponseMetadataFilterSuccess() { - // TODO: Just test on real users endpoint - - // Check we don't get an exception when a data response with proper metadata is returned - Response mockedResponse = getDataResponseMock(); - - Pagination mockedPagination = new Pagination(6,6,6,1); - Metadata mockedMetadata = new Metadata(); - mockedMetadata.setPagination(mockedPagination); - mockedResponse.setMetadata(mockedMetadata); - - when(userController.users(any(QueryParams.class))).thenReturn(HttpResponse.ok(mockedResponse)); Flowable> call = client.exchange( GET("/users").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class @@ -183,22 +136,16 @@ public void getDataResponseMetadataFilterSuccess() { assertTrue(data != null, "Metadata was not populated"); // Check our page numbers weren't altered by the filtered - assertEquals(6, data.getAsJsonPrimitive("totalPages").getAsInt(), "Default total pages is incorrect"); - assertEquals(6, data.getAsJsonPrimitive("totalCount").getAsInt(), "Default total count is incorrect"); - assertEquals(6, data.getAsJsonPrimitive("pageSize").getAsInt(), "Default page size is incorrect"); + assertEquals(1, data.getAsJsonPrimitive("totalPages").getAsInt(), "Default total pages is incorrect"); + assertEquals(38, data.getAsJsonPrimitive("totalCount").getAsInt(), "Default total count is incorrect"); + assertEquals(38, data.getAsJsonPrimitive("pageSize").getAsInt(), "Default page size is incorrect"); assertEquals(1, data.getAsJsonPrimitive("currentPage").getAsInt(), "Default current page is incorrect"); } @Test public void filterNotCalledNoAnnotation(){ - //TODO: Looks like mocking the bean is messing with ROUTE_MATCH. Figure out something else for these endpoints. Maybe try out health endpoint? - // Check that the metadata filter does not add metadata when annotation is missing - Response mockedResponse = getResponseMock(); - - when(userController.users(any(QueryParams.class))).thenReturn(HttpResponse.ok(mockedResponse)); - - Flowable> call = client.exchange( + Flowable> call = plainClient.exchange( GET("/health").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class ); @@ -210,33 +157,4 @@ public void filterNotCalledNoAnnotation(){ assertTrue(metadata == null, "Metadata was populated, but shouldn't have been"); } - - public Response getResponseMock() { - - User mockedUser = User.builder() - .name("Test User") - .email("test@user.com") - .id(UUID.randomUUID()) - .orcid("testorcid") - .build(); - - return new Response<>(mockedUser); - } - - public Response> getDataResponseMock() { - - User mockedUser = User.builder() - .name("Test User") - .email("test@user.com") - .id(UUID.randomUUID()) - .orcid("testorcid") - .build(); - List users = new ArrayList<>(); - users.add(mockedUser); - users.add(mockedUser); - DataResponse dataResponse = new DataResponse().setData(users); - Response mockedResponse = new Response().setResult(dataResponse); - - return mockedResponse; - } } From 2afb97a6cf943ebe92e6bb5db72e764af3b6a6ba Mon Sep 17 00:00:00 2001 From: Chris T Date: Tue, 18 Jan 2022 12:19:36 -0500 Subject: [PATCH 06/30] micronaut update 2.1.0: flyway is broken --- migration-todos.txt | 8 +++----- pom.xml | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/migration-todos.txt b/migration-todos.txt index 360d77553..0417502dc 100644 --- a/migration-todos.txt +++ b/migration-todos.txt @@ -1,12 +1,10 @@ Fixes: -2. Fix tests - - TokenControllerIntegrationTest - - InternalServerErrorHandlerTest - - MetadataFilterIntegrationTest +1. Migration up to 2.1.0 breaks flyway Testing: 1. Test new account creation 2. Logged out redirect 3. Sign in errors 4. Pages and tables -5. End point not found \ No newline at end of file +5. End point not found +6. Launching an app from scratch \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8e5ae56c9..b9ceaf3c6 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ - 2.0.0 + 2.1.0 13 ${jdk.version} ${jdk.version} From 99c1e92ad74c01cfd571a811bda25439d79260ff Mon Sep 17 00:00:00 2001 From: Chris T Date: Mon, 31 Jan 2022 10:53:41 -0500 Subject: [PATCH 07/30] fix tests after rebasing on develop --- pom.xml | 2 +- .../v1/controller/metadata/MetadataFilterIntegrationTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index b9ceaf3c6..8e5ae56c9 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ - 2.1.0 + 2.0.0 13 ${jdk.version} ${jdk.version} diff --git a/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java index a018a244e..b2eb9d465 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java @@ -138,7 +138,7 @@ public void getDataResponseMetadataFilterSuccess() { // Check our page numbers weren't altered by the filtered assertEquals(1, data.getAsJsonPrimitive("totalPages").getAsInt(), "Default total pages is incorrect"); assertEquals(38, data.getAsJsonPrimitive("totalCount").getAsInt(), "Default total count is incorrect"); - assertEquals(38, data.getAsJsonPrimitive("pageSize").getAsInt(), "Default page size is incorrect"); + assertEquals(50, data.getAsJsonPrimitive("pageSize").getAsInt(), "Default page size is incorrect"); assertEquals(1, data.getAsJsonPrimitive("currentPage").getAsInt(), "Default current page is incorrect"); } From 74bd3616ecbd0ac0ec13b693082ea5b04994d835 Mon Sep 17 00:00:00 2001 From: Chris T Date: Mon, 31 Jan 2022 11:11:53 -0500 Subject: [PATCH 08/30] micronaut upgrade: version 2.1.0 tests pass --- pom.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 8e5ae56c9..c2ef42fac 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ - 2.0.0 + 2.1.0 13 ${jdk.version} ${jdk.version} @@ -75,7 +75,7 @@ 4.1.2 3.10 1.16.2 - 6.4.4 + 6.5.4 @@ -274,6 +274,11 @@ micronaut-test-spock test + + org.flywaydb + flyway-core + ${flyway.version} + org.mockito mockito-inline @@ -373,11 +378,6 @@ cloning 1.10.3 - - org.flywaydb - flyway-core - ${flyway.version} - From 413af95caf6dfe84a7ec576040326b32ed94982d Mon Sep 17 00:00:00 2001 From: Chris T Date: Wed, 2 Feb 2022 14:40:49 -0500 Subject: [PATCH 09/30] micronuat upgrade: fix 2.2.0 @MicronautTest import --- .../api/auth/AuthServiceLoginHandlerUnitTest.java | 2 +- .../auth/rules/ProgramSecuredAnnotationRuleIntegrationTest.java | 2 +- .../v1/controller/AccessibilityControllerIntegrationTest.java | 2 +- .../api/v1/controller/CountryControllerIntegrationTest.java | 2 +- .../v1/controller/EnvironmentTypeControllerIntegrationTest.java | 2 +- .../api/v1/controller/ImportControllerIntegrationTest.java | 2 +- .../api/v1/controller/InternalServerErrorHandlerUnitTest.java | 2 +- .../api/v1/controller/ProgramControllerIntegrationTest.java | 2 +- .../api/v1/controller/RoleControllerIntegrationTest.java | 2 +- .../api/v1/controller/ServerInfoControllerIntegrationTest.java | 2 +- .../api/v1/controller/TokenControllerIntegrationTest.java | 2 +- .../api/v1/controller/TopographyControllerIntegrationTest.java | 2 +- .../api/v1/controller/TraitControllerIntegrationTest.java | 2 +- .../v1/controller/brapi/BrAPIServiceFilterIntegrationTest.java | 2 +- .../v1/controller/metadata/MetadataFilterIntegrationTest.java | 2 +- .../v1/controller/BrapiAuthorizeControllerIntegrationTest.java | 2 +- .../BrapiObservationVariablesControllerIntegrationTest.java | 2 +- .../brapi/v2/BrAPIV2ControllerIntegrationTest.java | 2 +- .../brapi/v2/GermplasmControllerIntegrationTest.java | 2 +- .../breedinginsight/brapps/importer/GermplasmTemplateMap.java | 2 +- .../daos/DSLTransactionResultIntegrationTest.java | 2 +- .../utilities/response/ResponseUtilsIntegrationTest.java | 2 +- 22 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java b/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java index 410a3bd56..860bc6253 100644 --- a/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java +++ b/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java @@ -23,7 +23,7 @@ import io.micronaut.http.HttpResponse; import io.micronaut.http.cookie.Cookie; import io.micronaut.http.simple.cookies.SimpleCookies; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRuleIntegrationTest.java b/src/test/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRuleIntegrationTest.java index 807a21e10..5daa38a41 100644 --- a/src/test/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRuleIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRuleIntegrationTest.java @@ -26,7 +26,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.BrAPITest; import org.breedinginsight.api.model.v1.request.ProgramRequest; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/AccessibilityControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/AccessibilityControllerIntegrationTest.java index 690c84210..4d31f4561 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/AccessibilityControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/AccessibilityControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/CountryControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/CountryControllerIntegrationTest.java index 5664b89aa..c9555c06d 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/CountryControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/CountryControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/EnvironmentTypeControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/EnvironmentTypeControllerIntegrationTest.java index a98eff8a1..e01ef6648 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/EnvironmentTypeControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/EnvironmentTypeControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/ImportControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/ImportControllerIntegrationTest.java index c5b872c89..47115ce10 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/ImportControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/ImportControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.client.multipart.MultipartBody; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.breedinginsight.BrAPITest; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java b/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java index 61c9ecc72..5aed4b3b5 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java @@ -28,7 +28,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.test.annotation.MockBean; import io.reactivex.Flowable; import lombok.SneakyThrows; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/ProgramControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/ProgramControllerIntegrationTest.java index d6fd0d52a..e67b44fd9 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/ProgramControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/ProgramControllerIntegrationTest.java @@ -31,7 +31,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.test.annotation.MockBean; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/RoleControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/RoleControllerIntegrationTest.java index 149852601..70307fa7e 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/RoleControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/RoleControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/ServerInfoControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/ServerInfoControllerIntegrationTest.java index 673115f9e..9807e14ea 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/ServerInfoControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/ServerInfoControllerIntegrationTest.java @@ -22,7 +22,7 @@ import io.micronaut.http.HttpStatus; import io.micronaut.http.client.RxHttpClient; import io.micronaut.http.client.annotation.Client; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.AfterAll; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TokenControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TokenControllerIntegrationTest.java index edf935c2e..43fd5a6d3 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TokenControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TokenControllerIntegrationTest.java @@ -22,7 +22,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TopographyControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TopographyControllerIntegrationTest.java index 4b4ad0681..9255d7373 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TopographyControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TopographyControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java index 300a5eee1..c0a40062e 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java @@ -26,7 +26,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; import lombok.SneakyThrows; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilterIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilterIntegrationTest.java index 793d38e77..0af3f0172 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilterIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilterIntegrationTest.java @@ -26,7 +26,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.test.annotation.MockBean; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java index b2eb9d465..3ec8d5215 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java @@ -26,7 +26,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.test.annotation.MockBean; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; diff --git a/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiAuthorizeControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiAuthorizeControllerIntegrationTest.java index a437b70a7..13add58e0 100644 --- a/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiAuthorizeControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiAuthorizeControllerIntegrationTest.java @@ -23,7 +23,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.breedinginsight.DatabaseTest; diff --git a/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiObservationVariablesControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiObservationVariablesControllerIntegrationTest.java index 668c99f80..56f6d00d6 100644 --- a/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiObservationVariablesControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiObservationVariablesControllerIntegrationTest.java @@ -25,7 +25,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.breedinginsight.BrAPITest; diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ControllerIntegrationTest.java index 0c1ddd56e..4c423bfb1 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ControllerIntegrationTest.java @@ -25,7 +25,7 @@ import io.micronaut.http.MediaType; import io.micronaut.http.client.RxHttpClient; import io.micronaut.http.client.annotation.Client; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.brapi.v2.model.BrAPIExternalReference; diff --git a/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java index 478a095a7..b541fcb59 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java @@ -7,7 +7,7 @@ import io.micronaut.http.client.RxHttpClient; import io.micronaut.http.client.annotation.Client; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; import lombok.SneakyThrows; diff --git a/src/test/java/org/breedinginsight/brapps/importer/GermplasmTemplateMap.java b/src/test/java/org/breedinginsight/brapps/importer/GermplasmTemplateMap.java index 0ea12379d..17f0c0049 100644 --- a/src/test/java/org/breedinginsight/brapps/importer/GermplasmTemplateMap.java +++ b/src/test/java/org/breedinginsight/brapps/importer/GermplasmTemplateMap.java @@ -11,7 +11,7 @@ import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.client.multipart.MultipartBody; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.brapi.v2.model.core.BrAPIListTypes; diff --git a/src/test/java/org/breedinginsight/daos/DSLTransactionResultIntegrationTest.java b/src/test/java/org/breedinginsight/daos/DSLTransactionResultIntegrationTest.java index 38b6693d2..c23f8c610 100644 --- a/src/test/java/org/breedinginsight/daos/DSLTransactionResultIntegrationTest.java +++ b/src/test/java/org/breedinginsight/daos/DSLTransactionResultIntegrationTest.java @@ -17,7 +17,7 @@ package org.breedinginsight.daos; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.breedinginsight.DatabaseTest; import org.breedinginsight.api.v1.controller.TestTokenValidator; import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; diff --git a/src/test/java/org/breedinginsight/utilities/response/ResponseUtilsIntegrationTest.java b/src/test/java/org/breedinginsight/utilities/response/ResponseUtilsIntegrationTest.java index f5dd3370c..b61270a74 100644 --- a/src/test/java/org/breedinginsight/utilities/response/ResponseUtilsIntegrationTest.java +++ b/src/test/java/org/breedinginsight/utilities/response/ResponseUtilsIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.breedinginsight.DatabaseTest; From af10a3e7786ac410d82d411ba9a05601a124e002 Mon Sep 17 00:00:00 2001 From: Chris T Date: Wed, 2 Feb 2022 14:41:27 -0500 Subject: [PATCH 10/30] micronaut upgrade: fix 2.2.0 migrations reference --- src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6db788992..c1d207a0e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -102,8 +102,8 @@ flyway: datasources: default: locations: - - classpath:org.breedinginsight.db.migration - - classpath:db.migration + - classpath:org/breedinginsight/db/migration + - classpath:db/migration enabled: true placeholders: default-url: ${brapi.server.default-url} From cac4167b19d28dee8fc31283d3bde6c4b6bf6d77 Mon Sep 17 00:00:00 2001 From: Chris T Date: Wed, 2 Feb 2022 14:42:04 -0500 Subject: [PATCH 11/30] micronuat upgrade: fix more 2.2.0 @MicronautTest imports --- .../breedinginsight/api/model/v1/request/UserRequestTest.java | 2 +- .../api/v1/controller/TraitUploadControllerIntegrationTest.java | 2 +- .../api/v1/controller/UploadControllerIntegrationTest.java | 2 +- .../api/v1/controller/UserControllerIntegrationTest.java | 2 +- .../services/validators/TraitValidatorIntegrationTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/breedinginsight/api/model/v1/request/UserRequestTest.java b/src/test/java/org/breedinginsight/api/model/v1/request/UserRequestTest.java index 8b7d8d111..a2796c869 100644 --- a/src/test/java/org/breedinginsight/api/model/v1/request/UserRequestTest.java +++ b/src/test/java/org/breedinginsight/api/model/v1/request/UserRequestTest.java @@ -17,7 +17,7 @@ package org.breedinginsight.api.model.v1.request; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.validation.validator.Validator; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.AfterAll; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java index d2f369fad..77bfa672d 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java @@ -26,7 +26,7 @@ import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.client.multipart.MultipartBody; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; import org.breedinginsight.BrAPITest; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/UploadControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/UploadControllerIntegrationTest.java index 963fd872f..a2242e47d 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/UploadControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/UploadControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.client.multipart.MultipartBody; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.breedinginsight.BrAPITest; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/UserControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/UserControllerIntegrationTest.java index d805886e0..6f2705488 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/UserControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/UserControllerIntegrationTest.java @@ -28,7 +28,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.test.annotation.MockBean; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; diff --git a/src/test/java/org/breedinginsight/services/validators/TraitValidatorIntegrationTest.java b/src/test/java/org/breedinginsight/services/validators/TraitValidatorIntegrationTest.java index 516fa1183..4b78fb6c3 100644 --- a/src/test/java/org/breedinginsight/services/validators/TraitValidatorIntegrationTest.java +++ b/src/test/java/org/breedinginsight/services/validators/TraitValidatorIntegrationTest.java @@ -18,7 +18,7 @@ package org.breedinginsight.services.validators; import io.kowalski.fannypack.FannyPack; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import lombok.SneakyThrows; import org.breedinginsight.DatabaseTest; import org.breedinginsight.dao.db.tables.daos.ProgramDao; From e116c5985111492f14f59940d5a30ddf0f05c7d3 Mon Sep 17 00:00:00 2001 From: Chris T Date: Wed, 2 Feb 2022 16:52:15 -0500 Subject: [PATCH 12/30] micronaut upgrade: fix trait dao temp table to list contains --- .../java/org/breedinginsight/daos/TraitDAO.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/breedinginsight/daos/TraitDAO.java b/src/main/java/org/breedinginsight/daos/TraitDAO.java index 443694d58..e9eb47432 100644 --- a/src/main/java/org/breedinginsight/daos/TraitDAO.java +++ b/src/main/java/org/breedinginsight/daos/TraitDAO.java @@ -45,8 +45,7 @@ import static org.breedinginsight.dao.db.Tables.*; import static org.breedinginsight.services.brapi.BrAPIClientType.PHENO; -import static org.jooq.impl.DSL.row; -import static org.jooq.impl.DSL.values; +import static org.jooq.impl.DSL.*; @Singleton public class TraitDAO extends TraitDao { @@ -521,24 +520,22 @@ private SelectOnConditionStep getTraitSql(BiUserTable createdByTableAlia public List getTraitsByTraitName(UUID programId, List traits){ - RowN[] valueRows = traits.stream() + String[] names = traits.stream() .filter(trait -> trait.getObservationVariableName() != null) - .map(trait -> (RowN) row(trait.getObservationVariableName())) - .collect(Collectors.toList()).toArray(RowN[]::new); + .map(trait -> trait.getObservationVariableName().toLowerCase()) + .collect(Collectors.toList()).toArray(String[]::new); List traitResults = new ArrayList<>(); - if (valueRows.length > 0){ - Table newTraits = dsl.select() - .from(values(valueRows).as("newTraits", "new_trait_name")).asTable("newTraits"); + if (names.length > 0){ Result records = dsl.select() - .from(newTraits) - .join(TRAIT).on(TRAIT.OBSERVATION_VARIABLE_NAME.upper().equalIgnoreCase(newTraits.field("new_trait_name"))) + .from(TRAIT) .join(PROGRAM_ONTOLOGY).on(TRAIT.PROGRAM_ONTOLOGY_ID.eq(PROGRAM_ONTOLOGY.ID)) .join(PROGRAM).on(PROGRAM_ONTOLOGY.PROGRAM_ID.eq(PROGRAM.ID)) .join(SCALE).on(TRAIT.SCALE_ID.eq(SCALE.ID)) .join(METHOD).on(TRAIT.METHOD_ID.eq(METHOD.ID)) .where(PROGRAM.ID.eq(programId)) + .and(lower(TRAIT.OBSERVATION_VARIABLE_NAME).in(names)) .fetch(); for (Record record: records) { From 17f84325c98725594371bdcb4e64ffc58d7f013b Mon Sep 17 00:00:00 2001 From: Chris T Date: Wed, 2 Feb 2022 16:53:30 -0500 Subject: [PATCH 13/30] micronaut upgrade: 2.2.0 fix jackson deserialization of @SuperBuilder --- migration-todos.txt | 2 +- pom.xml | 10 +++++----- src/main/java/org/breedinginsight/model/Method.java | 4 ++++ src/main/java/org/breedinginsight/model/Program.java | 4 ++++ .../breedinginsight/model/ProgramObservationLevel.java | 4 ++++ .../org/breedinginsight/model/ProgramOntology.java | 4 ++++ src/main/java/org/breedinginsight/model/Scale.java | 4 ++++ src/main/java/org/breedinginsight/model/Trait.java | 5 +++++ src/main/java/org/breedinginsight/model/User.java | 4 ++++ 9 files changed, 35 insertions(+), 6 deletions(-) diff --git a/migration-todos.txt b/migration-todos.txt index 0417502dc..4e3a29d8e 100644 --- a/migration-todos.txt +++ b/migration-todos.txt @@ -1,5 +1,5 @@ Fixes: -1. Migration up to 2.1.0 breaks flyway +3. Change all ProgramDao to ProgramDAO in tests Testing: 1. Test new account creation diff --git a/pom.xml b/pom.xml index c2ef42fac..bd02140c8 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ - 2.1.0 + 2.2.0 13 ${jdk.version} ${jdk.version} @@ -63,7 +63,7 @@ 2.19.1 --enable-preview - 3.12.3 + 3.16.3 42.2.6 1.2.3 1.18.16 @@ -75,7 +75,7 @@ 4.1.2 3.10 1.16.2 - 6.5.4 + 7.0.4 @@ -526,7 +526,7 @@ org.breedinginsight bi-jooq-codegen - 1.0-SNAPSHOT + ${jooq.version} @@ -563,7 +563,7 @@ org.junit.jupiter junit-jupiter-engine - 5.1.0 + 5.7.0 diff --git a/src/main/java/org/breedinginsight/model/Method.java b/src/main/java/org/breedinginsight/model/Method.java index 9db01762b..b300e96f5 100644 --- a/src/main/java/org/breedinginsight/model/Method.java +++ b/src/main/java/org/breedinginsight/model/Method.java @@ -18,12 +18,14 @@ package org.breedinginsight.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.micronaut.core.annotation.Introspected; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.brapi.v2.model.pheno.BrAPIMethod; import org.breedinginsight.dao.db.tables.pojos.MethodEntity; import org.jooq.Record; @@ -36,6 +38,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "id", "programOntologyId", "updatedBy", "createdBy", "updatedAt", "createdAt" }) public class Method extends MethodEntity { diff --git a/src/main/java/org/breedinginsight/model/Program.java b/src/main/java/org/breedinginsight/model/Program.java index 35cebadb5..b7c23e108 100644 --- a/src/main/java/org/breedinginsight/model/Program.java +++ b/src/main/java/org/breedinginsight/model/Program.java @@ -19,9 +19,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.micronaut.core.annotation.Introspected; import lombok.*; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.brapi.v2.model.core.BrAPIProgram; import org.brapi.v2.model.pheno.BrAPIObservationVariable; import org.breedinginsight.dao.db.tables.ProgramTable; @@ -37,6 +39,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "createdBy", "updatedBy", "speciesId" }) public class Program extends ProgramEntity { diff --git a/src/main/java/org/breedinginsight/model/ProgramObservationLevel.java b/src/main/java/org/breedinginsight/model/ProgramObservationLevel.java index 1c4b84067..95f83265d 100644 --- a/src/main/java/org/breedinginsight/model/ProgramObservationLevel.java +++ b/src/main/java/org/breedinginsight/model/ProgramObservationLevel.java @@ -18,12 +18,14 @@ package org.breedinginsight.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.micronaut.core.annotation.Introspected; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.breedinginsight.dao.db.tables.pojos.ProgramObservationLevelEntity; import org.jooq.Record; @@ -35,6 +37,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "updatedBy", "createdBy" }) public class ProgramObservationLevel extends ProgramObservationLevelEntity { diff --git a/src/main/java/org/breedinginsight/model/ProgramOntology.java b/src/main/java/org/breedinginsight/model/ProgramOntology.java index 754b2dbae..d363ba96e 100644 --- a/src/main/java/org/breedinginsight/model/ProgramOntology.java +++ b/src/main/java/org/breedinginsight/model/ProgramOntology.java @@ -18,12 +18,14 @@ package org.breedinginsight.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.micronaut.core.annotation.Introspected; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.breedinginsight.dao.db.tables.pojos.ProgramOntologyEntity; import org.jooq.Record; @@ -35,6 +37,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "updatedBy", "createdBy" }) public class ProgramOntology extends ProgramOntologyEntity { diff --git a/src/main/java/org/breedinginsight/model/Scale.java b/src/main/java/org/breedinginsight/model/Scale.java index 65649e74f..f1c3ebf8f 100644 --- a/src/main/java/org/breedinginsight/model/Scale.java +++ b/src/main/java/org/breedinginsight/model/Scale.java @@ -18,12 +18,14 @@ package org.breedinginsight.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.micronaut.core.annotation.Introspected; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.brapi.v2.model.pheno.BrAPIScale; import org.brapi.v2.model.pheno.BrAPIScaleValidValues; import org.brapi.v2.model.pheno.BrAPIScaleValidValuesCategories; @@ -40,6 +42,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "id", "programOntologyId", "updatedBy", "createdBy", "updatedAt", "createdAt" }) public class Scale extends ScaleEntity { diff --git a/src/main/java/org/breedinginsight/model/Trait.java b/src/main/java/org/breedinginsight/model/Trait.java index a7f17dfea..7ad7cc9e1 100644 --- a/src/main/java/org/breedinginsight/model/Trait.java +++ b/src/main/java/org/breedinginsight/model/Trait.java @@ -20,18 +20,21 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import io.micronaut.core.annotation.Introspected; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.brapi.v2.model.pheno.BrAPIObservationVariable; import org.breedinginsight.api.deserializer.ArrayOfStringDeserializer; import org.breedinginsight.api.deserializer.ListOfStringDeserializer; import org.breedinginsight.dao.db.tables.pojos.TraitEntity; import org.jooq.Record; +import javax.validation.Valid; import java.util.List; import static org.breedinginsight.dao.db.Tables.TRAIT; @@ -42,6 +45,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "methodId", "scaleId", "programOntologyId", "programObservationLevelId", "createdBy", "updatedBy"}) public class Trait extends TraitEntity { diff --git a/src/main/java/org/breedinginsight/model/User.java b/src/main/java/org/breedinginsight/model/User.java index acbaadbe7..15b38c1be 100644 --- a/src/main/java/org/breedinginsight/model/User.java +++ b/src/main/java/org/breedinginsight/model/User.java @@ -19,9 +19,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; +import io.micronaut.core.annotation.Introspected; import lombok.*; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.breedinginsight.dao.db.tables.BiUserTable; import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; import org.jooq.Record; @@ -38,6 +40,8 @@ @Accessors(chain=true) @ToString @SuperBuilder +@Introspected +@Jacksonized @JsonIgnoreProperties(value = {"accountToken"}) public class User extends BiUserEntity{ From 25952263885439380e794453bf31600faaa886bd Mon Sep 17 00:00:00 2001 From: Chris T Date: Wed, 2 Feb 2022 16:56:08 -0500 Subject: [PATCH 14/30] micronaut upgrade: 2.2.0 all tests pass --- migration-todos.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/migration-todos.txt b/migration-todos.txt index 4e3a29d8e..7e4019303 100644 --- a/migration-todos.txt +++ b/migration-todos.txt @@ -1,5 +1,4 @@ Fixes: -3. Change all ProgramDao to ProgramDAO in tests Testing: 1. Test new account creation From 9c9ba459b0031e744c2871f93d0ae6b27aa4938c Mon Sep 17 00:00:00 2001 From: Chris T Date: Wed, 2 Feb 2022 17:06:58 -0500 Subject: [PATCH 15/30] micronaut upgrade: 2.3.0 tests pass --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index bd02140c8..283df9351 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ - 2.2.0 + 2.3.0 13 ${jdk.version} ${jdk.version} @@ -75,7 +75,7 @@ 4.1.2 3.10 1.16.2 - 7.0.4 + 7.4.0 From 207b4fb649596cebb948d7d3effcb234707ce432 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 3 Feb 2022 10:04:20 -0500 Subject: [PATCH 16/30] micronaut upgrade: 2.4.0 remove clashing and unnecessary httpstatusexception logger --- .../HttpStatusExceptionHandler.java | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 src/main/java/org/breedinginsight/api/v1/controller/HttpStatusExceptionHandler.java diff --git a/src/main/java/org/breedinginsight/api/v1/controller/HttpStatusExceptionHandler.java b/src/main/java/org/breedinginsight/api/v1/controller/HttpStatusExceptionHandler.java deleted file mode 100644 index 0018a1e8d..000000000 --- a/src/main/java/org/breedinginsight/api/v1/controller/HttpStatusExceptionHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.breedinginsight.api.v1.controller; - -import io.micronaut.context.annotation.Requires; -import io.micronaut.http.HttpRequest; -import io.micronaut.http.HttpResponse; -import io.micronaut.http.annotation.Produces; -import io.micronaut.http.exceptions.HttpStatusException; -import io.micronaut.http.server.exceptions.ExceptionHandler; -import lombok.extern.slf4j.Slf4j; - -import javax.inject.Singleton; - -@Produces -@Singleton -@Slf4j -@Requires(classes = {Exception.class, ExceptionHandler.class}) -public class HttpStatusExceptionHandler implements ExceptionHandler { - - @Override - public HttpResponse handle(HttpRequest request, HttpStatusException e) { - log.error(e.getMessage()); - return HttpResponse.status(e.getStatus(), e.getMessage()); - } -} From 27f1b438e5a67a23beec50160e32316191f558c1 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 3 Feb 2022 10:04:55 -0500 Subject: [PATCH 17/30] micronaut upgrade: 2.4.0 all tests pass --- pom.xml | 4 ++-- .../api/model/v1/request/SystemRolesRequest.java | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 283df9351..c057ee591 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ - 2.3.0 + 2.4.0 13 ${jdk.version} ${jdk.version} @@ -75,7 +75,7 @@ 4.1.2 3.10 1.16.2 - 7.4.0 + 7.5.3 diff --git a/src/main/java/org/breedinginsight/api/model/v1/request/SystemRolesRequest.java b/src/main/java/org/breedinginsight/api/model/v1/request/SystemRolesRequest.java index 57c970fea..2a1520824 100644 --- a/src/main/java/org/breedinginsight/api/model/v1/request/SystemRolesRequest.java +++ b/src/main/java/org/breedinginsight/api/model/v1/request/SystemRolesRequest.java @@ -19,6 +19,7 @@ import io.micronaut.core.annotation.Introspected; import lombok.*; +import lombok.extern.jackson.Jacksonized; import org.breedinginsight.model.SystemRole; import javax.validation.constraints.NotNull; @@ -31,6 +32,7 @@ @AllArgsConstructor @NoArgsConstructor @Introspected +@Jacksonized public class SystemRolesRequest { @NotNull private List systemRoles; From 9b44e6e7bc280185a56cca8010b2e1d03414e70e Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 3 Feb 2022 10:16:18 -0500 Subject: [PATCH 18/30] micronaut upgrade: 2.5.0 all tests pass --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c057ee591..8215e3031 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ - 2.4.0 + 2.5.0 13 ${jdk.version} ${jdk.version} @@ -75,7 +75,7 @@ 4.1.2 3.10 1.16.2 - 7.5.3 + 7.7.3 From a293fc1b26bc00014f946274d5d6e8e02aea2016 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 3 Feb 2022 10:31:44 -0500 Subject: [PATCH 19/30] micronaut upgrade: 2.5.13 all tests pass --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8215e3031..0c44b6022 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ - 2.5.0 + 2.5.13 13 ${jdk.version} ${jdk.version} From e8cc27bbcb0b8bf717e0dd1084f011895686c9b5 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 3 Feb 2022 11:18:27 -0500 Subject: [PATCH 20/30] library upgrades: batch 1 all tests pass --- pom.xml | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index 0c44b6022..c7b6b2874 100644 --- a/pom.xml +++ b/pom.xml @@ -64,10 +64,11 @@ --enable-preview 3.16.3 - 42.2.6 - 1.2.3 - 1.18.16 - 2.8.6 + 42.3.2 + 1.2.10 + 1.18.22 + 2.8.9 + 1.1.2 1.14 1.8 @@ -76,6 +77,17 @@ 3.10 1.16.2 7.7.3 + 28.1-jre + 4.2.2 + 4.2.0 + 2.0.2 + 2.6 + 1.24.1 + 1.6.2 + 4.3 + 0.38.2 + 1.4.1 + 1.10.3 @@ -234,7 +246,7 @@ com.google.guava guava - 28.1-jre + ${guava.version} @@ -246,12 +258,12 @@ com.squareup.okhttp3 okhttp - 4.2.2 + ${okhttp.version} ch.qos.logback logback-classic - 1.2.3 + ${logback.version} runtime @@ -310,7 +322,7 @@ org.brapi brapi-java-client - 2.0.2 + ${brapi-java-client.version} org.apache.commons @@ -335,48 +347,48 @@ commons-io commons-io - 2.6 + ${commons-io.version} org.apache.tika tika-app - 1.24.1 + ${tika-app.version} com.sun.mail javax.mail - 1.6.2 + ${javaxmail.version} org.antlr ST4 - 4.3 + ${st4.version} compile tech.tablesaw tablesaw-core - 0.38.2 + ${tablesaw.version} tech.tablesaw tablesaw-excel - 0.38.2 + ${tablesaw.version} tech.tablesaw tablesaw-json - 0.38.2 + ${tablesaw.version} se.sawano.java alphanumeric-comparator - 1.4.1 + ${alphanumeric-comparator.version} io.github.kostaskougios cloning - 1.10.3 + ${cloning.version} From 2d1fb0550a827c9bfebcbb293514ac29a3ce1060 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 3 Feb 2022 11:45:18 -0500 Subject: [PATCH 21/30] library upgrade: batch 2 all tests pass --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index c7b6b2874..46b98dd0e 100644 --- a/pom.xml +++ b/pom.xml @@ -68,17 +68,17 @@ 1.2.10 1.18.22 2.8.9 - - 1.1.2 1.14 + 1.8 4.1.2 4.1.2 3.10 - 1.16.2 + 1.16.3 7.7.3 - 28.1-jre - 4.2.2 + 31.0.1-jre + 4.9.3 + 4.2.0 2.0.2 2.6 From dfee51f54a26a2d45b3df059357333d505a34b18 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 3 Feb 2022 12:11:23 -0500 Subject: [PATCH 22/30] library upgrades: batch 3 all tests pass, added fixes --- pom.xml | 10 +++++----- .../api/v1/controller/brapi/BrAPIServiceFilter.java | 1 - .../brapps/importer/services/FileImportService.java | 3 +-- .../brapps/importer/services/MappingManager.java | 6 +++--- .../services/parsers/MimeTypeParser.java | 3 ++- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 46b98dd0e..0d907e8da 100644 --- a/pom.xml +++ b/pom.xml @@ -78,13 +78,13 @@ 7.7.3 31.0.1-jre 4.9.3 - - 4.2.0 + 4.3.1 2.0.2 - 2.6 - 1.24.1 + 2.11.0 + 2.2.1 1.6.2 - 4.3 + 4.3.1 + 0.38.2 1.4.1 1.10.3 diff --git a/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java b/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java index c7100cfad..90d45a5b2 100644 --- a/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java +++ b/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java @@ -31,7 +31,6 @@ import io.reactivex.Flowable; import io.reactivex.schedulers.Schedulers; import io.micronaut.http.exceptions.HttpStatusException; -import org.apache.http.HttpException; import org.breedinginsight.services.brapi.BrAPIClientProvider; import org.breedinginsight.model.ProgramBrAPIEndpoints; import org.breedinginsight.services.ProgramService; diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java index 588fcf6a3..00866bc1d 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -58,7 +58,6 @@ import javax.inject.Inject; import javax.inject.Singleton; -import javax.ws.rs.BadRequestException; import java.io.IOException; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -339,7 +338,7 @@ public ImportResponse updateUpload(UUID programId, UUID uploadId, AuthenticatedU // Check that the program that the user created the import for is the one they are updating for if (!programId.equals(upload.getProgramId())){ - throw new BadRequestException("Unable to update upload for a different program than the upload was created in."); + throw new HttpStatusException(HttpStatus.BAD_REQUEST, "Unable to update upload for a different program than the upload was created in."); } // Get mapping diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/MappingManager.java b/src/main/java/org/breedinginsight/brapps/importer/services/MappingManager.java index 4dd9982e6..90c5af46d 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/MappingManager.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/MappingManager.java @@ -18,6 +18,7 @@ package org.breedinginsight.brapps.importer.services; import io.micronaut.http.HttpStatus; +import io.micronaut.http.exceptions.HttpStatusException; import io.micronaut.http.server.exceptions.InternalServerException; import org.apache.commons.lang3.StringUtils; import org.breedinginsight.api.model.v1.response.ValidationError; @@ -38,7 +39,6 @@ import javax.inject.Inject; import javax.inject.Singleton; -import javax.ws.rs.BadRequestException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.*; @@ -233,7 +233,7 @@ private void mapField(Object parent, Field field, List mappings, T } else if (matchedMapping.getValue().getRelationMap().getReference() == null && matchedMapping.getValue().getRelationMap().getTarget() == null) { - throw new BadRequestException("Relationship field is not properly formatted"); + throw new HttpStatusException(HttpStatus.BAD_REQUEST, "Relationship field is not properly formatted"); } MappingValue value = matchedMapping.getValue(); @@ -266,7 +266,7 @@ private void mapField(Object parent, Field field, List mappings, T return; } else if (matchedMapping.getValue() != null && matchedMapping.getValue().getFileFieldName() == null && matchedMapping.getValue().getConstantValue() == null){ - throw new BadRequestException("Basic mapping field must have file field or constant value specified."); + throw new HttpStatusException(HttpStatus.BAD_REQUEST, "Basic mapping field must have file field or constant value specified."); } // Check if the mapping passed a constant value or a mapped value diff --git a/src/main/java/org/breedinginsight/services/parsers/MimeTypeParser.java b/src/main/java/org/breedinginsight/services/parsers/MimeTypeParser.java index d4fc2d84a..3ebab1fc1 100644 --- a/src/main/java/org/breedinginsight/services/parsers/MimeTypeParser.java +++ b/src/main/java/org/breedinginsight/services/parsers/MimeTypeParser.java @@ -22,6 +22,7 @@ import org.apache.tika.detect.Detector; import org.apache.tika.io.TikaInputStream; import org.apache.tika.metadata.Metadata; +import org.apache.tika.metadata.TikaCoreProperties; import org.apache.tika.mime.MediaType; import javax.inject.Singleton; @@ -39,7 +40,7 @@ public MimeTypeParser() { public MediaType getMimeType(CompletedFileUpload file) throws IOException { Metadata metadata = new Metadata(); - metadata.add(Metadata.RESOURCE_NAME_KEY, file.getFilename()); + metadata.add(TikaCoreProperties.RESOURCE_NAME_KEY, file.getFilename()); TikaInputStream tikaStream = TikaInputStream.get(file.getInputStream()); return detector.detect(tikaStream, metadata); } From 7777a14d4a7ad24721e398e85690b3947533c6d4 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 3 Feb 2022 12:25:22 -0500 Subject: [PATCH 23/30] library upgrades: batch 4 all tests pass --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0d907e8da..800001b57 100644 --- a/pom.xml +++ b/pom.xml @@ -84,8 +84,7 @@ 2.2.1 1.6.2 4.3.1 - - 0.38.2 + 0.42.0 1.4.1 1.10.3 From aa4541871575025a70b32f344073afc08c86bd0c Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 3 Feb 2022 13:28:38 -0500 Subject: [PATCH 24/30] library upgrades: batch 5 all tests pass --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 800001b57..033651768 100644 --- a/pom.xml +++ b/pom.xml @@ -69,11 +69,11 @@ 1.18.22 2.8.9 1.14 + 1.9.0 - 1.8 4.1.2 4.1.2 - 3.10 + 3.12.0 1.16.3 7.7.3 31.0.1-jre From f3d9cfd1b95b749723d3cca73965f91cff53f49e Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 3 Feb 2022 13:50:52 -0500 Subject: [PATCH 25/30] library upgrades: reorder package versions for clarity --- pom.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 033651768..d86b89a1c 100644 --- a/pom.xml +++ b/pom.xml @@ -70,11 +70,9 @@ 2.8.9 1.14 1.9.0 - - 4.1.2 - 4.1.2 3.12.0 1.16.3 + 7.7.3 31.0.1-jre 4.9.3 @@ -82,6 +80,9 @@ 2.0.2 2.11.0 2.2.1 + + 4.1.2 + 4.1.2 1.6.2 4.3.1 0.42.0 From 7c322352503a89df83b2d7775328e04a0137e8cf Mon Sep 17 00:00:00 2001 From: Chris T Date: Mon, 7 Feb 2022 14:59:49 -0500 Subject: [PATCH 26/30] micronaut upgrade: remove working files --- migration-todos.txt | 9 --- .../auth/ApiAccessRefreshTokenGenerator.java | 34 --------- temp-storage/services/TokenService.java | 61 --------------- .../v1/controller/TokenController.java | 74 ------------------- 4 files changed, 178 deletions(-) delete mode 100644 migration-todos.txt delete mode 100644 temp-storage/api/auth/ApiAccessRefreshTokenGenerator.java delete mode 100644 temp-storage/services/TokenService.java delete mode 100644 temp-storage/v1/controller/TokenController.java diff --git a/migration-todos.txt b/migration-todos.txt deleted file mode 100644 index 7e4019303..000000000 --- a/migration-todos.txt +++ /dev/null @@ -1,9 +0,0 @@ -Fixes: - -Testing: -1. Test new account creation -2. Logged out redirect -3. Sign in errors -4. Pages and tables -5. End point not found -6. Launching an app from scratch \ No newline at end of file diff --git a/temp-storage/api/auth/ApiAccessRefreshTokenGenerator.java b/temp-storage/api/auth/ApiAccessRefreshTokenGenerator.java deleted file mode 100644 index 98a848f39..000000000 --- a/temp-storage/api/auth/ApiAccessRefreshTokenGenerator.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.breedinginsight.api.auth; - -import io.micronaut.context.event.ApplicationEventPublisher; -import io.micronaut.security.token.generator.TokenGenerator; -import io.micronaut.security.token.jwt.generator.AccessRefreshTokenGenerator; -import io.micronaut.security.token.jwt.generator.JwtGeneratorConfiguration; -import io.micronaut.security.token.jwt.generator.claims.ClaimsGenerator; -import io.micronaut.security.token.jwt.render.TokenRenderer; - -import javax.inject.Named; - -public class ApiAccessRefreshTokenGenerator extends AccessRefreshTokenGenerator { - - public ApiAccessRefreshTokenGenerator(@Named("apiTokenConfig") JwtGeneratorConfiguration jwtGeneratorConfiguration, TokenRenderer tokenRenderer, TokenGenerator tokenGenerator, ClaimsGenerator claimsGenerator, ApplicationEventPublisher eventPublisher) { - super(jwtGeneratorConfiguration, tokenRenderer, tokenGenerator, claimsGenerator, eventPublisher); - } - -} diff --git a/temp-storage/services/TokenService.java b/temp-storage/services/TokenService.java deleted file mode 100644 index 95060ecdc..000000000 --- a/temp-storage/services/TokenService.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.breedinginsight.services; - -import io.micronaut.security.token.jwt.render.AccessRefreshToken; -import lombok.extern.slf4j.Slf4j; -import org.breedinginsight.api.auth.ApiAccessRefreshTokenGenerator; -import org.breedinginsight.api.auth.AuthenticatedUser; -import org.breedinginsight.model.ApiToken; -import org.breedinginsight.model.User; - -import javax.inject.Inject; -import javax.inject.Singleton; -import java.util.Optional; - -@Slf4j -@Singleton -public class TokenService { - - private ApiAccessRefreshTokenGenerator apiAccessRefreshTokenGenerator; - private UserService userService; - - @Inject - public TokenService(ApiAccessRefreshTokenGenerator apiAccessRefreshTokenGenerator, - UserService userService) { - this.apiAccessRefreshTokenGenerator = apiAccessRefreshTokenGenerator; - this.userService = userService; - } - - public Optional generateApiToken(AuthenticatedUser user) { - - Optional optionalUser = userService.getById(user.getId()); - if (!optionalUser.isPresent()){ - return Optional.empty(); - } - - Optional tokenOptional = this.apiAccessRefreshTokenGenerator.generate(user); - - if (tokenOptional.isPresent()) { - return Optional.of(ApiToken.builder().accessToken(tokenOptional.get().getAccessToken()).build()); - } - else { - return Optional.empty(); - } - } - -} diff --git a/temp-storage/v1/controller/TokenController.java b/temp-storage/v1/controller/TokenController.java deleted file mode 100644 index e1356dbfd..000000000 --- a/temp-storage/v1/controller/TokenController.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * See the NOTICE file distributed with this work for additional information - * regarding copyright ownership. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.breedinginsight.api.v1.controller; - -import io.micronaut.http.HttpResponse; -import io.micronaut.http.annotation.Controller; -import io.micronaut.http.annotation.Get; -import io.micronaut.http.annotation.QueryValue; -import io.micronaut.http.uri.UriBuilder; -import io.micronaut.security.annotation.Secured; -import io.micronaut.security.rules.SecurityRule; -import lombok.extern.slf4j.Slf4j; -import org.breedinginsight.api.auth.AuthenticatedUser; -import org.breedinginsight.api.auth.SecurityService; -import org.breedinginsight.model.ApiToken; -import org.breedinginsight.services.TokenService; - -import javax.inject.Inject; -import javax.validation.constraints.NotBlank; -import java.net.URI; -import java.util.Optional; - -@Slf4j -@Controller("/${micronaut.bi.api.version}") -public class TokenController { - - private SecurityService securityService; - private TokenService tokenService; - - @Inject - public TokenController(SecurityService securityService, TokenService tokenService) { - this.securityService = securityService; - this.tokenService = tokenService; - } - - @Get("/api-token") - @Secured(SecurityRule.IS_AUTHENTICATED) - public HttpResponse apiToken(@QueryValue @NotBlank String returnUrl) { - - AuthenticatedUser actingUser = securityService.getUser(); - Optional token = tokenService.generateApiToken(actingUser); - - if(token.isPresent()) { - ApiToken apiToken = token.get(); - - URI location = UriBuilder.of(returnUrl) - .queryParam("status", 200) - .queryParam("token", apiToken.getAccessToken()) - .build(); - - return HttpResponse.seeOther(location) - .header("Cache-Control","no-store") - .header("Pragma", "no-cache"); - } else { - return HttpResponse.serverError(); - } - - } - -} From 25b479c5ea228c92f6e8f6ab9d7fee4c0c1c3034 Mon Sep 17 00:00:00 2001 From: Chris T Date: Mon, 7 Feb 2022 15:56:42 -0500 Subject: [PATCH 27/30] micronaut upgrade: fix tests --- .../auth/AuthServiceLoginHandlerUnitTest.java | 75 +++++++++---------- 1 file changed, 36 insertions(+), 39 deletions(-) diff --git a/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java b/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java index 860bc6253..9ada0ad48 100644 --- a/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java +++ b/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java @@ -23,6 +23,7 @@ import io.micronaut.http.HttpResponse; import io.micronaut.http.cookie.Cookie; import io.micronaut.http.simple.cookies.SimpleCookies; +import io.micronaut.security.authentication.UserDetails; import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.AfterAll; @@ -30,10 +31,7 @@ import org.junit.jupiter.api.TestInstance; import javax.inject.Inject; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -51,35 +49,36 @@ public class AuthServiceLoginHandlerUnitTest extends DatabaseTest { @Property(name = "web.cookies.login-redirect") private String loginRedirectCookieName; + private String userName = "1111-2222-3333-4444"; + @AfterAll public void finish() { super.stopContainers(); } //TODO: Fix this test -/* @Test + @Test public void returnsDefaultBadUrl() { HttpRequest request = mock(HttpRequest.class, CALLS_REAL_METHODS); - Cookie returnUrlCookie = Cookie.of(loginRedirectCookieName, "localhost:8080/test"); + Cookie returnUrlCookie = Cookie.of(loginRedirectCookieName, "cats man..."); SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED); cookies.put("redirect-login", returnUrlCookie); doReturn(cookies).when(request).getCookies(); + doReturn(false).when(request).isSecure(); AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler); when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request)); - Cookie jwtToken = Cookie.of("phylo-token", "test"); - List securityCookies = List.of(jwtToken); - - HttpResponse response = authServiceSpy.loginSuccess(securityCookies); + UserDetails user = new UserDetails(userName, new ArrayList<>()); - checkAssertions(response, jwtToken, defaultUrl); + HttpResponse response = authServiceSpy.loginSuccess(user, request); - }*/ + checkAssertions(response, defaultUrl); + } //TODO: Fix this test - /* @Test + @Test public void returnsPassedUrlGoodHttpUrl() { String expectedUrl = "http://localhost:8080/test?testparam=true"; @@ -88,20 +87,20 @@ public void returnsPassedUrlGoodHttpUrl() { SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED); cookies.put("redirect-login", returnUrlCookie); doReturn(cookies).when(request).getCookies(); + doReturn(false).when(request).isSecure(); AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler); when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request)); - Cookie jwtToken = Cookie.of("phylo-token", "test"); - List securityCookies = List.of(jwtToken); + UserDetails user = new UserDetails(userName, new ArrayList<>()); - HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies); + HttpResponse response = authServiceSpy.loginSuccess(user, request); reset(request); - checkAssertions(response, jwtToken, expectedUrl); - }*/ + checkAssertions(response, expectedUrl); + } // TODO: Fix this test - /*@Test + @Test public void returnsPassedUrlGoodHttpsUrl() { String expectedUrl = "https://localhost:8080/test?testparam=blueberry"; @@ -110,43 +109,47 @@ public void returnsPassedUrlGoodHttpsUrl() { SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED); cookies.put("redirect-login", returnUrlCookie); doReturn(cookies).when(request).getCookies(); + doReturn(false).when(request).isSecure(); AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler); when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request)); - Cookie jwtToken = Cookie.of("phylo-token", "test"); - List securityCookies = List.of(jwtToken); + UserDetails user = new UserDetails(userName, new ArrayList<>()); - HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies); + HttpResponse response = authServiceSpy.loginSuccess(user, request); reset(request); - checkAssertions(response, jwtToken, expectedUrl); - }*/ + checkAssertions(response, expectedUrl); + } // TODO: Fix this test - /* @Test + @Test public void returnsDefaultUrlCookieNotExist() { HttpRequest request = mock(HttpRequest.class, CALLS_REAL_METHODS); SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED); doReturn(cookies).when(request).getCookies(); + doReturn(false).when(request).isSecure(); AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler); when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request)); - Cookie jwtToken = Cookie.of("phylo-token", "test"); - List securityCookies = List.of(jwtToken); + UserDetails user = new UserDetails(userName, new ArrayList<>()); - HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies); + HttpResponse response = authServiceSpy.loginSuccess(user, request); reset(request); - checkAssertions(response, jwtToken, defaultUrl); - }*/ + checkAssertions(response, defaultUrl); + } - public void checkAssertions(HttpResponse response, Cookie jwtToken, String expectedLocation) { + public void checkAssertions(HttpResponse response, String expectedLocation) { // Check location is as expected String redirectLocation = response.getHeaders().get("Location"); assertEquals(expectedLocation, redirectLocation); + // Check that the jwt cookie was returned + + + // Check cookies were not altered String cookieString = response.getHeaders().get("set-cookie"); String[] splitCookie = cookieString.split("="); @@ -156,15 +159,9 @@ public void checkAssertions(HttpResponse response, Cookie jwtToken, String expec responseCookies.put(splitCookie[i], splitCookie[i+1]); } } - Map requestCookie = new HashMap<>(); - requestCookie.put(jwtToken.getName(), jwtToken.getValue()); - for (String key: responseCookies.keySet()){ - assertTrue(requestCookie.containsKey(key)); - if (requestCookie.containsKey(key)){ - assertEquals(requestCookie.get(key), responseCookies.get(key),"Returned cookie does not equal passed cookie (cookie was modified)"); - } - } + String token = responseCookies.get("phylo-token"); + assertTrue(token.split("\\.").length == 3, "JWT was in wrong format"); } } From ce92f21d187a7d7154db48d0c61a00794acc9925 Mon Sep 17 00:00:00 2001 From: Chris T Date: Tue, 19 Apr 2022 11:23:35 -0400 Subject: [PATCH 28/30] micronaut upgrade: remove broken import --- .../java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java index f058d1307..6737b5aec 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java @@ -50,7 +50,6 @@ import javax.inject.Inject; import javax.validation.Valid; -import javax.ws.rs.NotFoundException; import java.io.IOException; import java.util.List; import java.util.UUID; From 477ea09357c10fe17039c5bdc18ae1edf8090ce0 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 26 May 2022 09:06:17 -0700 Subject: [PATCH 29/30] micronaut upgrade: remove unused imports --- .../api/v1/controller/brapi/BrAPIServiceFilter.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java b/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java index 90d45a5b2..710a47ea1 100644 --- a/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java +++ b/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java @@ -18,7 +18,6 @@ package org.breedinginsight.api.v1.controller.brapi; import io.micronaut.context.annotation.Property; -import io.micronaut.core.async.publisher.Publishers; import io.micronaut.core.order.Ordered; import io.micronaut.http.*; import io.micronaut.http.annotation.Filter; @@ -27,20 +26,16 @@ import io.micronaut.http.server.exceptions.InternalServerException; import io.micronaut.web.router.MethodBasedRouteMatch; import io.micronaut.web.router.RouteMatch; -import io.micronaut.web.router.RouteMatchUtils; import io.reactivex.Flowable; import io.reactivex.schedulers.Schedulers; -import io.micronaut.http.exceptions.HttpStatusException; import org.breedinginsight.services.brapi.BrAPIClientProvider; import org.breedinginsight.model.ProgramBrAPIEndpoints; import org.breedinginsight.services.ProgramService; import org.breedinginsight.services.exceptions.DoesNotExistException; -import org.intellij.lang.annotations.Flow; import org.reactivestreams.Publisher; import javax.inject.Inject; import java.util.Map; -import java.util.Optional; import java.util.UUID; @Filter("/**") From 6950a8087b4f5ec254bf41722d66cfbb76319758 Mon Sep 17 00:00:00 2001 From: Chris T Date: Thu, 26 May 2022 10:04:40 -0700 Subject: [PATCH 30/30] micronaut upgrade: clean up test comments --- .../api/auth/AuthServiceLoginHandlerUnitTest.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java b/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java index 9ada0ad48..e7b7f1eef 100644 --- a/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java +++ b/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java @@ -56,7 +56,6 @@ public void finish() { super.stopContainers(); } - //TODO: Fix this test @Test public void returnsDefaultBadUrl() { @@ -77,7 +76,6 @@ public void returnsDefaultBadUrl() { checkAssertions(response, defaultUrl); } - //TODO: Fix this test @Test public void returnsPassedUrlGoodHttpUrl() { @@ -99,7 +97,6 @@ public void returnsPassedUrlGoodHttpUrl() { checkAssertions(response, expectedUrl); } - // TODO: Fix this test @Test public void returnsPassedUrlGoodHttpsUrl() { @@ -121,7 +118,6 @@ public void returnsPassedUrlGoodHttpsUrl() { checkAssertions(response, expectedUrl); } - // TODO: Fix this test @Test public void returnsDefaultUrlCookieNotExist() { @@ -146,10 +142,6 @@ public void checkAssertions(HttpResponse response, String expectedLocation) { String redirectLocation = response.getHeaders().get("Location"); assertEquals(expectedLocation, redirectLocation); - // Check that the jwt cookie was returned - - - // Check cookies were not altered String cookieString = response.getHeaders().get("set-cookie"); String[] splitCookie = cookieString.split("="); @@ -160,6 +152,7 @@ public void checkAssertions(HttpResponse response, String expectedLocation) { } } + // Check that the jwt cookie was returned String token = responseCookies.get("phylo-token"); assertTrue(token.split("\\.").length == 3, "JWT was in wrong format"); }