From 7ea73f21cd64d6989db30a231a4a6a5959d812a9 Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Fri, 14 Apr 2023 01:56:14 -0400 Subject: [PATCH 01/17] commiting changes related to visa implementation --- .../ego/controller/VisaController.java | 103 ++++++++++++++++++ .../overture/ego/model/dto/VisaRequest.java | 24 ++++ .../bio/overture/ego/model/entity/Visa.java | 67 ++++++++++++ .../overture/ego/model/enums/JavaFields.java | 5 + .../overture/ego/model/enums/SqlFields.java | 4 + .../bio/overture/ego/model/enums/Tables.java | 2 + .../overture/ego/model/enums/VisaType.java | 47 ++++++++ .../ego/repository/VisaRepository.java | 16 +++ .../bio/overture/ego/service/VisaService.java | 91 ++++++++++++++++ 9 files changed, 359 insertions(+) create mode 100644 src/main/java/bio/overture/ego/controller/VisaController.java create mode 100644 src/main/java/bio/overture/ego/model/dto/VisaRequest.java create mode 100644 src/main/java/bio/overture/ego/model/entity/Visa.java create mode 100644 src/main/java/bio/overture/ego/model/enums/VisaType.java create mode 100644 src/main/java/bio/overture/ego/repository/VisaRepository.java create mode 100644 src/main/java/bio/overture/ego/service/VisaService.java diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java new file mode 100644 index 000000000..e6a44a51b --- /dev/null +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -0,0 +1,103 @@ +package bio.overture.ego.controller; + +import static bio.overture.ego.controller.resolver.PageableResolver.*; +import static org.springframework.web.bind.annotation.RequestMethod.*; + +import bio.overture.ego.model.dto.*; +import bio.overture.ego.model.entity.*; +import bio.overture.ego.security.AdminScoped; +import bio.overture.ego.service.*; +import bio.overture.ego.view.Views; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.annotations.*; +import java.util.UUID; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +@Slf4j +@RestController +@RequestMapping("/visa") +@Api(tags = "Visa") +public class VisaController { + + /** Dependencies */ + private final VisaService visaService; + + private final UserPermissionService userPermissionService; + private final GroupPermissionService groupPermissionService; + private final ApplicationPermissionService applicationPermissionService; + + @Autowired + public VisaController( + @NonNull VisaService visaService, + @NonNull UserPermissionService userPermissionService, + @NonNull GroupPermissionService groupPermissionService, + @NonNull ApplicationPermissionService applicationPermissionService) { + this.visaService = visaService; + this.groupPermissionService = groupPermissionService; + this.userPermissionService = userPermissionService; + this.applicationPermissionService = applicationPermissionService; + } + + @AdminScoped + @RequestMapping(method = GET, value = "/{id}") + @ApiResponses( + value = {@ApiResponse(code = 200, message = "Get Visa by id", response = Visa.class)}) + @JsonView(Views.REST.class) + public @ResponseBody Visa getVisa( + @ApiIgnore @RequestHeader(value = "Authorization", required = true) + final String authorization, + @PathVariable(value = "id", required = true) UUID id) { + return visaService.getById(id); + } + + @AdminScoped + @RequestMapping(method = GET, value = "") + @ApiResponses(value = {@ApiResponse(code = 200, message = "All Visas")}) + @JsonView(Views.REST.class) + public @ResponseBody PageDTO listVisa( + @ApiIgnore @RequestHeader(value = "Authorization", required = true) + final String authorization, + @ApiIgnore Pageable pageable) { + return new PageDTO<>(visaService.listVisa(pageable)); + } + + @AdminScoped + @RequestMapping(method = POST, value = "") + @ApiResponses( + value = { + @ApiResponse(code = 200, message = "New Visa", response = Visa.class), + }) + public @ResponseBody Visa createVisa( + @ApiIgnore @RequestHeader(value = "Authorization", required = true) + final String authorization, + @RequestBody(required = true) VisaRequest visaRequest) { + return visaService.create(visaRequest); + } + + @AdminScoped + @RequestMapping(method = PUT, value = "/{id}") + @ApiResponses(value = {@ApiResponse(code = 200, message = "Update Visa", response = Visa.class)}) + public @ResponseBody Visa updateVisa( + @ApiIgnore @RequestHeader(value = "Authorization", required = true) + final String authorization, + @PathVariable(value = "id") UUID id, + @RequestBody(required = true) VisaRequest visaRequest) { + return visaService.partialUpdate(id, visaRequest); + } + + @AdminScoped + @RequestMapping(method = DELETE, value = "/{id}") + @ResponseStatus(value = HttpStatus.OK) + public void deleteVisa( + @ApiIgnore @RequestHeader(value = "Authorization", required = true) + final String authorization, + @PathVariable(value = "id", required = true) UUID id) { + visaService.delete(id); + } +} diff --git a/src/main/java/bio/overture/ego/model/dto/VisaRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaRequest.java new file mode 100644 index 000000000..dcf7a0d01 --- /dev/null +++ b/src/main/java/bio/overture/ego/model/dto/VisaRequest.java @@ -0,0 +1,24 @@ +package bio.overture.ego.model.dto; + +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class VisaRequest { + + @NotNull private String id; + + @NotNull private String type; + + @NotNull private String source; + + @NotNull private String value; + + @NotNull private String by; +} diff --git a/src/main/java/bio/overture/ego/model/entity/Visa.java b/src/main/java/bio/overture/ego/model/entity/Visa.java new file mode 100644 index 000000000..295c7bdc6 --- /dev/null +++ b/src/main/java/bio/overture/ego/model/entity/Visa.java @@ -0,0 +1,67 @@ +package bio.overture.ego.model.entity; + +import bio.overture.ego.model.enums.JavaFields; +import bio.overture.ego.model.enums.SqlFields; +import bio.overture.ego.model.enums.Tables; +import bio.overture.ego.view.Views; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonView; +import java.util.UUID; +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import lombok.*; +import lombok.experimental.FieldNameConstants; +import org.hibernate.annotations.GenericGenerator; + +@Entity +@Table(name = Tables.GA4GHVISA) +@JsonInclude() +@JsonPropertyOrder({ + JavaFields.ID, + JavaFields.TYPE, + JavaFields.SOURCE, + JavaFields.VALUE, + JavaFields.BY +}) +@JsonView(Views.REST.class) +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@FieldNameConstants +@EqualsAndHashCode(of = {"id"}) +@NamedEntityGraph( + name = "policy-entity-with-relationships", + attributeNodes = { + @NamedAttributeNode(value = JavaFields.USERPERMISSIONS), + @NamedAttributeNode(value = JavaFields.GROUPPERMISSIONS), + }) +public class Visa implements Identifiable { + + @Id + @Column(name = SqlFields.ID, updatable = false, nullable = false) + @GenericGenerator(name = "visa_uuid", strategy = "org.hibernate.id.UUIDGenerator") + @GeneratedValue(generator = "visa_uuid") + private UUID id; + + @NotNull + @Column(name = SqlFields.TYPE, nullable = false) + @JsonView({Views.JWTAccessToken.class, Views.REST.class}) + private String type; + + @NotNull + @JsonView({Views.JWTAccessToken.class, Views.REST.class}) + @Column(name = SqlFields.SOURCE) + private String source; + + @NotNull + @JsonView({Views.JWTAccessToken.class, Views.REST.class}) + @Column(name = SqlFields.VALUE) + private String value; + + @NotNull + @JsonView({Views.JWTAccessToken.class, Views.REST.class}) + @Column(name = SqlFields.BY) + private String by; +} diff --git a/src/main/java/bio/overture/ego/model/enums/JavaFields.java b/src/main/java/bio/overture/ego/model/enums/JavaFields.java index 7ec650a4e..38f9df6c1 100644 --- a/src/main/java/bio/overture/ego/model/enums/JavaFields.java +++ b/src/main/java/bio/overture/ego/model/enums/JavaFields.java @@ -66,4 +66,9 @@ public class JavaFields { public static final String PROVIDERTYPE = "providerType"; public static final String PROVIDER_SUBJECT_ID = "providerSubjectId"; public static final String ERROR_REDIRECT_URI = "errorRedirectUri"; + // Visas Added + public static final String SOURCE = "source"; + public static final String VALUE = "value"; + + public static final String BY = "by"; } diff --git a/src/main/java/bio/overture/ego/model/enums/SqlFields.java b/src/main/java/bio/overture/ego/model/enums/SqlFields.java index 5fde6918d..afc7d0845 100644 --- a/src/main/java/bio/overture/ego/model/enums/SqlFields.java +++ b/src/main/java/bio/overture/ego/model/enums/SqlFields.java @@ -38,4 +38,8 @@ public class SqlFields { public static final String PROVIDERSUBJECTID = "providersubjectid"; public static final String INITIALIZED = "initialized"; public static final String ERRORREDIRECTURI = "errorredirecturi"; + public static final String SOURCE = "source"; + public static final String VALUE = "value"; + + public static final String BY = "by"; } diff --git a/src/main/java/bio/overture/ego/model/enums/Tables.java b/src/main/java/bio/overture/ego/model/enums/Tables.java index 9eab02c90..50ec199aa 100644 --- a/src/main/java/bio/overture/ego/model/enums/Tables.java +++ b/src/main/java/bio/overture/ego/model/enums/Tables.java @@ -22,4 +22,6 @@ public class Tables { public static final String APPLICATION_PERMISSION = "applicationpermission"; public static final String DEFAULTPROVIDERTRIPWIRE = "defaultprovidertripwire"; public static final String INITTRIPWIRE = "inittripwire"; + + public static final String GA4GHVISA = "ga4ghvisa"; } diff --git a/src/main/java/bio/overture/ego/model/enums/VisaType.java b/src/main/java/bio/overture/ego/model/enums/VisaType.java new file mode 100644 index 000000000..0eb87dab1 --- /dev/null +++ b/src/main/java/bio/overture/ego/model/enums/VisaType.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2017. The Ontario Institute for Cancer Research. All rights reserved. + * + * 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 bio.overture.ego.model.enums; + +import static bio.overture.ego.utils.Joiners.COMMA; +import static bio.overture.ego.utils.Streams.stream; +import static java.lang.String.format; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum VisaType { + STANDARD_VISA_TYPE, + CUSTOM_VISA_TYPE; + + public static VisaType resolveStatusType(@NonNull String statusType) { + return stream(values()) + .filter(x -> x.toString().equals(statusType)) + .findFirst() + .orElseThrow( + () -> + new IllegalArgumentException( + format( + "The status type '%s' cannot be resolved. Must be one of: [%s]", + statusType, COMMA.join(values())))); + } + + @Override + public String toString() { + return this.name(); + } +} diff --git a/src/main/java/bio/overture/ego/repository/VisaRepository.java b/src/main/java/bio/overture/ego/repository/VisaRepository.java new file mode 100644 index 000000000..50d1ec130 --- /dev/null +++ b/src/main/java/bio/overture/ego/repository/VisaRepository.java @@ -0,0 +1,16 @@ +package bio.overture.ego.repository; + +import bio.overture.ego.model.entity.Visa; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface VisaRepository extends NamedRepository { + @Override + @Deprecated + default Optional findByName(String name) { + return null; + } + + List findAll(); +} diff --git a/src/main/java/bio/overture/ego/service/VisaService.java b/src/main/java/bio/overture/ego/service/VisaService.java new file mode 100644 index 000000000..c8ac9968d --- /dev/null +++ b/src/main/java/bio/overture/ego/service/VisaService.java @@ -0,0 +1,91 @@ +package bio.overture.ego.service; + +import static bio.overture.ego.model.exceptions.NotFoundException.checkNotFound; +import static bio.overture.ego.model.exceptions.RequestValidationException.checkRequestValid; +import static org.mapstruct.factory.Mappers.getMapper; + +import bio.overture.ego.event.token.ApiKeyEventsPublisher; +import bio.overture.ego.model.dto.PolicyRequest; +import bio.overture.ego.model.dto.VisaRequest; +import bio.overture.ego.model.entity.Policy; +import bio.overture.ego.model.entity.Visa; +import bio.overture.ego.repository.VisaRepository; +import java.util.Optional; +import java.util.UUID; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; +import org.mapstruct.NullValueCheckStrategy; +import org.mapstruct.ReportingPolicy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Service +@Transactional +public class VisaService extends AbstractNamedService { + + /** Constants */ + private static final VisaService.VisaConverter VISA_CONVERTER = getMapper(VisaService.VisaConverter.class); + + /** Dependencies */ + @Autowired + + private VisaRepository visaRepository; + + private final ApiKeyEventsPublisher apiKeyEventsPublisher; + + @Autowired + public VisaService( + @NonNull VisaRepository visaRepository, + @NonNull ApiKeyEventsPublisher apiKeyEventsPublisher) { + super(Visa.class, visaRepository); + this.visaRepository = visaRepository; + this.apiKeyEventsPublisher = apiKeyEventsPublisher; + } + + public Visa create(@NonNull VisaRequest createRequest) { + checkRequestValid(createRequest); + val visa = VISA_CONVERTER.convertToVisa(createRequest); + return getRepository().save(visa); + } + + @Override + public Visa getById(@NonNull UUID uuid) { + val result = (Optional) getRepository().findById(uuid); + checkNotFound(result.isPresent(), "The visaId '%s' does not exist", uuid); + return result.get(); + } + + public void delete(@NonNull UUID id) { + checkExistence(id); + super.delete(id); + } + + @Override + public Visa getWithRelationships(UUID uuid) { + return null; + } + + public Page listVisa(@NonNull Pageable pageable) { + return visaRepository.findAll(pageable); + } + + public Visa partialUpdate(@NonNull UUID id, @NonNull VisaRequest updateRequest) { + val visa = getById(id); + VISA_CONVERTER.updateVisa(updateRequest, visa); + return getRepository().save(visa); + } + @Mapper( + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, + unmappedTargetPolicy = ReportingPolicy.WARN) + public abstract static class VisaConverter { + public abstract Visa convertToVisa(VisaRequest request); + public abstract void updateVisa(VisaRequest request, @MappingTarget Visa visaToUpdate); + + }} From 8da9be8be8729850fc315da0d2e589fa3b2b4cf4 Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Fri, 14 Apr 2023 12:18:22 -0400 Subject: [PATCH 02/17] commiting changes related to visa implementation --- .../ego/controller/VisaController.java | 5 ++-- .../overture/ego/model/dto/VisaRequest.java | 3 ++- .../ego/model/dto/VisaUpdateRequest.java | 25 ++++++++++++++++++ .../bio/overture/ego/model/entity/Visa.java | 6 ----- .../bio/overture/ego/service/VisaService.java | 26 +++++++++---------- .../resources/flyway/sql/V1_22__add_visa.sql | 8 ++++++ 6 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java create mode 100644 src/main/resources/flyway/sql/V1_22__add_visa.sql diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java index e6a44a51b..f0b56c4a0 100644 --- a/src/main/java/bio/overture/ego/controller/VisaController.java +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -86,9 +86,8 @@ public VisaController( public @ResponseBody Visa updateVisa( @ApiIgnore @RequestHeader(value = "Authorization", required = true) final String authorization, - @PathVariable(value = "id") UUID id, - @RequestBody(required = true) VisaRequest visaRequest) { - return visaService.partialUpdate(id, visaRequest); + @RequestBody(required = true) VisaUpdateRequest visaRequest) { + return visaService.partialUpdate(visaRequest); } @AdminScoped diff --git a/src/main/java/bio/overture/ego/model/dto/VisaRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaRequest.java index dcf7a0d01..2a60d7a60 100644 --- a/src/main/java/bio/overture/ego/model/dto/VisaRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/VisaRequest.java @@ -1,5 +1,6 @@ package bio.overture.ego.model.dto; +import java.util.UUID; import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -12,7 +13,7 @@ @NoArgsConstructor public class VisaRequest { - @NotNull private String id; + private UUID id; @NotNull private String type; diff --git a/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java new file mode 100644 index 000000000..d7008a759 --- /dev/null +++ b/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java @@ -0,0 +1,25 @@ +package bio.overture.ego.model.dto; + +import java.util.UUID; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class VisaUpdateRequest { + + @NotNull private UUID id; + + @NotNull private String type; + + @NotNull private String source; + + @NotNull private String value; + + @NotNull private String by; +} diff --git a/src/main/java/bio/overture/ego/model/entity/Visa.java b/src/main/java/bio/overture/ego/model/entity/Visa.java index 295c7bdc6..b4204f4c8 100644 --- a/src/main/java/bio/overture/ego/model/entity/Visa.java +++ b/src/main/java/bio/overture/ego/model/entity/Visa.java @@ -31,12 +31,6 @@ @AllArgsConstructor @FieldNameConstants @EqualsAndHashCode(of = {"id"}) -@NamedEntityGraph( - name = "policy-entity-with-relationships", - attributeNodes = { - @NamedAttributeNode(value = JavaFields.USERPERMISSIONS), - @NamedAttributeNode(value = JavaFields.GROUPPERMISSIONS), - }) public class Visa implements Identifiable { @Id diff --git a/src/main/java/bio/overture/ego/service/VisaService.java b/src/main/java/bio/overture/ego/service/VisaService.java index c8ac9968d..7adc66f08 100644 --- a/src/main/java/bio/overture/ego/service/VisaService.java +++ b/src/main/java/bio/overture/ego/service/VisaService.java @@ -5,9 +5,8 @@ import static org.mapstruct.factory.Mappers.getMapper; import bio.overture.ego.event.token.ApiKeyEventsPublisher; -import bio.overture.ego.model.dto.PolicyRequest; import bio.overture.ego.model.dto.VisaRequest; -import bio.overture.ego.model.entity.Policy; +import bio.overture.ego.model.dto.VisaUpdateRequest; import bio.overture.ego.model.entity.Visa; import bio.overture.ego.repository.VisaRepository; import java.util.Optional; @@ -31,12 +30,11 @@ public class VisaService extends AbstractNamedService { /** Constants */ - private static final VisaService.VisaConverter VISA_CONVERTER = getMapper(VisaService.VisaConverter.class); + private static final VisaService.VisaConverter VISA_CONVERTER = + getMapper(VisaService.VisaConverter.class); /** Dependencies */ - @Autowired - - private VisaRepository visaRepository; + @Autowired private VisaRepository visaRepository; private final ApiKeyEventsPublisher apiKeyEventsPublisher; @@ -76,16 +74,18 @@ public Page listVisa(@NonNull Pageable pageable) { return visaRepository.findAll(pageable); } - public Visa partialUpdate(@NonNull UUID id, @NonNull VisaRequest updateRequest) { - val visa = getById(id); + public Visa partialUpdate(@NonNull VisaUpdateRequest updateRequest) { + val visa = getById(updateRequest.getId()); VISA_CONVERTER.updateVisa(updateRequest, visa); return getRepository().save(visa); } + @Mapper( - nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, - unmappedTargetPolicy = ReportingPolicy.WARN) + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, + unmappedTargetPolicy = ReportingPolicy.WARN) public abstract static class VisaConverter { - public abstract Visa convertToVisa(VisaRequest request); - public abstract void updateVisa(VisaRequest request, @MappingTarget Visa visaToUpdate); + public abstract Visa convertToVisa(VisaRequest request); - }} + public abstract void updateVisa(VisaUpdateRequest request, @MappingTarget Visa visaToUpdate); + } +} diff --git a/src/main/resources/flyway/sql/V1_22__add_visa.sql b/src/main/resources/flyway/sql/V1_22__add_visa.sql new file mode 100644 index 000000000..bf99727bf --- /dev/null +++ b/src/main/resources/flyway/sql/V1_22__add_visa.sql @@ -0,0 +1,8 @@ +CREATE TABLE GA4GHVISA ( + id UUID PRIMARY KEY, + type varchar(255) NOT NULL, + source varchar(255) NOT NULL, + value varchar(255) NOT NULL, + by varchar(255) NOT NULL +); + From c02cb4dfaef0677ebad64e805aee9e42345081ef Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Wed, 19 Apr 2023 10:55:12 -0400 Subject: [PATCH 03/17] committing changes related to Visa permissions schema --- .../ego/controller/VisaController.java | 5 ++ .../bio/overture/ego/model/entity/Visa.java | 9 +++ .../ego/model/entity/VisaPermission.java | 62 +++++++++++++++++++ .../overture/ego/model/enums/JavaFields.java | 2 + .../overture/ego/model/enums/SqlFields.java | 6 ++ .../bio/overture/ego/model/enums/Tables.java | 2 + .../ego/service/VisaPermissionService.java | 16 +++++ .../bio/overture/ego/service/VisaService.java | 10 +-- .../flyway/sql/V1_23__add_visa_pcl.sql | 8 +++ 9 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 src/main/java/bio/overture/ego/model/entity/VisaPermission.java create mode 100644 src/main/java/bio/overture/ego/service/VisaPermissionService.java create mode 100644 src/main/resources/flyway/sql/V1_23__add_visa_pcl.sql diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java index f0b56c4a0..396a967be 100644 --- a/src/main/java/bio/overture/ego/controller/VisaController.java +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -44,6 +44,11 @@ public VisaController( this.applicationPermissionService = applicationPermissionService; } + /* + * This method is used to fetch visa using id + * @param id UUID + * @return visa Visa + */ @AdminScoped @RequestMapping(method = GET, value = "/{id}") @ApiResponses( diff --git a/src/main/java/bio/overture/ego/model/entity/Visa.java b/src/main/java/bio/overture/ego/model/entity/Visa.java index b4204f4c8..403b16849 100644 --- a/src/main/java/bio/overture/ego/model/entity/Visa.java +++ b/src/main/java/bio/overture/ego/model/entity/Visa.java @@ -1,12 +1,16 @@ package bio.overture.ego.model.entity; +import static com.google.common.collect.Sets.newHashSet; + import bio.overture.ego.model.enums.JavaFields; import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; import bio.overture.ego.view.Views; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonView; +import java.util.Set; import java.util.UUID; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -58,4 +62,9 @@ public class Visa implements Identifiable { @JsonView({Views.JWTAccessToken.class, Views.REST.class}) @Column(name = SqlFields.BY) private String by; + + @JsonIgnore + @ManyToMany(mappedBy = "visaId", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + @Builder.Default + private Set visaPermissions = newHashSet(); } diff --git a/src/main/java/bio/overture/ego/model/entity/VisaPermission.java b/src/main/java/bio/overture/ego/model/entity/VisaPermission.java new file mode 100644 index 000000000..e441e5962 --- /dev/null +++ b/src/main/java/bio/overture/ego/model/entity/VisaPermission.java @@ -0,0 +1,62 @@ +package bio.overture.ego.model.entity; + +import static bio.overture.ego.model.enums.AccessLevel.EGO_ACCESS_LEVEL_ENUM; + +import bio.overture.ego.model.enums.AccessLevel; +import bio.overture.ego.model.enums.SqlFields; +import bio.overture.ego.model.enums.Tables; +import bio.overture.ego.view.Views; +import com.fasterxml.jackson.annotation.JsonView; +import java.util.Collection; +import java.util.UUID; +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import lombok.*; +import lombok.experimental.FieldNameConstants; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Type; + +@Entity +@Table(name = Tables.ACLVISAPERMISSION) +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonView(Views.REST.class) +@ToString(callSuper = true) +@FieldNameConstants +public class VisaPermission extends AbstractPermission { + + @Id + @Column(name = SqlFields.ID, updatable = false, nullable = false) + @GenericGenerator(name = "aclp_uuid", strategy = "org.hibernate.id.UUIDGenerator") + @GeneratedValue(generator = "aclp_uuid") + private UUID id; + + @JoinColumn(name = SqlFields.ID, nullable = false) + private UUID entity; + + @JoinColumn(name = SqlFields.ID, nullable = false) + private UUID visaId; + + @NotNull + @Column(name = SqlFields.MASK, nullable = false) + @Enumerated(EnumType.STRING) + @Type(type = EGO_ACCESS_LEVEL_ENUM) + private AccessLevel mask; + + @ManyToMany + @JoinTable( + name = "ga4ghvisa", + joinColumns = @JoinColumn(name = "aclp_id", referencedColumnName = "visaId"), + inverseJoinColumns = @JoinColumn(name = "visa_id", referencedColumnName = "id")) + private Collection visas; + + @Override + public Visa getOwner() { + return null; + } + + @Override + public void setOwner(Visa owner) {} +} diff --git a/src/main/java/bio/overture/ego/model/enums/JavaFields.java b/src/main/java/bio/overture/ego/model/enums/JavaFields.java index 38f9df6c1..aecbeaf19 100644 --- a/src/main/java/bio/overture/ego/model/enums/JavaFields.java +++ b/src/main/java/bio/overture/ego/model/enums/JavaFields.java @@ -71,4 +71,6 @@ public class JavaFields { public static final String VALUE = "value"; public static final String BY = "by"; + + public static final String VISAPERMISSION = "ACLVISAPERMISSION"; } diff --git a/src/main/java/bio/overture/ego/model/enums/SqlFields.java b/src/main/java/bio/overture/ego/model/enums/SqlFields.java index afc7d0845..488b3c8ca 100644 --- a/src/main/java/bio/overture/ego/model/enums/SqlFields.java +++ b/src/main/java/bio/overture/ego/model/enums/SqlFields.java @@ -42,4 +42,10 @@ public class SqlFields { public static final String VALUE = "value"; public static final String BY = "by"; + + public static final String ENTITY = "entity"; + + public static final String VISAID = "visaId"; + + public static final String MASK = "mask"; } diff --git a/src/main/java/bio/overture/ego/model/enums/Tables.java b/src/main/java/bio/overture/ego/model/enums/Tables.java index 50ec199aa..861fe7978 100644 --- a/src/main/java/bio/overture/ego/model/enums/Tables.java +++ b/src/main/java/bio/overture/ego/model/enums/Tables.java @@ -24,4 +24,6 @@ public class Tables { public static final String INITTRIPWIRE = "inittripwire"; public static final String GA4GHVISA = "ga4ghvisa"; + + public static final String ACLVISAPERMISSION = "ACLVISAPERMISSION"; } diff --git a/src/main/java/bio/overture/ego/service/VisaPermissionService.java b/src/main/java/bio/overture/ego/service/VisaPermissionService.java new file mode 100644 index 000000000..65440038d --- /dev/null +++ b/src/main/java/bio/overture/ego/service/VisaPermissionService.java @@ -0,0 +1,16 @@ +package bio.overture.ego.service; + +import bio.overture.ego.model.entity.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Service +@Transactional +public class VisaPermissionService { + + /** Dependencies */ + @Autowired private VisaService visaService; +} diff --git a/src/main/java/bio/overture/ego/service/VisaService.java b/src/main/java/bio/overture/ego/service/VisaService.java index 7adc66f08..c919b7db0 100644 --- a/src/main/java/bio/overture/ego/service/VisaService.java +++ b/src/main/java/bio/overture/ego/service/VisaService.java @@ -65,11 +65,6 @@ public void delete(@NonNull UUID id) { super.delete(id); } - @Override - public Visa getWithRelationships(UUID uuid) { - return null; - } - public Page listVisa(@NonNull Pageable pageable) { return visaRepository.findAll(pageable); } @@ -88,4 +83,9 @@ public abstract static class VisaConverter { public abstract void updateVisa(VisaUpdateRequest request, @MappingTarget Visa visaToUpdate); } + + @Override + public Visa getWithRelationships(UUID uuid) { + return null; + } } diff --git a/src/main/resources/flyway/sql/V1_23__add_visa_pcl.sql b/src/main/resources/flyway/sql/V1_23__add_visa_pcl.sql new file mode 100644 index 000000000..35557eef4 --- /dev/null +++ b/src/main/resources/flyway/sql/V1_23__add_visa_pcl.sql @@ -0,0 +1,8 @@ +CREATE TABLE ACLVISAPERMISSION ( + id UUID PRIMARY KEY, + entity UUID, + visaId UUID, + mask ACLMASK NOT NULL, + FOREIGN KEY (entity) REFERENCES POLICY(id), + FOREIGN KEY (visaId) REFERENCES GA4GHVISA(id) +); From 806ea718a5778e11471e137370f5dd9507516fab Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Fri, 21 Apr 2023 00:25:06 -0400 Subject: [PATCH 04/17] Committing changes related to visa permission api changes --- .../ego/controller/VisaController.java | 26 ++++++++++- .../ego/model/dto/VisaUpdateRequest.java | 3 -- .../repository/VisaPermissionRepository.java | 18 ++++++++ .../ego/service/VisaPermissionService.java | 46 ++++++++++++++++++- .../bio/overture/ego/service/VisaService.java | 5 +- 5 files changed, 90 insertions(+), 8 deletions(-) create mode 100644 src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java index 396a967be..771004ff6 100644 --- a/src/main/java/bio/overture/ego/controller/VisaController.java +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -10,7 +10,9 @@ import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; import io.swagger.annotations.*; +import java.util.List; import java.util.UUID; +import javax.validation.constraints.NotNull; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -28,6 +30,8 @@ public class VisaController { /** Dependencies */ private final VisaService visaService; + private final VisaPermissionService visaPermissionService; + private final UserPermissionService userPermissionService; private final GroupPermissionService groupPermissionService; private final ApplicationPermissionService applicationPermissionService; @@ -35,10 +39,12 @@ public class VisaController { @Autowired public VisaController( @NonNull VisaService visaService, + @NotNull VisaPermissionService visaPermissionService, @NonNull UserPermissionService userPermissionService, @NonNull GroupPermissionService groupPermissionService, @NonNull ApplicationPermissionService applicationPermissionService) { this.visaService = visaService; + this.visaPermissionService = visaPermissionService; this.groupPermissionService = groupPermissionService; this.userPermissionService = userPermissionService; this.applicationPermissionService = applicationPermissionService; @@ -91,8 +97,9 @@ public VisaController( public @ResponseBody Visa updateVisa( @ApiIgnore @RequestHeader(value = "Authorization", required = true) final String authorization, + @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) VisaUpdateRequest visaRequest) { - return visaService.partialUpdate(visaRequest); + return visaService.partialUpdate(id, visaRequest); } @AdminScoped @@ -104,4 +111,21 @@ public void deleteVisa( @PathVariable(value = "id", required = true) UUID id) { visaService.delete(id); } + + /* + * This method is used to fetch visa permissions using visa id + * @param visaId UUID + * @return visaPermissions List + */ + @AdminScoped + @RequestMapping(method = GET, value = "/permissions/{id}") + @ApiResponses(value = {@ApiResponse(code = 200, message = "Get VisaPermissions by visaId")}) + @JsonView(Views.REST.class) + public @ResponseBody List getPermissionsByVisaId( + @ApiIgnore @RequestHeader(value = "Authorization", required = true) + final String authorization, + @PathVariable(value = "id", required = true) UUID id) { + System.out.println(id); + return visaPermissionService.getPermissionsByVisaId(id); + } } diff --git a/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java index d7008a759..ecf7d08f2 100644 --- a/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java @@ -1,6 +1,5 @@ package bio.overture.ego.model.dto; -import java.util.UUID; import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -13,8 +12,6 @@ @NoArgsConstructor public class VisaUpdateRequest { - @NotNull private UUID id; - @NotNull private String type; @NotNull private String source; diff --git a/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java b/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java new file mode 100644 index 000000000..9236fa7b2 --- /dev/null +++ b/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java @@ -0,0 +1,18 @@ +package bio.overture.ego.repository; + +import bio.overture.ego.model.entity.VisaPermission; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface VisaPermissionRepository extends NamedRepository { + @Override + @Deprecated + default Optional findByName(String name) { + return null; + } + + List findAll(); + + List findByVisaId(UUID visaId); +} diff --git a/src/main/java/bio/overture/ego/service/VisaPermissionService.java b/src/main/java/bio/overture/ego/service/VisaPermissionService.java index 65440038d..98d32b0b6 100644 --- a/src/main/java/bio/overture/ego/service/VisaPermissionService.java +++ b/src/main/java/bio/overture/ego/service/VisaPermissionService.java @@ -1,7 +1,16 @@ package bio.overture.ego.service; -import bio.overture.ego.model.entity.*; +import static java.lang.String.format; + +import bio.overture.ego.event.token.ApiKeyEventsPublisher; +import bio.overture.ego.model.entity.VisaPermission; +import bio.overture.ego.model.exceptions.NotFoundException; +import bio.overture.ego.repository.VisaPermissionRepository; +import java.util.List; +import java.util.UUID; +import lombok.NonNull; import lombok.extern.slf4j.Slf4j; +import lombok.val; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -9,8 +18,41 @@ @Slf4j @Service @Transactional -public class VisaPermissionService { +public class VisaPermissionService extends AbstractNamedService { /** Dependencies */ @Autowired private VisaService visaService; + + @Autowired private VisaPermissionRepository visaPermissionRepository; + private final ApiKeyEventsPublisher apiKeyEventsPublisher; + + @Autowired + public VisaPermissionService( + @NonNull VisaPermissionRepository visaPermissionRepository, + @NonNull VisaService visaService, + @NonNull ApiKeyEventsPublisher apiKeyEventsPublisher) { + super(VisaPermission.class, visaPermissionRepository); + this.visaPermissionRepository = visaPermissionRepository; + this.visaService = visaService; + this.apiKeyEventsPublisher = apiKeyEventsPublisher; + } + + public List getPermissionsByVisaId(@NonNull UUID visaId) { + val result = (List) visaPermissionRepository.findByVisaId(visaId); + System.out.println("Result :::::::::::::::::::::::" + result); + if (result.isEmpty()) { + throw new NotFoundException(format("No VisaPermissions exists with visaId '%s'", visaId)); + } + return result; + } + + @Override + public VisaPermission getById(@NonNull UUID uuid) { + return super.getById(uuid); + } + + @Override + public VisaPermission getWithRelationships(UUID uuid) { + return null; + } } diff --git a/src/main/java/bio/overture/ego/service/VisaService.java b/src/main/java/bio/overture/ego/service/VisaService.java index c919b7db0..72b4184b3 100644 --- a/src/main/java/bio/overture/ego/service/VisaService.java +++ b/src/main/java/bio/overture/ego/service/VisaService.java @@ -11,6 +11,7 @@ import bio.overture.ego.repository.VisaRepository; import java.util.Optional; import java.util.UUID; +import javax.validation.constraints.NotNull; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -69,8 +70,8 @@ public Page listVisa(@NonNull Pageable pageable) { return visaRepository.findAll(pageable); } - public Visa partialUpdate(@NonNull VisaUpdateRequest updateRequest) { - val visa = getById(updateRequest.getId()); + public Visa partialUpdate(@NotNull UUID id, @NonNull VisaUpdateRequest updateRequest) { + val visa = getById(id); VISA_CONVERTER.updateVisa(updateRequest, visa); return getRepository().save(visa); } From 409b7997d07ccec03da79f6a09e835df765229fb Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Fri, 21 Apr 2023 00:30:22 -0400 Subject: [PATCH 05/17] Committing changes related to visa update api review comment changes --- .../java/bio/overture/ego/controller/VisaController.java | 3 ++- .../java/bio/overture/ego/model/dto/VisaUpdateRequest.java | 3 --- src/main/java/bio/overture/ego/service/VisaService.java | 5 +++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java index f0b56c4a0..c1e71b29d 100644 --- a/src/main/java/bio/overture/ego/controller/VisaController.java +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -86,8 +86,9 @@ public VisaController( public @ResponseBody Visa updateVisa( @ApiIgnore @RequestHeader(value = "Authorization", required = true) final String authorization, + @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) VisaUpdateRequest visaRequest) { - return visaService.partialUpdate(visaRequest); + return visaService.partialUpdate(id, visaRequest); } @AdminScoped diff --git a/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java index d7008a759..ecf7d08f2 100644 --- a/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java @@ -1,6 +1,5 @@ package bio.overture.ego.model.dto; -import java.util.UUID; import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -13,8 +12,6 @@ @NoArgsConstructor public class VisaUpdateRequest { - @NotNull private UUID id; - @NotNull private String type; @NotNull private String source; diff --git a/src/main/java/bio/overture/ego/service/VisaService.java b/src/main/java/bio/overture/ego/service/VisaService.java index 7adc66f08..191f89b81 100644 --- a/src/main/java/bio/overture/ego/service/VisaService.java +++ b/src/main/java/bio/overture/ego/service/VisaService.java @@ -11,6 +11,7 @@ import bio.overture.ego.repository.VisaRepository; import java.util.Optional; import java.util.UUID; +import javax.validation.constraints.NotNull; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -74,8 +75,8 @@ public Page listVisa(@NonNull Pageable pageable) { return visaRepository.findAll(pageable); } - public Visa partialUpdate(@NonNull VisaUpdateRequest updateRequest) { - val visa = getById(updateRequest.getId()); + public Visa partialUpdate(@NotNull UUID id, @NonNull VisaUpdateRequest updateRequest) { + val visa = getById(id); VISA_CONVERTER.updateVisa(updateRequest, visa); return getRepository().save(visa); } From 07d4ead86ca9101721d8886da6e3092c67a85569 Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Fri, 21 Apr 2023 00:39:07 -0400 Subject: [PATCH 06/17] Committing changes related to visa update api review comment changes --- .../ego/controller/VisaController.java | 2 +- .../overture/ego/model/dto/VisaRequest.java | 3 --- .../ego/model/dto/VisaUpdateRequest.java | 22 ------------------- .../bio/overture/ego/service/VisaService.java | 5 ++--- 4 files changed, 3 insertions(+), 29 deletions(-) delete mode 100644 src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java index c1e71b29d..853400cdc 100644 --- a/src/main/java/bio/overture/ego/controller/VisaController.java +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -87,7 +87,7 @@ public VisaController( @ApiIgnore @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, - @RequestBody(required = true) VisaUpdateRequest visaRequest) { + @RequestBody(required = true) VisaRequest visaRequest) { return visaService.partialUpdate(id, visaRequest); } diff --git a/src/main/java/bio/overture/ego/model/dto/VisaRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaRequest.java index 2a60d7a60..6225d995a 100644 --- a/src/main/java/bio/overture/ego/model/dto/VisaRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/VisaRequest.java @@ -1,6 +1,5 @@ package bio.overture.ego.model.dto; -import java.util.UUID; import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -13,8 +12,6 @@ @NoArgsConstructor public class VisaRequest { - private UUID id; - @NotNull private String type; @NotNull private String source; diff --git a/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java deleted file mode 100644 index ecf7d08f2..000000000 --- a/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java +++ /dev/null @@ -1,22 +0,0 @@ -package bio.overture.ego.model.dto; - -import javax.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class VisaUpdateRequest { - - @NotNull private String type; - - @NotNull private String source; - - @NotNull private String value; - - @NotNull private String by; -} diff --git a/src/main/java/bio/overture/ego/service/VisaService.java b/src/main/java/bio/overture/ego/service/VisaService.java index 191f89b81..9f5b07a66 100644 --- a/src/main/java/bio/overture/ego/service/VisaService.java +++ b/src/main/java/bio/overture/ego/service/VisaService.java @@ -6,7 +6,6 @@ import bio.overture.ego.event.token.ApiKeyEventsPublisher; import bio.overture.ego.model.dto.VisaRequest; -import bio.overture.ego.model.dto.VisaUpdateRequest; import bio.overture.ego.model.entity.Visa; import bio.overture.ego.repository.VisaRepository; import java.util.Optional; @@ -75,7 +74,7 @@ public Page listVisa(@NonNull Pageable pageable) { return visaRepository.findAll(pageable); } - public Visa partialUpdate(@NotNull UUID id, @NonNull VisaUpdateRequest updateRequest) { + public Visa partialUpdate(@NotNull UUID id, @NonNull VisaRequest updateRequest) { val visa = getById(id); VISA_CONVERTER.updateVisa(updateRequest, visa); return getRepository().save(visa); @@ -87,6 +86,6 @@ public Visa partialUpdate(@NotNull UUID id, @NonNull VisaUpdateRequest updateReq public abstract static class VisaConverter { public abstract Visa convertToVisa(VisaRequest request); - public abstract void updateVisa(VisaUpdateRequest request, @MappingTarget Visa visaToUpdate); + public abstract void updateVisa(VisaRequest request, @MappingTarget Visa visaToUpdate); } } From 5f7a843806481fef852d7b014ba47ff81bb506cf Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Fri, 21 Apr 2023 02:12:02 -0400 Subject: [PATCH 07/17] Committing changes related to visa permissions create and update api --- .../ego/controller/VisaController.java | 37 ++++++++++++++-- .../ego/model/dto/VisaPermissionRequest.java | 18 ++++++++ .../overture/ego/model/dto/VisaRequest.java | 3 -- .../ego/model/dto/VisaUpdateRequest.java | 22 ---------- .../repository/VisaPermissionRepository.java | 4 ++ .../ego/service/VisaPermissionService.java | 44 ++++++++++++++++++- .../bio/overture/ego/service/VisaService.java | 5 +-- 7 files changed, 101 insertions(+), 32 deletions(-) create mode 100644 src/main/java/bio/overture/ego/model/dto/VisaPermissionRequest.java delete mode 100644 src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java index 771004ff6..957d92146 100644 --- a/src/main/java/bio/overture/ego/controller/VisaController.java +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -98,7 +98,7 @@ public VisaController( @ApiIgnore @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, - @RequestBody(required = true) VisaUpdateRequest visaRequest) { + @RequestBody(required = true) VisaRequest visaRequest) { return visaService.partialUpdate(id, visaRequest); } @@ -118,14 +118,45 @@ public void deleteVisa( * @return visaPermissions List */ @AdminScoped - @RequestMapping(method = GET, value = "/permissions/{id}") + @RequestMapping(method = GET, value = "/permissions/visaId/{id}") @ApiResponses(value = {@ApiResponse(code = 200, message = "Get VisaPermissions by visaId")}) @JsonView(Views.REST.class) public @ResponseBody List getPermissionsByVisaId( @ApiIgnore @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { - System.out.println(id); return visaPermissionService.getPermissionsByVisaId(id); } + + /* + * This method is used to fetch visa permissions using policy id + * @param policyId UUID + * @return visaPermissions List + */ + @AdminScoped + @RequestMapping(method = GET, value = "/permissions/policyId/{id}") + @ApiResponses(value = {@ApiResponse(code = 200, message = "Get VisaPermissions by policyId")}) + @JsonView(Views.REST.class) + public @ResponseBody List getPermissionsByPolicyId( + @ApiIgnore @RequestHeader(value = "Authorization", required = true) + final String authorization, + @PathVariable(value = "id", required = true) UUID id) { + return visaPermissionService.getPermissionsByPolicyId(id); + } + + /* + * This method is used to create/update visa permissions + * @param visaPermissionRequest VisaPermissionRequest + * @return visaPermission VisaPermission + */ + @AdminScoped + @RequestMapping(method = POST, value = "/permissions") + @ApiResponses(value = {@ApiResponse(code = 200, message = "Create or Update VisaPermission")}) + @JsonView(Views.REST.class) + public @ResponseBody VisaPermission createOrUpdatePermissions( + @ApiIgnore @RequestHeader(value = "Authorization", required = true) + final String authorization, + @RequestBody(required = true) VisaPermissionRequest visaPermissionRequest) { + return visaPermissionService.createOrUpdatePermissions(visaPermissionRequest); + } } diff --git a/src/main/java/bio/overture/ego/model/dto/VisaPermissionRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaPermissionRequest.java new file mode 100644 index 000000000..83c382236 --- /dev/null +++ b/src/main/java/bio/overture/ego/model/dto/VisaPermissionRequest.java @@ -0,0 +1,18 @@ +package bio.overture.ego.model.dto; + +import bio.overture.ego.model.enums.AccessLevel; +import java.util.UUID; +import lombok.*; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class VisaPermissionRequest { + + private UUID entity; + + private UUID visaId; + + private AccessLevel mask; +} diff --git a/src/main/java/bio/overture/ego/model/dto/VisaRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaRequest.java index 2a60d7a60..6225d995a 100644 --- a/src/main/java/bio/overture/ego/model/dto/VisaRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/VisaRequest.java @@ -1,6 +1,5 @@ package bio.overture.ego.model.dto; -import java.util.UUID; import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -13,8 +12,6 @@ @NoArgsConstructor public class VisaRequest { - private UUID id; - @NotNull private String type; @NotNull private String source; diff --git a/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java deleted file mode 100644 index ecf7d08f2..000000000 --- a/src/main/java/bio/overture/ego/model/dto/VisaUpdateRequest.java +++ /dev/null @@ -1,22 +0,0 @@ -package bio.overture.ego.model.dto; - -import javax.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class VisaUpdateRequest { - - @NotNull private String type; - - @NotNull private String source; - - @NotNull private String value; - - @NotNull private String by; -} diff --git a/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java b/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java index 9236fa7b2..504d20cbc 100644 --- a/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java +++ b/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java @@ -15,4 +15,8 @@ default Optional findByName(String name) { List findAll(); List findByVisaId(UUID visaId); + + List findByPolicyId(UUID entity); + + List findByPolicyIdAndVisaId(UUID entity, UUID visaId); } diff --git a/src/main/java/bio/overture/ego/service/VisaPermissionService.java b/src/main/java/bio/overture/ego/service/VisaPermissionService.java index 98d32b0b6..090c1d8c3 100644 --- a/src/main/java/bio/overture/ego/service/VisaPermissionService.java +++ b/src/main/java/bio/overture/ego/service/VisaPermissionService.java @@ -1,8 +1,10 @@ package bio.overture.ego.service; import static java.lang.String.format; +import static org.mapstruct.factory.Mappers.getMapper; import bio.overture.ego.event.token.ApiKeyEventsPublisher; +import bio.overture.ego.model.dto.VisaPermissionRequest; import bio.overture.ego.model.entity.VisaPermission; import bio.overture.ego.model.exceptions.NotFoundException; import bio.overture.ego.repository.VisaPermissionRepository; @@ -11,6 +13,10 @@ import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; +import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; +import org.mapstruct.NullValueCheckStrategy; +import org.mapstruct.ReportingPolicy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -26,6 +32,9 @@ public class VisaPermissionService extends AbstractNamedService getPermissionsByVisaId(@NonNull UUID visaId) { val result = (List) visaPermissionRepository.findByVisaId(visaId); - System.out.println("Result :::::::::::::::::::::::" + result); if (result.isEmpty()) { throw new NotFoundException(format("No VisaPermissions exists with visaId '%s'", visaId)); } return result; } + public List getPermissionsByPolicyId(@NonNull UUID policyId) { + val result = (List) visaPermissionRepository.findByPolicyId(policyId); + if (result.isEmpty()) { + throw new NotFoundException(format("No VisaPermissions exists with policyId '%s'", policyId)); + } + return result; + } + + public VisaPermission createOrUpdatePermissions( + @NonNull VisaPermissionRequest visaPermissionRequest) { + List visaPermissionEntities = + visaPermissionRepository.findByPolicyIdAndVisaId( + visaPermissionRequest.getEntity(), visaPermissionRequest.getVisaId()); + if (visaPermissionEntities == null && visaPermissionEntities.isEmpty()) { + return visaPermissionRepository.save( + VISA_PERMISSION_CONVERTER.createVisaPermission(visaPermissionRequest)); + } else { + VISA_PERMISSION_CONVERTER.updateVisaPermission( + visaPermissionRequest, visaPermissionEntities.get(0)); + return visaPermissionRepository.save(visaPermissionEntities.get(0)); + } + } + @Override public VisaPermission getById(@NonNull UUID uuid) { return super.getById(uuid); @@ -55,4 +86,15 @@ public VisaPermission getById(@NonNull UUID uuid) { public VisaPermission getWithRelationships(UUID uuid) { return null; } + + @Mapper( + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, + unmappedTargetPolicy = ReportingPolicy.WARN) + public abstract static class VisaPermissionConverter { + public abstract VisaPermission createVisaPermission( + VisaPermissionRequest visaPermissionRequest); + + public abstract void updateVisaPermission( + VisaPermissionRequest visaPermissionRequest, @MappingTarget VisaPermission visaPermission); + } } diff --git a/src/main/java/bio/overture/ego/service/VisaService.java b/src/main/java/bio/overture/ego/service/VisaService.java index 72b4184b3..70cf00c2d 100644 --- a/src/main/java/bio/overture/ego/service/VisaService.java +++ b/src/main/java/bio/overture/ego/service/VisaService.java @@ -6,7 +6,6 @@ import bio.overture.ego.event.token.ApiKeyEventsPublisher; import bio.overture.ego.model.dto.VisaRequest; -import bio.overture.ego.model.dto.VisaUpdateRequest; import bio.overture.ego.model.entity.Visa; import bio.overture.ego.repository.VisaRepository; import java.util.Optional; @@ -70,7 +69,7 @@ public Page listVisa(@NonNull Pageable pageable) { return visaRepository.findAll(pageable); } - public Visa partialUpdate(@NotNull UUID id, @NonNull VisaUpdateRequest updateRequest) { + public Visa partialUpdate(@NotNull UUID id, @NonNull VisaRequest updateRequest) { val visa = getById(id); VISA_CONVERTER.updateVisa(updateRequest, visa); return getRepository().save(visa); @@ -82,7 +81,7 @@ public Visa partialUpdate(@NotNull UUID id, @NonNull VisaUpdateRequest updateReq public abstract static class VisaConverter { public abstract Visa convertToVisa(VisaRequest request); - public abstract void updateVisa(VisaUpdateRequest request, @MappingTarget Visa visaToUpdate); + public abstract void updateVisa(VisaRequest request, @MappingTarget Visa visaToUpdate); } @Override From 8c17775c3df91b1546ae9aaa4815db62c4b0cabb Mon Sep 17 00:00:00 2001 From: Leonardo Rivera Date: Wed, 26 Apr 2023 06:59:02 -0400 Subject: [PATCH 08/17] throw exception on auth failure --- .../ego/model/exceptions/SSOAuthenticationFailureHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/bio/overture/ego/model/exceptions/SSOAuthenticationFailureHandler.java b/src/main/java/bio/overture/ego/model/exceptions/SSOAuthenticationFailureHandler.java index 132d46c45..d35121741 100644 --- a/src/main/java/bio/overture/ego/model/exceptions/SSOAuthenticationFailureHandler.java +++ b/src/main/java/bio/overture/ego/model/exceptions/SSOAuthenticationFailureHandler.java @@ -56,7 +56,7 @@ public void onAuthenticationFailure( } else if (rootExceptionThrowable instanceof OAuth2Exception) { errorUri = buildOAuth2ExceptionResponse(errorUri, providerType); } else { - throw new InternalServerException("Invalid response from OAuth Service"); + throw new InternalServerException("Invalid response from OAuth Service:" + exception); } response.setStatus(403); response.sendRedirect(errorUri.toString()); From c320557095db212af4982b77371f1da88976c59f Mon Sep 17 00:00:00 2001 From: Leonardo Rivera Date: Wed, 26 Apr 2023 10:41:23 -0400 Subject: [PATCH 09/17] push docker image for develop-passport --- Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile b/Jenkinsfile index 8d59c0e17..9464be5dd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -128,6 +128,7 @@ spec: when { anyOf { branch 'develop' + branch 'feature/develop-passport' branch 'main' expression { return params.PUBLISH_IMAGE } } From e10d449aa82eabedaef371e694eed9c4d4d35dbc Mon Sep 17 00:00:00 2001 From: Leonardo Rivera Date: Wed, 26 Apr 2023 11:36:33 -0400 Subject: [PATCH 10/17] change clientAuthenticationMethod --- 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 47cbd5234..d2d185265 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -54,7 +54,7 @@ spring: clientId: ego-client clientSecret: authorizationGrantType: authorization_code - clientAuthenticationMethod: post + clientAuthenticationMethod: client_secret_post redirectUri: "http://localhost:8081/oauth/code/google" scope: - openid @@ -66,7 +66,7 @@ spring: clientId: ego-client clientSecret: redirectUri: "http://localhost:8081/oauth/code/github" - clientAuthenticationMethod: post + clientAuthenticationMethod: client_secret_post authorizationGrantType: authorization_code scope: - "read:user" From 4bfa395474690cc082d75e06d9b32d980ddbacb1 Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Wed, 26 Apr 2023 13:11:19 -0400 Subject: [PATCH 11/17] Committing changes related to visaPermission CRUD endpoints implementation --- Jenkinsfile | 4 +- .../ego/controller/VisaController.java | 36 ++++++++++++++- .../ego/model/dto/VisaPermissionRequest.java | 4 +- .../bio/overture/ego/model/entity/Visa.java | 2 +- .../ego/model/entity/VisaPermission.java | 45 ++++++------------- .../overture/ego/model/enums/JavaFields.java | 3 +- .../overture/ego/model/enums/SqlFields.java | 8 +--- .../bio/overture/ego/model/enums/Tables.java | 2 - .../repository/VisaPermissionRepository.java | 12 +++-- .../ego/service/VisaPermissionService.java | 31 +++++++++---- .../flyway/sql/V1_23__add_visa_pcl.sql | 10 ++--- 11 files changed, 91 insertions(+), 66 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index e99a99238..6b8ed599b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,6 +1,4 @@ -def commit = "UNKNOWN" -def version = "UNKNOWN" -def chartversion = "3.1.0" +def chartversion = "3.1.1" pipeline { agent { diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java index 957d92146..d320d0484 100644 --- a/src/main/java/bio/overture/ego/controller/VisaController.java +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -1,6 +1,5 @@ package bio.overture.ego.controller; -import static bio.overture.ego.controller.resolver.PageableResolver.*; import static org.springframework.web.bind.annotation.RequestMethod.*; import bio.overture.ego.model.dto.*; @@ -67,6 +66,10 @@ public VisaController( return visaService.getById(id); } + /* + * This method is used to list all visas + * @return visas List + */ @AdminScoped @RequestMapping(method = GET, value = "") @ApiResponses(value = {@ApiResponse(code = 200, message = "All Visas")}) @@ -78,6 +81,11 @@ public VisaController( return new PageDTO<>(visaService.listVisa(pageable)); } + /* + * This method is used to create visa using visa create request + * @param visaRequest VisaRequest + * @return Visa visa + */ @AdminScoped @RequestMapping(method = POST, value = "") @ApiResponses( @@ -91,6 +99,12 @@ public VisaController( return visaService.create(visaRequest); } + /* + * This method is used to update visa using visa id and update request + * @param visaId UUID + * @param visaRequest VisaRequest + * @return Visa visa + */ @AdminScoped @RequestMapping(method = PUT, value = "/{id}") @ApiResponses(value = {@ApiResponse(code = 200, message = "Update Visa", response = Visa.class)}) @@ -102,6 +116,10 @@ public VisaController( return visaService.partialUpdate(id, visaRequest); } + /* + * This method is used to delete visa using visa id + * @param visaId UUID + */ @AdminScoped @RequestMapping(method = DELETE, value = "/{id}") @ResponseStatus(value = HttpStatus.OK) @@ -159,4 +177,20 @@ public void deleteVisa( @RequestBody(required = true) VisaPermissionRequest visaPermissionRequest) { return visaPermissionService.createOrUpdatePermissions(visaPermissionRequest); } + + /* + * This method is used to delete/remove visa permissions + * @param visaPermissionRequest VisaPermissionRequest + */ + @AdminScoped + @RequestMapping(method = DELETE, value = "/permissions") + @ApiResponses(value = {@ApiResponse(code = 200, message = "Remove VisaPermission")}) + @JsonView(Views.REST.class) + public @ResponseBody void removePermissions( + @ApiIgnore @RequestHeader(value = "Authorization", required = true) + final String authorization, + @PathVariable(value = "policyId", required = true) UUID policyId, + @PathVariable(value = "visaId", required = true) UUID visaId) { + visaPermissionService.removePermission(policyId, visaId); + } } diff --git a/src/main/java/bio/overture/ego/model/dto/VisaPermissionRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaPermissionRequest.java index 83c382236..770c1e42d 100644 --- a/src/main/java/bio/overture/ego/model/dto/VisaPermissionRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/VisaPermissionRequest.java @@ -10,9 +10,9 @@ @NoArgsConstructor public class VisaPermissionRequest { - private UUID entity; + private UUID policyId; private UUID visaId; - private AccessLevel mask; + private AccessLevel accessLevel; } diff --git a/src/main/java/bio/overture/ego/model/entity/Visa.java b/src/main/java/bio/overture/ego/model/entity/Visa.java index 403b16849..f4574d692 100644 --- a/src/main/java/bio/overture/ego/model/entity/Visa.java +++ b/src/main/java/bio/overture/ego/model/entity/Visa.java @@ -64,7 +64,7 @@ public class Visa implements Identifiable { private String by; @JsonIgnore - @ManyToMany(mappedBy = "visaId", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + @OneToMany(mappedBy = JavaFields.VISA, cascade = CascadeType.ALL, fetch = FetchType.LAZY) @Builder.Default private Set visaPermissions = newHashSet(); } diff --git a/src/main/java/bio/overture/ego/model/entity/VisaPermission.java b/src/main/java/bio/overture/ego/model/entity/VisaPermission.java index e441e5962..3b7207b43 100644 --- a/src/main/java/bio/overture/ego/model/entity/VisaPermission.java +++ b/src/main/java/bio/overture/ego/model/entity/VisaPermission.java @@ -1,20 +1,13 @@ package bio.overture.ego.model.entity; -import static bio.overture.ego.model.enums.AccessLevel.EGO_ACCESS_LEVEL_ENUM; - -import bio.overture.ego.model.enums.AccessLevel; +import bio.overture.ego.model.enums.JavaFields; import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; -import java.util.Collection; -import java.util.UUID; import javax.persistence.*; -import javax.validation.constraints.NotNull; import lombok.*; import lombok.experimental.FieldNameConstants; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Type; @Entity @Table(name = Tables.ACLVISAPERMISSION) @@ -25,32 +18,20 @@ @JsonView(Views.REST.class) @ToString(callSuper = true) @FieldNameConstants +@EqualsAndHashCode( + callSuper = true, + of = {"id"}) +@NamedEntityGraph( + name = "visa-permission-entity-with-relationships", + attributeNodes = { + @NamedAttributeNode(value = JavaFields.POLICY), + @NamedAttributeNode(value = JavaFields.VISA) + }) public class VisaPermission extends AbstractPermission { - @Id - @Column(name = SqlFields.ID, updatable = false, nullable = false) - @GenericGenerator(name = "aclp_uuid", strategy = "org.hibernate.id.UUIDGenerator") - @GeneratedValue(generator = "aclp_uuid") - private UUID id; - - @JoinColumn(name = SqlFields.ID, nullable = false) - private UUID entity; - - @JoinColumn(name = SqlFields.ID, nullable = false) - private UUID visaId; - - @NotNull - @Column(name = SqlFields.MASK, nullable = false) - @Enumerated(EnumType.STRING) - @Type(type = EGO_ACCESS_LEVEL_ENUM) - private AccessLevel mask; - - @ManyToMany - @JoinTable( - name = "ga4ghvisa", - joinColumns = @JoinColumn(name = "aclp_id", referencedColumnName = "visaId"), - inverseJoinColumns = @JoinColumn(name = "visa_id", referencedColumnName = "id")) - private Collection visas; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = SqlFields.VISA_ID, nullable = false) + private Visa visa; @Override public Visa getOwner() { diff --git a/src/main/java/bio/overture/ego/model/enums/JavaFields.java b/src/main/java/bio/overture/ego/model/enums/JavaFields.java index aecbeaf19..5592b257b 100644 --- a/src/main/java/bio/overture/ego/model/enums/JavaFields.java +++ b/src/main/java/bio/overture/ego/model/enums/JavaFields.java @@ -71,6 +71,7 @@ public class JavaFields { public static final String VALUE = "value"; public static final String BY = "by"; - public static final String VISAPERMISSION = "ACLVISAPERMISSION"; + public static final String GA4GHVISA = "ga4ghvisa"; + public static final String VISA = "visa"; } diff --git a/src/main/java/bio/overture/ego/model/enums/SqlFields.java b/src/main/java/bio/overture/ego/model/enums/SqlFields.java index 488b3c8ca..dfdf0a5fb 100644 --- a/src/main/java/bio/overture/ego/model/enums/SqlFields.java +++ b/src/main/java/bio/overture/ego/model/enums/SqlFields.java @@ -40,12 +40,6 @@ public class SqlFields { public static final String ERRORREDIRECTURI = "errorredirecturi"; public static final String SOURCE = "source"; public static final String VALUE = "value"; - public static final String BY = "by"; - - public static final String ENTITY = "entity"; - - public static final String VISAID = "visaId"; - - public static final String MASK = "mask"; + public static final String VISA_ID = "visa_id"; } diff --git a/src/main/java/bio/overture/ego/model/enums/Tables.java b/src/main/java/bio/overture/ego/model/enums/Tables.java index 861fe7978..e4198aaf9 100644 --- a/src/main/java/bio/overture/ego/model/enums/Tables.java +++ b/src/main/java/bio/overture/ego/model/enums/Tables.java @@ -22,8 +22,6 @@ public class Tables { public static final String APPLICATION_PERMISSION = "applicationpermission"; public static final String DEFAULTPROVIDERTRIPWIRE = "defaultprovidertripwire"; public static final String INITTRIPWIRE = "inittripwire"; - public static final String GA4GHVISA = "ga4ghvisa"; - public static final String ACLVISAPERMISSION = "ACLVISAPERMISSION"; } diff --git a/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java b/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java index 504d20cbc..abee391d1 100644 --- a/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java +++ b/src/main/java/bio/overture/ego/repository/VisaPermissionRepository.java @@ -1,9 +1,12 @@ package bio.overture.ego.repository; +import static org.springframework.data.jpa.repository.EntityGraph.EntityGraphType.FETCH; + import bio.overture.ego.model.entity.VisaPermission; import java.util.List; import java.util.Optional; import java.util.UUID; +import org.springframework.data.jpa.repository.EntityGraph; public interface VisaPermissionRepository extends NamedRepository { @Override @@ -14,9 +17,12 @@ default Optional findByName(String name) { List findAll(); - List findByVisaId(UUID visaId); + @EntityGraph(value = "visa-permission-entity-with-relationships", type = FETCH) + List findByVisa_Id(UUID visa_id); - List findByPolicyId(UUID entity); + @EntityGraph(value = "visa-permission-entity-with-relationships", type = FETCH) + List findByPolicy_Id(UUID policy_id); - List findByPolicyIdAndVisaId(UUID entity, UUID visaId); + @EntityGraph(value = "visa-permission-entity-with-relationships", type = FETCH) + List findByPolicyIdAndVisaId(UUID policy_id, UUID visa_id); } diff --git a/src/main/java/bio/overture/ego/service/VisaPermissionService.java b/src/main/java/bio/overture/ego/service/VisaPermissionService.java index 090c1d8c3..20ae80963 100644 --- a/src/main/java/bio/overture/ego/service/VisaPermissionService.java +++ b/src/main/java/bio/overture/ego/service/VisaPermissionService.java @@ -10,6 +10,7 @@ import bio.overture.ego.repository.VisaPermissionRepository; import java.util.List; import java.util.UUID; +import javax.validation.constraints.NotNull; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -29,6 +30,8 @@ public class VisaPermissionService extends AbstractNamedService getPermissionsByVisaId(@NonNull UUID visaId) { - val result = (List) visaPermissionRepository.findByVisaId(visaId); + val result = (List) visaPermissionRepository.findByVisa_Id(visaId); if (result.isEmpty()) { throw new NotFoundException(format("No VisaPermissions exists with visaId '%s'", visaId)); } @@ -55,7 +58,7 @@ public List getPermissionsByVisaId(@NonNull UUID visaId) { } public List getPermissionsByPolicyId(@NonNull UUID policyId) { - val result = (List) visaPermissionRepository.findByPolicyId(policyId); + val result = (List) visaPermissionRepository.findByPolicy_Id(policyId); if (result.isEmpty()) { throw new NotFoundException(format("No VisaPermissions exists with policyId '%s'", policyId)); } @@ -64,12 +67,16 @@ public List getPermissionsByPolicyId(@NonNull UUID policyId) { public VisaPermission createOrUpdatePermissions( @NonNull VisaPermissionRequest visaPermissionRequest) { + VisaPermission visaPermission = null; List visaPermissionEntities = visaPermissionRepository.findByPolicyIdAndVisaId( - visaPermissionRequest.getEntity(), visaPermissionRequest.getVisaId()); - if (visaPermissionEntities == null && visaPermissionEntities.isEmpty()) { - return visaPermissionRepository.save( - VISA_PERMISSION_CONVERTER.createVisaPermission(visaPermissionRequest)); + visaPermissionRequest.getPolicyId(), visaPermissionRequest.getVisaId()); + if (visaPermissionEntities.isEmpty()) { + visaPermission = new VisaPermission(); + visaPermission.setVisa(visaService.getById(visaPermissionRequest.getVisaId())); + visaPermission.setPolicy(policyService.getById(visaPermissionRequest.getPolicyId())); + visaPermission.setAccessLevel(visaPermissionRequest.getAccessLevel()); + return visaPermissionRepository.save(visaPermission); } else { VISA_PERMISSION_CONVERTER.updateVisaPermission( visaPermissionRequest, visaPermissionEntities.get(0)); @@ -77,6 +84,15 @@ public VisaPermission createOrUpdatePermissions( } } + public void removePermission(@NonNull UUID policyId, @NotNull UUID visaId) { + VisaPermission visaPermission = null; + List visaPermissionEntities = + visaPermissionRepository.findByPolicyIdAndVisaId(policyId, visaId); + if (!visaPermissionEntities.isEmpty()) { + visaPermissionRepository.deleteById(visaPermissionEntities.get(0).getId()); + } + } + @Override public VisaPermission getById(@NonNull UUID uuid) { return super.getById(uuid); @@ -91,9 +107,6 @@ public VisaPermission getWithRelationships(UUID uuid) { nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, unmappedTargetPolicy = ReportingPolicy.WARN) public abstract static class VisaPermissionConverter { - public abstract VisaPermission createVisaPermission( - VisaPermissionRequest visaPermissionRequest); - public abstract void updateVisaPermission( VisaPermissionRequest visaPermissionRequest, @MappingTarget VisaPermission visaPermission); } diff --git a/src/main/resources/flyway/sql/V1_23__add_visa_pcl.sql b/src/main/resources/flyway/sql/V1_23__add_visa_pcl.sql index 35557eef4..0d2e780c8 100644 --- a/src/main/resources/flyway/sql/V1_23__add_visa_pcl.sql +++ b/src/main/resources/flyway/sql/V1_23__add_visa_pcl.sql @@ -1,8 +1,8 @@ CREATE TABLE ACLVISAPERMISSION ( id UUID PRIMARY KEY, - entity UUID, - visaId UUID, - mask ACLMASK NOT NULL, - FOREIGN KEY (entity) REFERENCES POLICY(id), - FOREIGN KEY (visaId) REFERENCES GA4GHVISA(id) + policy_id UUID, + visa_id UUID, + access_level ACLMASK NOT NULL, + FOREIGN KEY (policy_id) REFERENCES POLICY(id), + FOREIGN KEY (visa_id) REFERENCES GA4GHVISA(id) ); From 99bc18ce74aec2fd2f02aba587f9f6ea6054a9ed Mon Sep 17 00:00:00 2001 From: Leonardo Rivera Date: Thu, 27 Apr 2023 13:53:11 -0400 Subject: [PATCH 12/17] SpringBoot 3 migration (#689) * Update to Spring Boot 2.7 * Update to Spring Boot 3.0.5 * order Spring security filters * use JDK 17 docker image * spring migration * Spring migration --------- Co-authored-by: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> --- Dockerfile | 8 +- Jenkinsfile | 5 +- pom.xml | 78 ++--- .../ego/config/AppSecureServerConfig.java | 90 ++++++ .../ego/config/AuthorizationServerConfig.java | 10 +- .../ego/config/InitializationConfig.java | 6 +- ...essTokenResponseConverterWithDefaults.java | 22 +- .../ego/config/OAuth2ClientConfig.java | 2 +- .../ego/config/OauthSecureServerConfig.java | 154 ++++++++++ .../ego/config/SecureServerConfig.java | 166 +--------- .../bio/overture/ego/config/ServerConfig.java | 20 +- .../overture/ego/config/SwaggerConfig.java | 207 ++++++------- .../overture/ego/config/WebRequestConfig.java | 4 +- .../ego/controller/ApiKeyController.java | 70 +++-- .../ego/controller/ApplicationController.java | 223 +++++++------- .../ego/controller/AuthController.java | 14 +- .../ego/controller/GroupController.java | 253 +++++++-------- .../ego/controller/PolicyController.java | 289 +++++++++--------- .../ego/controller/TransactionController.java | 6 +- .../ego/controller/UserController.java | 265 ++++++++-------- .../ego/controller/VisaController.java | 30 +- .../model/dto/CreateApplicationRequest.java | 2 +- .../ego/model/dto/CreateTokenRequest.java | 2 +- .../ego/model/dto/CreateUserRequest.java | 2 +- .../overture/ego/model/dto/GroupRequest.java | 2 +- .../bio/overture/ego/model/dto/MaskDTO.java | 2 +- .../ego/model/dto/PermissionRequest.java | 2 +- .../overture/ego/model/dto/PolicyRequest.java | 4 +- .../overture/ego/model/dto/VisaRequest.java | 2 +- .../ego/model/entity/AbstractPermission.java | 26 +- .../bio/overture/ego/model/entity/ApiKey.java | 22 +- .../ego/model/entity/ApiKeyScope.java | 26 +- .../ego/model/entity/Application.java | 30 +- .../model/entity/ApplicationPermission.java | 2 +- .../ego/model/entity/DefaultProvider.java | 7 +- .../bio/overture/ego/model/entity/Group.java | 27 +- .../ego/model/entity/GroupPermission.java | 14 +- .../ego/model/entity/InitTripWire.java | 8 +- .../bio/overture/ego/model/entity/Policy.java | 24 +- .../ego/model/entity/RefreshToken.java | 4 +- .../bio/overture/ego/model/entity/User.java | 15 +- .../ego/model/entity/UserPermission.java | 14 +- .../bio/overture/ego/model/entity/Visa.java | 4 +- .../ego/model/entity/VisaPermission.java | 8 +- .../model/exceptions/ExceptionHandlers.java | 4 +- .../RequestValidationException.java | 4 +- .../model/exceptions/RequestViolation.java | 2 +- .../SSOAuthenticationFailureHandler.java | 4 +- .../ego/model/join/GroupApplication.java | 16 +- .../ego/model/join/GroupApplicationId.java | 4 +- .../ego/model/join/UserApplication.java | 16 +- .../ego/model/join/UserApplicationId.java | 4 +- .../overture/ego/model/join/UserGroup.java | 16 +- .../overture/ego/model/join/UserGroupId.java | 4 +- .../ego/repository/BaseRepository.java | 3 +- .../AbstractPermissionSpecification.java | 2 +- .../ApplicationSpecification.java | 2 +- .../GroupSpecification.java | 2 +- .../SimpleCriteriaBuilder.java | 2 +- .../queryspecification/SpecificationBase.java | 6 +- .../TokenStoreSpecification.java | 2 +- .../UserPermissionSpecification.java | 2 +- .../queryspecification/UserSpecification.java | 2 +- .../builder/AbstractSpecificationBuilder.java | 6 +- .../ApplicationSpecificationBuilder.java | 8 +- .../builder/GroupSpecificationBuilder.java | 4 +- .../RefreshTokenSpecificationBuilder.java | 4 +- .../builder/TokenSpecificationBuilder.java | 4 +- .../builder/UserSpecificationBuilder.java | 8 +- .../bio/overture/ego/security/CorsFilter.java | 6 +- .../ego/security/JWTAuthorizationFilter.java | 6 +- .../ego/security/OAuth2RequestResolver.java | 2 +- .../service/AbstractPermissionService.java | 2 +- .../overture/ego/service/GroupService.java | 2 +- .../ego/service/InitializationService.java | 2 +- .../overture/ego/service/PolicyService.java | 2 +- .../ego/service/RefreshContextService.java | 2 +- .../bio/overture/ego/service/UserService.java | 2 +- .../bio/overture/ego/service/VisaService.java | 2 +- .../ego/token/CustomTokenEnhancer.java | 4 +- .../ego/token/signer/DefaultTokenSigner.java | 2 +- .../ego/token/signer/JKSTokenSigner.java | 2 +- .../overture/ego/utils/HibernateSessions.java | 2 +- .../overture/ego/utils/SwaggerConstants.java | 13 + .../V1_1__complete_uuid_migration.java | 12 +- .../db/migration/V1_3__string_to_date.java | 11 +- src/main/resources/application.yml | 10 + .../controller/AbstractControllerTest.java | 2 +- .../overture/ego/controller/AppJWTTest.java | 1 - .../InitializationServiceTest.java | 2 +- .../ego/utils/web/AbstractWebResource.java | 4 +- 91 files changed, 1244 insertions(+), 1151 deletions(-) create mode 100644 src/main/java/bio/overture/ego/config/AppSecureServerConfig.java create mode 100644 src/main/java/bio/overture/ego/config/OauthSecureServerConfig.java diff --git a/Dockerfile b/Dockerfile index e93c528f8..74204e3a7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,18 @@ -FROM adoptopenjdk/openjdk11:jdk-11.0.6_10-alpine-slim as builder +FROM eclipse-temurin:17.0.6_10-jdk-focal as builder WORKDIR /usr/src/app ADD . . RUN ./mvnw package -Dmaven.test.skip=true ##################################################### -FROM adoptopenjdk/openjdk11:jre-11.0.6_10-alpine +FROM eclipse-temurin:17.0.6_10-jre-focal COPY --from=builder /usr/src/app/target/ego-*-exec.jar /usr/bin/ego.jar ENV EGO_USER ego ENV EGO_USER_ID 9999 ENV EGO_GROUP_ID 9999 ENV EGO_DIR /target -RUN addgroup -S -g $EGO_GROUP_ID $EGO_USER \ - && adduser -S -u $EGO_USER_ID -G $EGO_USER $EGO_USER \ +RUN addgroup --system --gid $EGO_GROUP_ID $EGO_USER \ + && adduser --system --uid $EGO_USER_ID --ingroup $EGO_USER $EGO_USER \ && mkdir -p $EGO_DIR \ && chown -R $EGO_USER $EGO_DIR USER $EGO_USER_ID diff --git a/Jenkinsfile b/Jenkinsfile index 9464be5dd..cdfc58f00 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,10 +12,10 @@ spec: - name: maven command: ['cat'] tty: true - image: maven:3.6.3-openjdk-11 + image: maven:3.8.5-openjdk-17 - name: jdk tty: true - image: adoptopenjdk/openjdk11:jdk-11.0.7_10-alpine-slim + image: eclipse-temurin:17.0.6_10-jdk-focal env: - name: DOCKER_HOST value: tcp://localhost:2375 @@ -128,7 +128,6 @@ spec: when { anyOf { branch 'develop' - branch 'feature/develop-passport' branch 'main' expression { return params.PUBLISH_IMAGE } } diff --git a/pom.xml b/pom.xml index 37bcaa7d7..20fcf2d30 100644 --- a/pom.xml +++ b/pom.xml @@ -13,16 +13,18 @@ org.springframework.boot spring-boot-starter-parent - 2.5.12 + 3.0.5 UTF-8 UTF-8 - 11 + 17 1.2.0.Final - 1.34.1 + 1.54.0 + + 6.0.3 @@ -34,6 +36,14 @@ org.springframework.boot spring-boot-starter-actuator + + + + org.springframework.security + spring-security-oauth2-authorization-server + 1.0.1 + + org.springframework.boot spring-boot-starter-security @@ -52,8 +62,8 @@ org.springframework.security - spring-security-oauth2-authorization-server - 0.2.1 + spring-security-oauth2-client + 6.0.3 @@ -68,27 +78,15 @@ org.projectlombok lombok - 1.18.16 + + 1.18.22 true - + - io.springfox - springfox-swagger2 - 2.9.2 - compile - - - org.mapstruct - mapstruct - - - - - io.springfox - springfox-swagger-ui - 2.9.2 - compile + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.1.0 org.springframework.boot @@ -135,25 +133,25 @@ com.vladmihalcea - hibernate-types-52 - 2.2.2 + hibernate-types-60 + 2.21.1 org.testcontainers testcontainers - 1.15.1 + 1.18.0 org.testcontainers jdbc - 1.15.1 + 1.18.0 org.testcontainers postgresql - 1.15.1 + 1.18.0 commons-io @@ -166,11 +164,11 @@ 2.6 - + org.flywaydb flyway-core - 5.2.4 + 9.16.3 @@ -304,6 +302,13 @@ test + + + javax.annotation + javax.annotation-api + 1.3.2 + + org.junit.vintage junit-vintage-engine @@ -356,7 +361,7 @@ spring-boot-maven-plugin exec - true + @@ -389,12 +394,16 @@ org.xolstice.maven.plugins protobuf-maven-plugin - 0.5.1 + 0.6.1 com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier} + + ${basedir}/src/main/proto grpc-java - io.grpc:protoc-gen-grpc-java:1.34.1:exe:${os.detected.classifier} + io.grpc:protoc-gen-grpc-java:1.54.0:exe:${os.detected.classifier} + + @@ -434,7 +443,8 @@ org.springframework.cloud spring-cloud-dependencies - 2020.0.4 + + 2021.0.5 pom import diff --git a/src/main/java/bio/overture/ego/config/AppSecureServerConfig.java b/src/main/java/bio/overture/ego/config/AppSecureServerConfig.java new file mode 100644 index 000000000..426615aca --- /dev/null +++ b/src/main/java/bio/overture/ego/config/AppSecureServerConfig.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2017. The Ontario Institute for Cancer Research. All rights reserved. + * + * 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 bio.overture.ego.config; + +import bio.overture.ego.security.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.security.SecurityProperties; +import org.springframework.context.annotation.*; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; + +@Configuration +@EnableWebSecurity +@Import(OAuth2ClientConfig.class) +@Profile("auth") +public class AppSecureServerConfig { + + OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = + new OAuth2AuthorizationServerConfigurer(); + @Autowired JWTAuthorizationFilter authorizationFilter; + + @Bean + @Order(SecurityProperties.BASIC_AUTH_ORDER - 6) + public SecurityFilterChain appFilterChain(HttpSecurity http) throws Exception { + return http.csrf() + .disable() + .apply(authorizationServerConfigurer) + .and() + .securityMatcher( + "/", + "/favicon.ico", + "/swagger-ui/**", + "/v3/api-docs/**", + "/swagger-resources/**", + "/configuration/ui", + "/configuration/**", + "/v2/api**", + "/webjars/**", + "/actuator/**", + "/o/**", + "/oauth/token", + "/oauth/token/verify", + "/oauth/token/public_key") + .authorizeRequests() + .requestMatchers( + "/", + "/favicon.ico", + "/swagger-ui/**", + "/v3/api-docs/**", + "/swagger-resources/**", + "/configuration/ui", + "/configuration/**", + "/v2/api**", + "/webjars/**", + "/actuator/**", + "/oauth/token/verify", + "/oauth/token/public_key") + .permitAll() + .requestMatchers(HttpMethod.OPTIONS, "/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .addFilterBefore(authorizationFilter, BasicAuthenticationFilter.class) + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .build(); + } +} diff --git a/src/main/java/bio/overture/ego/config/AuthorizationServerConfig.java b/src/main/java/bio/overture/ego/config/AuthorizationServerConfig.java index a3f33602b..d46580d20 100644 --- a/src/main/java/bio/overture/ego/config/AuthorizationServerConfig.java +++ b/src/main/java/bio/overture/ego/config/AuthorizationServerConfig.java @@ -16,7 +16,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.jwt.JwtDecoder; import org.springframework.security.oauth2.jwt.NimbusJwtDecoder; -import org.springframework.security.oauth2.server.authorization.config.ProviderSettings; +import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings; @Configuration public class AuthorizationServerConfig { @@ -48,7 +48,11 @@ public JwtDecoder jwtDecoder(@Autowired TokenSigner tokenSigner) { } @Bean - public ProviderSettings providerSettings(@Value("${token.issuer}") String issuer) { - return ProviderSettings.builder().tokenEndpoint("/oauth/token").issuer(issuer).build(); + public AuthorizationServerSettings providerSettings(@Value("${token.issuer}") String issuer) { + + return AuthorizationServerSettings.builder() + .tokenEndpoint("/oauth/token") + .issuer(issuer) + .build(); } } diff --git a/src/main/java/bio/overture/ego/config/InitializationConfig.java b/src/main/java/bio/overture/ego/config/InitializationConfig.java index 76b28054b..83c9d1511 100644 --- a/src/main/java/bio/overture/ego/config/InitializationConfig.java +++ b/src/main/java/bio/overture/ego/config/InitializationConfig.java @@ -1,11 +1,11 @@ package bio.overture.ego.config; import bio.overture.ego.model.enums.ApplicationType; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import java.util.ArrayList; import java.util.List; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/bio/overture/ego/config/OAuth2AccessTokenResponseConverterWithDefaults.java b/src/main/java/bio/overture/ego/config/OAuth2AccessTokenResponseConverterWithDefaults.java index ff4693a2c..1901176b1 100644 --- a/src/main/java/bio/overture/ego/config/OAuth2AccessTokenResponseConverterWithDefaults.java +++ b/src/main/java/bio/overture/ego/config/OAuth2AccessTokenResponseConverterWithDefaults.java @@ -14,7 +14,7 @@ // oauth2 spec. // https://github.com/spring-projects/spring-security/issues/5983 public class OAuth2AccessTokenResponseConverterWithDefaults - implements Converter, OAuth2AccessTokenResponse> { + implements Converter, OAuth2AccessTokenResponse> { private static final Set TOKEN_RESPONSE_PARAMETER_NAMES = Stream.of( OAuth2ParameterNames.ACCESS_TOKEN, @@ -27,27 +27,31 @@ public class OAuth2AccessTokenResponseConverterWithDefaults private OAuth2AccessToken.TokenType defaultAccessTokenType = OAuth2AccessToken.TokenType.BEARER; @Override - public OAuth2AccessTokenResponse convert(Map tokenResponseParameters) { - String accessToken = tokenResponseParameters.get(OAuth2ParameterNames.ACCESS_TOKEN); + public OAuth2AccessTokenResponse convert(Map tokenResponseParameters) { + String accessToken = + getParameterValue(tokenResponseParameters, OAuth2ParameterNames.ACCESS_TOKEN); OAuth2AccessToken.TokenType accessTokenType = this.defaultAccessTokenType; if (OAuth2AccessToken.TokenType.BEARER .getValue() - .equalsIgnoreCase(tokenResponseParameters.get(OAuth2ParameterNames.TOKEN_TYPE))) { + .equalsIgnoreCase( + getParameterValue(tokenResponseParameters, OAuth2ParameterNames.TOKEN_TYPE))) { accessTokenType = OAuth2AccessToken.TokenType.BEARER; } long expiresIn = 0; if (tokenResponseParameters.containsKey(OAuth2ParameterNames.EXPIRES_IN)) { try { - expiresIn = Long.parseLong(tokenResponseParameters.get(OAuth2ParameterNames.EXPIRES_IN)); + expiresIn = + Long.parseLong( + getParameterValue(tokenResponseParameters, OAuth2ParameterNames.EXPIRES_IN)); } catch (NumberFormatException ignored) { } } Set scopes = Collections.emptySet(); if (tokenResponseParameters.containsKey(OAuth2ParameterNames.SCOPE)) { - String scope = tokenResponseParameters.get(OAuth2ParameterNames.SCOPE); + String scope = getParameterValue(tokenResponseParameters, OAuth2ParameterNames.SCOPE); scopes = Arrays.stream(StringUtils.delimitedListToStringArray(scope, " ")) .collect(Collectors.toSet()); @@ -70,4 +74,10 @@ public final void setDefaultAccessTokenType(OAuth2AccessToken.TokenType defaultA Assert.notNull(defaultAccessTokenType, "defaultAccessTokenType cannot be null"); this.defaultAccessTokenType = defaultAccessTokenType; } + + private static String getParameterValue( + Map tokenResponseParameters, String parameterName) { + Object obj = tokenResponseParameters.get(parameterName); + return obj != null ? obj.toString() : null; + } } diff --git a/src/main/java/bio/overture/ego/config/OAuth2ClientConfig.java b/src/main/java/bio/overture/ego/config/OAuth2ClientConfig.java index a5165f0e6..683eb3ba0 100644 --- a/src/main/java/bio/overture/ego/config/OAuth2ClientConfig.java +++ b/src/main/java/bio/overture/ego/config/OAuth2ClientConfig.java @@ -30,7 +30,7 @@ public class OAuth2ClientConfig { @Bean public OAuth2AuthorizationRequestResolver oAuth2AuthorizationRequestResolver( ClientRegistrationRepository clientRegistrationRepository) { - return new OAuth2RequestResolver(clientRegistrationRepository, "/oauth/login/"); + return new OAuth2RequestResolver(clientRegistrationRepository, "/oauth/login"); } @Bean diff --git a/src/main/java/bio/overture/ego/config/OauthSecureServerConfig.java b/src/main/java/bio/overture/ego/config/OauthSecureServerConfig.java new file mode 100644 index 000000000..fb4367dfc --- /dev/null +++ b/src/main/java/bio/overture/ego/config/OauthSecureServerConfig.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2017. The Ontario Institute for Cancer Research. All rights reserved. + * + * 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 bio.overture.ego.config; + +import bio.overture.ego.model.exceptions.SSOAuthenticationFailureHandler; +import bio.overture.ego.security.*; +import bio.overture.ego.service.ApplicationService; +import bio.overture.ego.utils.Redirects; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; +import lombok.val; +import org.springframework.boot.autoconfigure.security.SecurityProperties; +import org.springframework.context.annotation.*; +import org.springframework.core.annotation.Order; +import org.springframework.http.converter.FormHttpMessageConverter; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; +import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.OAuth2Error; +import org.springframework.security.oauth2.core.OAuth2ErrorCodes; +import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; +import org.springframework.web.client.RestTemplate; + +@Configuration +@EnableWebSecurity +@Import(OAuth2ClientConfig.class) +@Profile("auth") +public class OauthSecureServerConfig { + + @Bean + public AuthorizationManager authorizationManager() { + return new SecureAuthorizationManager(); + } + + final OAuth2AuthorizationRequestResolver oAuth2RequestResolver; + final CustomOAuth2UserInfoService customOAuth2UserInfoService; + final CustomOidc2UserInfoService customOidc2UserInfoService; + final ApplicationService applicationService; + final SSOAuthenticationFailureHandler failureHandler; + + public OauthSecureServerConfig( + OAuth2AuthorizationRequestResolver requestResolver, + CustomOAuth2UserInfoService customOAuth2UserInfoService, + CustomOidc2UserInfoService customOidc2UserInfoService, + ApplicationService applicationService, + SSOAuthenticationFailureHandler failureHandler) { + this.oAuth2RequestResolver = requestResolver; + this.customOAuth2UserInfoService = customOAuth2UserInfoService; + this.customOidc2UserInfoService = customOidc2UserInfoService; + this.applicationService = applicationService; + this.failureHandler = failureHandler; + } + + @Bean + public SimpleUrlAuthenticationSuccessHandler successHandler() { + return new SimpleUrlAuthenticationSuccessHandler() { + public void onAuthenticationSuccess( + HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException, ServletException { + val application = + applicationService.getByClientId( + (String) request.getSession().getAttribute("ego_client_id")); + + String redirectUri = (String) request.getSession().getAttribute("ego_redirect_uri"); + + val redirect = Redirects.getRedirectUri(application, redirectUri); + if (!redirect.isEmpty()) { + this.setDefaultTargetUrl(redirect); + super.onAuthenticationSuccess(request, response, authentication); + } else { + throw new OAuth2AuthenticationException( + new OAuth2Error(OAuth2ErrorCodes.UNAUTHORIZED_CLIENT), + "Incorrect redirect uri for ego client."); + } + } + }; + } + + @Bean + @Order(SecurityProperties.BASIC_AUTH_ORDER + 3000) + public SecurityFilterChain oathFilterChain(HttpSecurity http) throws Exception { + return http.csrf() + .disable() + .securityMatcher( + "/oauth/code/*", + "/oauth/login/*", + "/oauth/ego-token", + "/oauth/update-ego-token", + "/oauth/refresh") + .authorizeHttpRequests() + .requestMatchers( + "/oauth/code/*", + "/oauth/login/*", + "/oauth/ego-token", + "/oauth/update-ego-token", + "/oauth/refresh") + .permitAll() + .and() + .oauth2Login( + x -> { + x.redirectionEndpoint().baseUri("/oauth/code/{registrationId}"); + x.authorizationEndpoint(y -> y.authorizationRequestResolver(oAuth2RequestResolver)); + x.tokenEndpoint() + .accessTokenResponseClient(this.authorizationCodeTokenResponseClient()); + x.userInfoEndpoint().oidcUserService(this.customOidc2UserInfoService); + x.userInfoEndpoint().userService(customOAuth2UserInfoService); + x.successHandler(this.successHandler()); + x.failureHandler(this.failureHandler); + }) + .build(); + } + + private OAuth2AccessTokenResponseClient + authorizationCodeTokenResponseClient() { + val tokenResponseHttpMessageConverter = new OAuth2AccessTokenResponseHttpMessageConverter(); + tokenResponseHttpMessageConverter.setAccessTokenResponseConverter( + new OAuth2AccessTokenResponseConverterWithDefaults()); + + val restTemplate = + new RestTemplate( + Arrays.asList(new FormHttpMessageConverter(), tokenResponseHttpMessageConverter)); + restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler()); + + val tokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient(); + tokenResponseClient.setRestOperations(restTemplate); + + return tokenResponseClient; + } +} diff --git a/src/main/java/bio/overture/ego/config/SecureServerConfig.java b/src/main/java/bio/overture/ego/config/SecureServerConfig.java index 7ddeb2447..533b0f02b 100644 --- a/src/main/java/bio/overture/ego/config/SecureServerConfig.java +++ b/src/main/java/bio/overture/ego/config/SecureServerConfig.java @@ -16,43 +16,13 @@ package bio.overture.ego.config; -import bio.overture.ego.model.exceptions.SSOAuthenticationFailureHandler; import bio.overture.ego.security.*; import bio.overture.ego.service.ApplicationService; import bio.overture.ego.service.TokenService; -import bio.overture.ego.utils.Redirects; -import java.io.IOException; -import java.util.Arrays; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.SneakyThrows; -import lombok.val; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.security.SecurityProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.*; -import org.springframework.core.annotation.Order; -import org.springframework.http.HttpMethod; -import org.springframework.http.converter.FormHttpMessageConverter; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.annotation.web.configurers.oauth2.server.authorization.OAuth2AuthorizationServerConfigurer; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.core.Authentication; -import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient; -import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; -import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; -import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler; -import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver; -import org.springframework.security.oauth2.core.OAuth2AuthenticationException; -import org.springframework.security.oauth2.core.OAuth2Error; -import org.springframework.security.oauth2.core.OAuth2ErrorCodes; -import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; -import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; -import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; -import org.springframework.web.client.RestTemplate; @Configuration @EnableWebSecurity @@ -86,144 +56,10 @@ public AuthorizationManager authorizationManager() { return new SecureAuthorizationManager(); } - @Configuration - @Order(SecurityProperties.BASIC_AUTH_ORDER - 3) - public class OAuthConfigurerAdapter extends WebSecurityConfigurerAdapter { - - final OAuth2AuthorizationRequestResolver oAuth2RequestResolver; - final CustomOAuth2UserInfoService customOAuth2UserInfoService; - final CustomOidc2UserInfoService customOidc2UserInfoService; - final ApplicationService applicationService; - final SSOAuthenticationFailureHandler failureHandler; - - public OAuthConfigurerAdapter( - OAuth2AuthorizationRequestResolver requestResolver, - CustomOAuth2UserInfoService customOAuth2UserInfoService, - CustomOidc2UserInfoService customOidc2UserInfoService, - ApplicationService applicationService, - SSOAuthenticationFailureHandler failureHandler) { - this.oAuth2RequestResolver = requestResolver; - this.customOAuth2UserInfoService = customOAuth2UserInfoService; - this.customOidc2UserInfoService = customOidc2UserInfoService; - this.applicationService = applicationService; - this.failureHandler = failureHandler; - } - - @Bean - public SimpleUrlAuthenticationSuccessHandler successHandler() { - return new SimpleUrlAuthenticationSuccessHandler() { - public void onAuthenticationSuccess( - HttpServletRequest request, HttpServletResponse response, Authentication authentication) - throws IOException, ServletException { - val application = - applicationService.getByClientId( - (String) request.getSession().getAttribute("ego_client_id")); - - String redirectUri = (String) request.getSession().getAttribute("ego_redirect_uri"); - - val redirect = Redirects.getRedirectUri(application, redirectUri); - if (!redirect.isEmpty()) { - this.setDefaultTargetUrl(redirect); - super.onAuthenticationSuccess(request, response, authentication); - } else { - throw new OAuth2AuthenticationException( - new OAuth2Error(OAuth2ErrorCodes.UNAUTHORIZED_CLIENT), - "Incorrect redirect uri for ego client."); - } - } - }; - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.requestMatchers() - .antMatchers( - "/oauth/code/*", - "/oauth/login/*", - "/oauth/ego-token", - "/oauth/update-ego-token", - "/oauth/refresh") - .and() - .csrf() - .disable() - .authorizeRequests() - .anyRequest() - .permitAll() - .and() - .oauth2Login( - x -> { - x.redirectionEndpoint().baseUri("/oauth/code/{registrationId}"); - x.authorizationEndpoint(y -> y.authorizationRequestResolver(oAuth2RequestResolver)); - x.tokenEndpoint() - .accessTokenResponseClient(this.authorizationCodeTokenResponseClient()); - x.userInfoEndpoint().oidcUserService(this.customOidc2UserInfoService); - x.userInfoEndpoint().userService(customOAuth2UserInfoService); - x.successHandler(this.successHandler()); - x.failureHandler(this.failureHandler); - }); - } - - private OAuth2AccessTokenResponseClient - authorizationCodeTokenResponseClient() { - val tokenResponseHttpMessageConverter = new OAuth2AccessTokenResponseHttpMessageConverter(); - tokenResponseHttpMessageConverter.setTokenResponseConverter( - new OAuth2AccessTokenResponseConverterWithDefaults()); - - val restTemplate = - new RestTemplate( - Arrays.asList(new FormHttpMessageConverter(), tokenResponseHttpMessageConverter)); - restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler()); - - val tokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient(); - tokenResponseClient.setRestOperations(restTemplate); - - return tokenResponseClient; - } - } - @Bean @SneakyThrows - public JWTAuthorizationFilter authorizationFilter( + public JWTAuthorizationFilter authorizationFilterBean( TokenService tokenService, ApplicationService applicationService) { return new JWTAuthorizationFilter(PUBLIC_ENDPOINTS, tokenService, applicationService); } - - @Configuration - @Order(SecurityProperties.BASIC_AUTH_ORDER + 3) - public class AppConfigurerAdapter extends WebSecurityConfigurerAdapter { - - OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = - new OAuth2AuthorizationServerConfigurer<>(); - @Autowired JWTAuthorizationFilter authorizationFilter; - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.csrf() - .disable() - .apply(authorizationServerConfigurer) - .and() - .authorizeRequests() - .antMatchers( - "/", - "/favicon.ico", - "/swagger**", - "/swagger-resources/**", - "/configuration/ui", - "/configuration/**", - "/v2/api**", - "/webjars/**", - "/actuator/**", - "/oauth/token/verify", - "/oauth/token/public_key") - .permitAll() - .antMatchers(HttpMethod.OPTIONS, "/**") - .permitAll() - .anyRequest() - .authenticated() - .and() - .addFilterBefore(authorizationFilter, BasicAuthenticationFilter.class) - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS); - } - } } diff --git a/src/main/java/bio/overture/ego/config/ServerConfig.java b/src/main/java/bio/overture/ego/config/ServerConfig.java index b34939818..bc1fd8a6c 100644 --- a/src/main/java/bio/overture/ego/config/ServerConfig.java +++ b/src/main/java/bio/overture/ego/config/ServerConfig.java @@ -23,32 +23,34 @@ import org.springframework.context.annotation.Profile; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity @Profile("!auth") -public class ServerConfig extends WebSecurityConfigurerAdapter { +public class ServerConfig { @Bean public AuthorizationManager authorizationManager() { return new DefaultAuthorizationManager(); } - @Override - protected void configure(HttpSecurity http) throws Exception { - http.csrf() + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + return http.csrf() .disable() - .authorizeRequests() - .antMatchers("/**") + .authorizeHttpRequests() + .requestMatchers("/**") .permitAll() .anyRequest() .authenticated() .and() - .authorizeRequests() + .authorizeHttpRequests() .and() .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS); + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .build(); } } diff --git a/src/main/java/bio/overture/ego/config/SwaggerConfig.java b/src/main/java/bio/overture/ego/config/SwaggerConfig.java index e42d60779..808b60cdf 100644 --- a/src/main/java/bio/overture/ego/config/SwaggerConfig.java +++ b/src/main/java/bio/overture/ego/config/SwaggerConfig.java @@ -16,58 +16,40 @@ package bio.overture.ego.config; -import static bio.overture.ego.utils.SwaggerConstants.AUTH_CONTROLLER; -import static bio.overture.ego.utils.SwaggerConstants.POST_ACCESS_TOKEN; -import static java.util.stream.Collectors.toUnmodifiableList; -import static springfox.documentation.builders.RequestHandlerSelectors.basePackage; -import static springfox.documentation.spi.DocumentationType.SWAGGER_2; - -import com.fasterxml.classmate.TypeResolver; -import com.google.common.base.Predicates; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import static bio.overture.ego.utils.SwaggerConstants.*; + +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Operation; +import io.swagger.v3.oas.models.PathItem; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.parameters.Parameter; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.servers.Server; +import java.net.URISyntaxException; +import java.util.*; +import java.util.stream.Collectors; import lombok.Getter; import lombok.NonNull; import lombok.Setter; -import lombok.val; +import org.apache.http.client.utils.URIBuilder; +import org.springdoc.core.customizers.OpenApiCustomizer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.info.BuildProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; -import springfox.documentation.builders.ParameterBuilder; -import springfox.documentation.schema.ModelRef; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.ApiKey; -import springfox.documentation.service.AuthorizationScope; -import springfox.documentation.service.Contact; -import springfox.documentation.service.Parameter; -import springfox.documentation.service.SecurityReference; -import springfox.documentation.service.VendorExtension; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.ParameterBuilderPlugin; -import springfox.documentation.spi.service.contexts.ParameterContext; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.paths.RelativePathProvider; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger.common.SwaggerPluginSupport; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -@EnableSwagger2 + +/** Open API Configuration Bean */ @Configuration public class SwaggerConfig { - private static final Set POST_ACCESS_TOKEN_PARAMS = - Set.of("client_secret", "client_id", "grant_type"); - private static final Set APPLICATION_SCOPED_PATHS = - Set.of( - "/o/check_api_key", - "/o/check_token", - "/transaction/group_permissions", - "/transaction/mass_delete"); - private final BuildProperties buildProperties; @Autowired @@ -76,103 +58,54 @@ public SwaggerConfig(@NonNull BuildProperties buildProperties) { } @Bean - public ParameterBuilderPlugin parameterBuilderPlugin() { - return new ParameterBuilderPlugin() { - @Override - public void apply(ParameterContext context) { - if (context.getGroupName().equals(AUTH_CONTROLLER) - && context.getOperationContext().getName().equals(POST_ACCESS_TOKEN)) { - context - .getOperationContext() - .operationBuilder() - .parameters(generatePostAccessTokenParameters()); - - // hide default "parameters" arg - val defaultName = context.resolvedMethodParameter().defaultName(); - if (defaultName.isPresent() && defaultName.get().equals("parameters")) { - context.parameterBuilder().required(false).hidden(true).build(); - } - } - } - - @Override - public boolean supports(DocumentationType delimiter) { - return SwaggerPluginSupport.pluginDoesApply(delimiter); - } - }; + public OpenAPI productApi(SwaggerProperties swaggerProperties) { + + URIBuilder uriBuilder = null; + try { + uriBuilder = new URIBuilder(swaggerProperties.host); + uriBuilder.setPath(swaggerProperties.baseUrl).build().normalize(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + + return new OpenAPI() + .info(metaInfo()) + .servers(List.of(new Server().url(uriBuilder.toString()))) + .components(new Components().addSecuritySchemes(SECURITY_SCHEME_NAME, securityScheme())); } - @Bean - public Docket productApi(SwaggerProperties swaggerProperties) { - return new Docket(SWAGGER_2) - .select() - .apis(Predicates.or(basePackage("bio.overture.ego.controller"))) - .build() - .host(swaggerProperties.host) - .pathProvider( - new RelativePathProvider(null) { - @Override - public String getApplicationBasePath() { - return swaggerProperties.getBaseUrl(); - } - }) - .securitySchemes(List.of(apiKey())) - .securityContexts(List.of(securityContext())) - .apiInfo(metaInfo()) - .produces(Set.of("application/json")) - .consumes(Set.of("application/json")); - } - - private ApiInfo metaInfo() { - - return new ApiInfo( - "Ego Service API", - "Ego API Documentation", - buildProperties.getVersion(), - "", - new Contact("", "", ""), - "GNU Affero General Public License v3.0", - "", - new ArrayList()); - } + private Info metaInfo() { - private static ApiKey apiKey() { - return new ApiKey("Bearer", "Authorization", "header"); + return new Info() + .title("Ego Service API") + .description("Ego API Documentation") + .version(buildProperties.getVersion()) + .contact(new Contact()) + .license(new License().name("GNU Affero General Public License v3.0")); } - private static SecurityContext securityContext() { - return SecurityContext.builder() - .securityReferences(List.of(securityReference())) - // We want the default Bearer auth applied only for non-ApplicationScoped endpoints. - // For ApplicationScoped endpoints, an explicit RequestHeader - // fields will be present in the ui - .forPaths(x -> !isApplicationScopedPath(x)) - .build(); + private static SecurityScheme securityScheme() { + return new SecurityScheme() + .name(SECURITY_SCHEME_NAME) + .type(SecurityScheme.Type.HTTP) + .scheme("bearer") + .bearerFormat("JWT"); } private static boolean isApplicationScopedPath(@NonNull String path) { return APPLICATION_SCOPED_PATHS.contains(path); } - private static SecurityReference securityReference() { - return SecurityReference.builder() - .reference("Bearer") - .scopes(new AuthorizationScope[0]) - .build(); - } - private static List generatePostAccessTokenParameters() { return POST_ACCESS_TOKEN_PARAMS.stream() .map( name -> - new ParameterBuilder() - .type(new TypeResolver().resolve(String.class)) + new Parameter() + .schema(new Schema().type("string")) .name(name) - .parameterType("query") - .required(true) - .modelRef(new ModelRef("String")) - .build()) - .collect(toUnmodifiableList()); + .in(ParameterIn.QUERY.toString()) + .required(true)) + .collect(Collectors.toList()); } @Component @@ -189,4 +122,36 @@ class SwaggerProperties { */ private String baseUrl = ""; } + + @Bean + public OpenApiCustomizer openApiCustomiser() { + return openApi -> { + openApi + .getPaths() + .forEach( + (path, pathItem) -> { + + // We want the default Bearer auth applied only for non-ApplicationScoped endpoints. + // For ApplicationScoped endpoints, an explicit RequestHeader + if (!isApplicationScopedPath(path)) { + pathItem + .readOperations() + .forEach( + operation -> { + operation.addSecurityItem( + new SecurityRequirement().addList(SECURITY_SCHEME_NAME)); + }); + } + }); + + // generate access token parameters + PathItem accessTokenPath = + new PathItem() + .post( + new Operation() + .addTagsItem("Auth") + .parameters(generatePostAccessTokenParameters())); + openApi.getPaths().addPathItem("/oauth/token", accessTokenPath); + }; + } } diff --git a/src/main/java/bio/overture/ego/config/WebRequestConfig.java b/src/main/java/bio/overture/ego/config/WebRequestConfig.java index e99bcd589..3e9a709d4 100644 --- a/src/main/java/bio/overture/ego/config/WebRequestConfig.java +++ b/src/main/java/bio/overture/ego/config/WebRequestConfig.java @@ -24,10 +24,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration -public class WebRequestConfig extends WebMvcConfigurerAdapter { +public class WebRequestConfig implements WebMvcConfigurer { @Bean public List fieldValues() { diff --git a/src/main/java/bio/overture/ego/controller/ApiKeyController.java b/src/main/java/bio/overture/ego/controller/ApiKeyController.java index 9a23b7c94..0f6c84567 100644 --- a/src/main/java/bio/overture/ego/controller/ApiKeyController.java +++ b/src/main/java/bio/overture/ego/controller/ApiKeyController.java @@ -46,12 +46,18 @@ import bio.overture.ego.security.ApplicationScoped; import bio.overture.ego.security.AuthorizationManager; import bio.overture.ego.service.TokenService; -import io.swagger.annotations.*; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.UUID; -import javax.servlet.http.HttpServletRequest; import lombok.NonNull; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -64,12 +70,11 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; @Slf4j @RestController @RequestMapping("/o") -@Api(tags = "Api Keys") +@Tag(name = "Api Keys") public class ApiKeyController { /** Dependencies */ @@ -118,7 +123,7 @@ public ApiKeyController( @ResponseStatus(value = OK) @SneakyThrows public @ResponseBody UserScopesResponse getUserScope( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestParam(value = "userId") final UUID userId) { return tokenService.userScopes(userId); @@ -127,7 +132,7 @@ public ApiKeyController( @RequestMapping(method = POST, value = "/api_key") @ResponseStatus(value = OK) public @ResponseBody ApiKeyResponse issueApiKey( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestParam(value = "user_id") UUID userId, @RequestParam(value = "scopes") ArrayList scopes, @@ -153,7 +158,7 @@ public ApiKeyController( @RequestMapping(method = POST, value = "/token") @ResponseStatus(value = OK) public @ResponseBody TokenResponse issueToken( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestParam(value = "user_id") UUID userId, @RequestParam(value = "scopes") ArrayList scopes, @@ -175,7 +180,7 @@ public ApiKeyController( @RequestMapping(method = DELETE, value = "/api_key") @ResponseStatus(value = OK) public @ResponseBody GenericResponse revokeApiKey( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestParam(value = "apiKey") final String apiKey) { tokenService.revokeApiKey(apiKey); @@ -187,7 +192,7 @@ public ApiKeyController( @RequestMapping(method = DELETE, value = "/token") @ResponseStatus(value = OK) public @ResponseBody String revokeToken( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestParam(value = "token") final String token) { tokenService.revokeApiKey(token); @@ -195,42 +200,43 @@ public ApiKeyController( } @RequestMapping(method = GET, value = "/api_key") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page ApiKeys for a User")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Page ApiKeys for a User")}) public @ResponseBody PageDTO listApiKeys( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestParam(value = "user_id") UUID userId, - @ApiParam(value = "Query string compares to ApiKey's Name fields.", required = false) + @Parameter(description = "Query string compares to ApiKey's Name fields.", required = false) @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { checkAdminOrOwner(userId); if (isEmpty(query)) { return new PageDTO<>(tokenService.listApiKeysForUser(userId, filters, pageable)); @@ -244,7 +250,7 @@ public ApiKeyController( @RequestMapping(method = GET, value = "/token") @ResponseStatus(value = OK) public @ResponseBody List listTokens( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestParam(value = "user_id") UUID userId) { checkAdminOrOwner(userId); diff --git a/src/main/java/bio/overture/ego/controller/ApplicationController.java b/src/main/java/bio/overture/ego/controller/ApplicationController.java index cefecf2be..cafe4407f 100644 --- a/src/main/java/bio/overture/ego/controller/ApplicationController.java +++ b/src/main/java/bio/overture/ego/controller/ApplicationController.java @@ -38,11 +38,13 @@ import bio.overture.ego.service.UserService; import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.Collection; import java.util.List; import java.util.UUID; @@ -52,12 +54,11 @@ import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; @Slf4j @RestController @RequestMapping("/applications") -@Api(tags = "Applications") +@Tag(name = "Applications") public class ApplicationController { /** Dependencies */ @@ -81,40 +82,40 @@ public ApplicationController( @AdminScoped @RequestMapping(method = GET, value = "") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page Applications")}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Page Applications")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO listApplications( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { if (isEmpty(query)) { return new PageDTO<>(applicationService.listApps(filters, pageable)); } else { @@ -124,10 +125,9 @@ public ApplicationController( @AdminScoped @RequestMapping(method = POST, value = "") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "New Application", response = Application.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "New Application")}) public @ResponseBody Application createApplication( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestBody(required = true) CreateApplicationRequest request) { return applicationService.create(request); @@ -135,13 +135,10 @@ public ApplicationController( @AdminScoped @RequestMapping(method = GET, value = "/{id}") - @ApiResponses( - value = { - @ApiResponse(code = 200, message = "Application Details", response = Application.class) - }) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Application Details")}) @JsonView(Views.REST.class) public @ResponseBody Application getApplication( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { return applicationService.getById(id); @@ -150,11 +147,9 @@ public ApplicationController( @AdminScoped @RequestMapping(method = PUT, value = "/{id}") @ApiResponses( - value = { - @ApiResponse(code = 200, message = "Updated application info", response = Application.class) - }) + value = {@ApiResponse(responseCode = "200", description = "Updated application info")}) public @ResponseBody Application updateApplication( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(name = "id", required = true) UUID id, @RequestBody(required = true) UpdateApplicationRequest updateRequest) { @@ -165,7 +160,7 @@ public ApplicationController( @RequestMapping(method = DELETE, value = "/{id}") @ResponseStatus(value = HttpStatus.OK) public void deleteApplication( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { applicationService.delete(id); @@ -173,41 +168,42 @@ public void deleteApplication( @AdminScoped @RequestMapping(method = GET, value = "/{id}/users") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page Users for an Application")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Page Users for an Application")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO getUsersForApplication( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { if (isEmpty(query)) { return new PageDTO<>(userService.findUsersForApplication(id, filters, pageable)); } else { @@ -217,41 +213,42 @@ public void deleteApplication( @AdminScoped @RequestMapping(method = GET, value = "/{id}/groups") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page Groups for an Application")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Page Groups for an Application")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO getGroupsForApplication( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { if (isEmpty(query)) { return new PageDTO<>(groupService.findGroupsForApplication(id, filters, pageable)); } else { @@ -264,56 +261,51 @@ public void deleteApplication( */ @AdminScoped @RequestMapping(method = GET, value = "/{id}/permissions") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) @ApiResponses( value = { - @ApiResponse(code = 200, message = "Page Permissions for an Application"), + @ApiResponse(responseCode = "200", description = "Page Permissions for an Application"), }) @JsonView(Views.REST.class) public @ResponseBody PageDTO getPermissionsForApplication( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) Pageable pageable) { return new PageDTO<>(applicationPermissionService.getPermissions(id, pageable)); } @AdminScoped @RequestMapping(method = POST, value = "/{id}/permissions") @ApiResponses( - value = { - @ApiResponse( - code = 200, - message = "Add application permissions", - response = Application.class) - }) + value = {@ApiResponse(responseCode = "200", description = "Add application permissions")}) public @ResponseBody Application addPermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) List permissions) { @@ -322,10 +314,11 @@ public void deleteApplication( @AdminScoped @RequestMapping(method = DELETE, value = "/{id}/permissions/{permissionIds}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Delete application permissions")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Delete application permissions")}) @ResponseStatus(value = OK) public void deletePermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "permissionIds", required = true) List permissionIds) { @@ -337,13 +330,13 @@ public void deletePermissions( @ApiResponses( value = { @ApiResponse( - code = 200, - message = + responseCode = "200", + description = "Get effective permissions for an application with application and group permissions") }) @ResponseStatus(value = HttpStatus.OK) public @ResponseBody Collection getResolvedPermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { return applicationPermissionService.getResolvedPermissions(id); diff --git a/src/main/java/bio/overture/ego/controller/AuthController.java b/src/main/java/bio/overture/ego/controller/AuthController.java index 927b189ce..b6b696a4a 100644 --- a/src/main/java/bio/overture/ego/controller/AuthController.java +++ b/src/main/java/bio/overture/ego/controller/AuthController.java @@ -32,9 +32,10 @@ import bio.overture.ego.token.IDToken; import bio.overture.ego.token.signer.TokenSigner; import bio.overture.ego.utils.Tokens; -import io.swagger.annotations.Api; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import java.util.Objects; -import javax.servlet.http.HttpServletResponse; import lombok.NonNull; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -47,12 +48,11 @@ import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; @Slf4j @RestController @RequestMapping("/oauth") -@Api(tags = "Auth", value = AUTH_CONTROLLER) +@Tag(name = "Auth", description = AUTH_CONTROLLER) public class AuthController { @Value("${auth.token.prefix}") @@ -146,7 +146,7 @@ public ResponseEntity user( method = {GET, POST}, value = "/update-ego-token") public ResponseEntity updateEgoToken( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization) { val currentToken = Tokens.removeTokenPrefix(authorization, TOKEN_PREFIX); return new ResponseEntity<>(tokenService.updateUserToken(currentToken), OK); @@ -154,7 +154,7 @@ public ResponseEntity updateEgoToken( @RequestMapping(method = DELETE, value = "/refresh") public ResponseEntity deleteRefreshToken( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @CookieValue(value = REFRESH_ID, defaultValue = "missing") String refreshId, HttpServletResponse response) { @@ -170,7 +170,7 @@ public ResponseEntity deleteRefreshToken( @RequestMapping(method = POST, value = "/refresh") public ResponseEntity refreshEgoToken( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @CookieValue(value = REFRESH_ID, defaultValue = "missing") String refreshId, HttpServletResponse response) { diff --git a/src/main/java/bio/overture/ego/controller/GroupController.java b/src/main/java/bio/overture/ego/controller/GroupController.java index 5edcfc24e..c0088bca9 100644 --- a/src/main/java/bio/overture/ego/controller/GroupController.java +++ b/src/main/java/bio/overture/ego/controller/GroupController.java @@ -43,11 +43,13 @@ import bio.overture.ego.service.UserService; import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.List; import java.util.UUID; import lombok.NonNull; @@ -64,12 +66,11 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; -import springfox.documentation.annotations.ApiIgnore; @Slf4j @RestController @RequestMapping("/groups") -@Api(tags = "Groups") +@Tag(name = "Groups") public class GroupController { /** Dependencies */ @@ -95,40 +96,40 @@ public GroupController( @AdminScoped @RequestMapping(method = GET, value = "") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page Groups")}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Page Groups")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO listGroups( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { if (isEmpty(query)) { return new PageDTO<>(groupService.listGroups(filters, pageable)); } else { @@ -140,10 +141,10 @@ public GroupController( @RequestMapping(method = POST, value = "") @ApiResponses( value = { - @ApiResponse(code = 200, message = "New Group", response = Group.class), + @ApiResponse(responseCode = "200", description = "New Group"), }) public @ResponseBody Group createGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestBody GroupRequest createRequest) { return groupService.create(createRequest); @@ -151,11 +152,10 @@ public GroupController( @AdminScoped @RequestMapping(method = GET, value = "/{id}") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "Group Details", response = Group.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Group Details")}) @JsonView(Views.REST.class) public @ResponseBody Group getGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id") UUID id) { return groupService.getById(id); @@ -163,10 +163,9 @@ public GroupController( @AdminScoped @RequestMapping(method = RequestMethod.PUT, value = "/{id}") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "Updated group info", response = Group.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Updated group info")}) public @ResponseBody Group updateGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id") UUID id, @RequestBody(required = true) GroupRequest updateRequest) { @@ -177,7 +176,7 @@ public GroupController( @RequestMapping(method = DELETE, value = "/{id}") @ResponseStatus(value = OK) public void deleteGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { groupService.delete(id); @@ -188,57 +187,56 @@ public void deleteGroup( */ @AdminScoped @RequestMapping(method = GET, value = "/{id}/permissions") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = Fields.ID, required = true, - dataType = "string", - paramType = "path", - value = "Search for ids containing this text"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Search for ids containing this text"), + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) @ApiResponses( value = { - @ApiResponse(code = 200, message = "Page GroupPermissions for a Group"), + @ApiResponse(responseCode = "200", description = "Page GroupPermissions for a Group"), }) @JsonView(Views.REST.class) public @ResponseBody PageDTO getGroupPermissionsForGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) Pageable pageable) { return new PageDTO<>(groupPermissionService.getPermissions(id, pageable)); } @AdminScoped @RequestMapping(method = POST, value = "/{id}/permissions") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "Add group permissions", response = Group.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Add group permissions")}) public @ResponseBody Group addPermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) List permissions) { @@ -247,10 +245,11 @@ public void deleteGroup( @AdminScoped @RequestMapping(method = DELETE, value = "/{id}/permissions/{permissionIds}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Delete group permissions")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Delete group permissions")}) @ResponseStatus(value = OK) public void deletePermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "permissionIds", required = true) List permissionIds) { @@ -262,47 +261,48 @@ public void deletePermissions( */ @AdminScoped @RequestMapping(method = GET, value = "/{id}/applications") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = Fields.ID, required = true, - dataType = "string", - paramType = "path", - value = "Search for ids containing this text"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Search for ids containing this text"), + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page Applications for a Group")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Page Applications for a Group")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO getApplicationsForGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { if (StringUtils.isEmpty(query)) { return new PageDTO<>(applicationService.findApplicationsForGroup(id, filters, pageable)); } else { @@ -313,10 +313,9 @@ public void deletePermissions( @AdminScoped @RequestMapping(method = POST, value = "/{id}/applications") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "Add Apps to Group", response = Group.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Add Apps to Group")}) public @ResponseBody Group addApplicationsToGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) List appIds) { @@ -325,10 +324,11 @@ public void deletePermissions( @AdminScoped @RequestMapping(method = DELETE, value = "/{id}/applications/{appIds}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Delete Apps from Group")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Delete Apps from Group")}) @ResponseStatus(value = OK) public void deleteApplicationsFromGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "appIds", required = true) List appIds) { @@ -340,47 +340,48 @@ public void deleteApplicationsFromGroup( */ @AdminScoped @RequestMapping(method = GET, value = "/{id}/users") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = Fields.ID, required = true, - dataType = "string", - paramType = "path", - value = "Search for ids containing this text"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Search for ids containing this text"), + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page Users for a Group")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Page Users for a Group")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO getUsersForGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { if (StringUtils.isEmpty(query)) { return new PageDTO<>(userService.findUsersForGroup(id, filters, pageable)); } else { @@ -390,10 +391,9 @@ public void deleteApplicationsFromGroup( @AdminScoped @RequestMapping(method = POST, value = "/{id}/users") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "Add Users to Group", response = Group.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Add Users to Group")}) public @ResponseBody Group addUsersToGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) List userIds) { @@ -402,10 +402,11 @@ public void deleteApplicationsFromGroup( @AdminScoped @RequestMapping(method = DELETE, value = "/{id}/users/{userIds}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Delete Users from Group")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Delete Users from Group")}) @ResponseStatus(value = OK) public void deleteUsersFromGroup( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "userIds", required = true) List userIds) { diff --git a/src/main/java/bio/overture/ego/controller/PolicyController.java b/src/main/java/bio/overture/ego/controller/PolicyController.java index 7493542e5..ca7590e47 100644 --- a/src/main/java/bio/overture/ego/controller/PolicyController.java +++ b/src/main/java/bio/overture/ego/controller/PolicyController.java @@ -28,7 +28,14 @@ import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; import com.google.common.collect.ImmutableList; -import io.swagger.annotations.*; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.List; import java.util.UUID; import lombok.NonNull; @@ -38,12 +45,11 @@ import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; @Slf4j @RestController @RequestMapping("/policies") -@Api(tags = "Policies") +@Tag(name = "Policies") public class PolicyController { /** Dependencies */ @@ -67,11 +73,10 @@ public PolicyController( @AdminScoped @RequestMapping(method = GET, value = "/{id}") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "Get policy by id", response = Policy.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Get policy by id")}) @JsonView(Views.REST.class) public @ResponseBody Policy getPolicy( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { return policyService.getById(id); @@ -79,51 +84,51 @@ public PolicyController( @AdminScoped @RequestMapping(method = GET, value = "") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = Fields.ID, required = false, - dataType = "string", - paramType = "query", - value = "Search for ids containing this text"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Search for ids containing this text"), + @Parameter( name = Fields.NAME, required = false, - dataType = "string", - paramType = "query", - value = "Search for policies whose names contain this text"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Search for policies whose names contain this text"), + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page Policies")}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Page Policies")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO listPolicies( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { return new PageDTO<>(policyService.listPolicies(filters, pageable)); } @@ -131,10 +136,10 @@ public PolicyController( @RequestMapping(method = POST, value = "") @ApiResponses( value = { - @ApiResponse(code = 200, message = "New Policy", response = Policy.class), + @ApiResponse(responseCode = "200", description = "New Policy"), }) public @ResponseBody Policy createPolicy( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestBody(required = true) PolicyRequest createRequest) { return policyService.create(createRequest); @@ -142,10 +147,9 @@ public PolicyController( @AdminScoped @RequestMapping(method = PUT, value = "/{id}") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "Updated Policy", response = Policy.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Updated Policy")}) public @ResponseBody Policy updatePolicy( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id") UUID id, @RequestBody(required = true) PolicyRequest updatedRequst) { @@ -156,7 +160,7 @@ public PolicyController( @RequestMapping(method = DELETE, value = "/{id}") @ResponseStatus(value = HttpStatus.OK) public void deletePolicy( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { policyService.delete(id); @@ -165,10 +169,15 @@ public void deletePolicy( @AdminScoped @RequestMapping(method = POST, value = "/{id}/permission/group/{group_id}") @ApiResponses( - value = {@ApiResponse(code = 200, message = "Add group permission", response = String.class)}) + value = { + @ApiResponse( + responseCode = "200", + description = "Add group permission", + content = @Content(schema = @Schema(implementation = String.class))) + }) @JsonView(Views.REST.class) public @ResponseBody Group createGroupPermission( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "group_id", required = true) UUID groupId, @@ -180,14 +189,9 @@ public void deletePolicy( @AdminScoped @RequestMapping(method = DELETE, value = "/{id}/permission/group/{group_id}") @ApiResponses( - value = { - @ApiResponse( - code = 200, - message = "Delete group permission", - response = GenericResponse.class) - }) + value = {@ApiResponse(responseCode = "200", description = "Delete group permission")}) public @ResponseBody GenericResponse deleteGroupPermission( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "group_id", required = true) UUID groupId) { @@ -198,9 +202,14 @@ public void deletePolicy( @AdminScoped @RequestMapping(method = POST, value = "/{id}/permission/user/{user_id}") @ApiResponses( - value = {@ApiResponse(code = 200, message = "Add user permission", response = String.class)}) + value = { + @ApiResponse( + responseCode = "200", + description = "Add user permission", + content = @Content(schema = @Schema(implementation = String.class))) + }) public @ResponseBody User createUserPermission( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "user_id", required = true) UUID userId, @@ -212,14 +221,9 @@ public void deletePolicy( @AdminScoped @RequestMapping(method = DELETE, value = "/{id}/permission/user/{user_id}") @ApiResponses( - value = { - @ApiResponse( - code = 200, - message = "Delete group permission", - response = GenericResponse.class) - }) + value = {@ApiResponse(responseCode = "200", description = "Delete group permission")}) public @ResponseBody GenericResponse deleteUserPermission( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "user_id", required = true) UUID userId) { @@ -232,10 +236,13 @@ public void deletePolicy( @RequestMapping(method = POST, value = "/{id}/permission/application/{application_id}") @ApiResponses( value = { - @ApiResponse(code = 200, message = "Add application permission", response = String.class) + @ApiResponse( + responseCode = "200", + description = "Add application permission", + content = @Content(schema = @Schema(implementation = String.class))) }) public @ResponseBody Application createApplicationPermission( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "application_id", required = true) UUID applicationId, @@ -247,14 +254,9 @@ public void deletePolicy( @AdminScoped @RequestMapping(method = DELETE, value = "/{id}/permission/application/{application_id}") @ApiResponses( - value = { - @ApiResponse( - code = 200, - message = "Delete application permission", - response = GenericResponse.class) - }) + value = {@ApiResponse(responseCode = "200", description = "Delete application permission")}) public @ResponseBody GenericResponse deleteApplicationPermission( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "application_id", required = true) UUID applicationId) { @@ -265,49 +267,51 @@ public void deletePolicy( @AdminScoped @RequestMapping(method = GET, value = "/{id}/users") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC. Note: ascending sort order for the mask field is: READ,WRITE,DENY"), }) @ApiResponses( value = { @ApiResponse( - code = 200, - message = "Get list of user ids with given policy id", - response = String.class) + responseCode = "200", + description = "Get list of user ids with given policy id", + content = @Content(schema = @Schema(implementation = String.class))) }) public @ResponseBody PageDTO findUserIds( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, - @ApiParam(value = "Query string compares to AccessLevel and user Id field.", required = false) + @Parameter( + description = "Query string compares to AccessLevel and user Id field.", + required = false) @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { val decoratedPageable = new IgnoreCaseSortDecorator(pageable); if (isEmpty(query)) { return new PageDTO<>( @@ -320,51 +324,51 @@ public void deletePolicy( @AdminScoped @RequestMapping(method = GET, value = "/{id}/groups") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC. Note: ascending sort order for the mask field is: READ,WRITE,DENY"), }) @ApiResponses( value = { @ApiResponse( - code = 200, - message = "Get list of group ids with given policy id", - response = String.class) + responseCode = "200", + description = "Get list of group ids with given policy id", + content = @Content(schema = @Schema(implementation = String.class))) }) public @ResponseBody PageDTO findGroupIds( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, - @ApiParam( - value = "Query string compares to AccessLevel and group Id and Name fields.", + @Parameter( + description = "Query string compares to AccessLevel and group Id and Name fields.", required = false) @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { val decoratedPageable = new IgnoreCaseSortDecorator(pageable); if (isEmpty(query)) { return new PageDTO( @@ -378,51 +382,52 @@ public void deletePolicy( @AdminScoped @RequestMapping(method = GET, value = "/{id}/applications") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC. Note: ascending sort order for the mask field is: READ,WRITE,DENY"), }) @ApiResponses( value = { @ApiResponse( - code = 200, - message = "Get list of application ids with given policy id", - response = String.class) + responseCode = "200", + description = "Get list of application ids with given policy id", + content = @Content(schema = @Schema(implementation = String.class))) }) public @ResponseBody PageDTO findApplicationIds( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, - @ApiParam( - value = "Query string compares to AccessLevel and Application Id and Name fields.", + @Parameter( + description = + "Query string compares to AccessLevel and Application Id and Name fields.", required = false) @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { val decoratedPageable = new IgnoreCaseSortDecorator(pageable); if (isEmpty(query)) { return new PageDTO( diff --git a/src/main/java/bio/overture/ego/controller/TransactionController.java b/src/main/java/bio/overture/ego/controller/TransactionController.java index 435b15925..14e635151 100644 --- a/src/main/java/bio/overture/ego/controller/TransactionController.java +++ b/src/main/java/bio/overture/ego/controller/TransactionController.java @@ -33,11 +33,11 @@ import bio.overture.ego.service.GroupService; import bio.overture.ego.service.PolicyService; import com.google.common.collect.ImmutableList; -import io.swagger.annotations.Api; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; import java.util.Optional; import java.util.UUID; -import javax.servlet.http.HttpServletRequest; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -52,7 +52,7 @@ @RestController @Transactional @RequestMapping("/transaction") -@Api(tags = "Transactions") +@Tag(name = "Transactions") public class TransactionController { PolicyService policyService; GroupService groupService; diff --git a/src/main/java/bio/overture/ego/controller/UserController.java b/src/main/java/bio/overture/ego/controller/UserController.java index 7152047d0..22b8e55a5 100644 --- a/src/main/java/bio/overture/ego/controller/UserController.java +++ b/src/main/java/bio/overture/ego/controller/UserController.java @@ -31,12 +31,13 @@ import bio.overture.ego.service.*; import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.Collection; import java.util.List; import java.util.UUID; @@ -54,12 +55,11 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; -import springfox.documentation.annotations.ApiIgnore; @Slf4j @RestController @RequestMapping("/users") -@Api(tags = "Users") +@Tag(name = "Users") public class UserController { /** Dependencies */ @@ -83,51 +83,51 @@ public UserController( @AdminScoped @RequestMapping(method = RequestMethod.GET, value = "") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = Fields.ID, required = false, - dataType = "string", - paramType = "query", - value = "Search for ids containing this text"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Search for ids containing this text"), + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page Users")}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Page Users")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO listUsers( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, - @ApiParam( - value = + @Parameter( + description = "Query string compares to Users Email, First Name, Last Name, Status and ProviderType fields.", required = false) @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { if (isEmpty(query)) { return new PageDTO<>(userService.listUsers(filters, pageable)); } else { @@ -137,10 +137,10 @@ public UserController( @AdminScoped @RequestMapping(method = RequestMethod.GET, value = "/{id}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "User Details", response = User.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "User Details")}) @JsonView(Views.REST.class) public @ResponseBody User getUser( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { return userService.getById(id); @@ -151,12 +151,11 @@ public UserController( @ApiResponses( value = { @ApiResponse( - code = 200, - message = "Partially update using non-null user info", - response = User.class) + responseCode = "200", + description = "Partially update using non-null user info") }) public @ResponseBody User updateUser( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) UpdateUserRequest updateUserRequest) { @@ -167,7 +166,7 @@ public UserController( @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") @ResponseStatus(value = HttpStatus.OK) public void deleteUser( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { userService.delete(id); @@ -178,48 +177,50 @@ public void deleteUser( */ @AdminScoped @RequestMapping(method = RequestMethod.GET, value = "/{id}/permissions") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page User Permissions for a User")}) + @ApiResponses( + value = { + @ApiResponse(responseCode = "200", description = "Page User Permissions for a User") + }) @JsonView(Views.REST.class) public @ResponseBody PageDTO getPermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) Pageable pageable) { return new PageDTO<>(userPermissionService.getPermissions(id, pageable)); } @AdminScoped @RequestMapping(method = RequestMethod.POST, value = "/{id}/permissions") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "Add user permissions", response = User.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Add user permissions")}) public @ResponseBody User addPermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) List permissions) { @@ -228,10 +229,11 @@ public void deleteUser( @AdminScoped @RequestMapping(method = RequestMethod.DELETE, value = "/{id}/permissions/{permissionIds}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Delete User permissions")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Delete User permissions")}) @ResponseStatus(value = HttpStatus.OK) public void deletePermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "permissionIds", required = true) List permissionIds) { @@ -243,12 +245,12 @@ public void deletePermissions( @ApiResponses( value = { @ApiResponse( - code = 200, - message = "Get effective permissions for a user with user and group permissions") + responseCode = "200", + description = "Get effective permissions for a user with user and group permissions") }) @ResponseStatus(value = HttpStatus.OK) public @ResponseBody Collection getResolvedPermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { return userPermissionService.getResolvedPermissions(id); @@ -259,47 +261,48 @@ public void deletePermissions( */ @AdminScoped @RequestMapping(method = RequestMethod.GET, value = "/{id}/groups") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = Fields.ID, required = true, - dataType = "string", - paramType = "path", - value = "Search for ids containing this text"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Search for ids containing this text"), + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page Groups for a User")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Page Groups for a User")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO getGroupsFromUser( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { if (isEmpty(query)) { return new PageDTO<>(groupService.findGroupsForUser(id, filters, pageable)); } else { @@ -309,10 +312,9 @@ public void deletePermissions( @AdminScoped @RequestMapping(method = RequestMethod.POST, value = "/{id}/groups") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "Add Groups to user", response = User.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Add Groups to user")}) public @ResponseBody User addGroupsToUser( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) List groupIds) { @@ -321,10 +323,11 @@ public void deletePermissions( @AdminScoped @RequestMapping(method = RequestMethod.DELETE, value = "/{id}/groups/{groupIDs}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Delete Groups from User")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Delete Groups from User")}) @ResponseStatus(value = HttpStatus.OK) public void deleteGroupsFromUser( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "groupIDs", required = true) List groupIds) { @@ -336,47 +339,48 @@ public void deleteGroupsFromUser( */ @AdminScoped @RequestMapping(method = RequestMethod.GET, value = "/{id}/applications") - @ApiImplicitParams({ - @ApiImplicitParam( + @Parameters({ + @Parameter( name = Fields.ID, required = true, - dataType = "string", - paramType = "path", - value = "Search for ids containing this text"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Search for ids containing this text"), + @Parameter( name = LIMIT, required = false, - dataType = "string", - paramType = "query", - value = "Number of results to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Number of results to retrieve"), + @Parameter( name = OFFSET, required = false, - dataType = "string", - paramType = "query", - value = "Index of first result to retrieve"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Index of first result to retrieve"), + @Parameter( name = SORT, required = false, - dataType = "string", - paramType = "query", - value = "Field to sort on"), - @ApiImplicitParam( + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Field to sort on"), + @Parameter( name = SORTORDER, required = false, - dataType = "string", - paramType = "query", - value = "Sorting order: ASC|DESC. Default order: DESC"), + schema = @Schema(type = "string"), + in = ParameterIn.QUERY, + description = "Sorting order: ASC|DESC. Default order: DESC"), }) - @ApiResponses(value = {@ApiResponse(code = 200, message = "Page Applications for a User")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Page Applications for a User")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO getApplicationsFromUser( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestParam(value = "query", required = false) String query, - @ApiIgnore @Filters List filters, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) @Filters List filters, + @Parameter(hidden = true) Pageable pageable) { if (isEmpty(query)) { return new PageDTO<>(applicationService.findApplicationsForUser(id, filters, pageable)); } else { @@ -388,11 +392,9 @@ public void deleteGroupsFromUser( @AdminScoped @RequestMapping(method = RequestMethod.POST, value = "/{id}/applications") @ApiResponses( - value = { - @ApiResponse(code = 200, message = "Add Applications to User", response = User.class) - }) + value = {@ApiResponse(responseCode = "200", description = "Add Applications to User")}) public @ResponseBody User addApplicationsToUser( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) List applicationIds) { @@ -401,10 +403,11 @@ public void deleteGroupsFromUser( @AdminScoped @RequestMapping(method = RequestMethod.DELETE, value = "/{id}/applications/{applicationIds}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Delete Applications from User")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Delete Applications from User")}) @ResponseStatus(value = HttpStatus.OK) public void deleteApplicationsFromUser( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @PathVariable(value = "applicationIds", required = true) List applicationIds) { diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java index 53983a94a..647defcc0 100644 --- a/src/main/java/bio/overture/ego/controller/VisaController.java +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -1,6 +1,5 @@ package bio.overture.ego.controller; -import static bio.overture.ego.controller.resolver.PageableResolver.*; import static org.springframework.web.bind.annotation.RequestMethod.*; import bio.overture.ego.model.dto.*; @@ -9,7 +8,10 @@ import bio.overture.ego.service.*; import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; -import io.swagger.annotations.*; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.UUID; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; @@ -17,12 +19,11 @@ import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; @Slf4j @RestController @RequestMapping("/visa") -@Api(tags = "Visa") +@Tag(name = "Visa") public class VisaController { /** Dependencies */ @@ -51,11 +52,10 @@ public VisaController( */ @AdminScoped @RequestMapping(method = GET, value = "/{id}") - @ApiResponses( - value = {@ApiResponse(code = 200, message = "Get Visa by id", response = Visa.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Get Visa by id")}) @JsonView(Views.REST.class) public @ResponseBody Visa getVisa( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { return visaService.getById(id); @@ -63,12 +63,12 @@ public VisaController( @AdminScoped @RequestMapping(method = GET, value = "") - @ApiResponses(value = {@ApiResponse(code = 200, message = "All Visas")}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "All Visas")}) @JsonView(Views.REST.class) public @ResponseBody PageDTO listVisa( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, - @ApiIgnore Pageable pageable) { + @Parameter(hidden = true) Pageable pageable) { return new PageDTO<>(visaService.listVisa(pageable)); } @@ -76,10 +76,10 @@ public VisaController( @RequestMapping(method = POST, value = "") @ApiResponses( value = { - @ApiResponse(code = 200, message = "New Visa", response = Visa.class), + @ApiResponse(responseCode = "200", description = "New Visa"), }) public @ResponseBody Visa createVisa( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestBody(required = true) VisaRequest visaRequest) { return visaService.create(visaRequest); @@ -87,9 +87,9 @@ public VisaController( @AdminScoped @RequestMapping(method = PUT, value = "/{id}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Update Visa", response = Visa.class)}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Update Visa")}) public @ResponseBody Visa updateVisa( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id, @RequestBody(required = true) VisaRequest visaRequest) { @@ -100,7 +100,7 @@ public VisaController( @RequestMapping(method = DELETE, value = "/{id}") @ResponseStatus(value = HttpStatus.OK) public void deleteVisa( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { visaService.delete(id); diff --git a/src/main/java/bio/overture/ego/model/dto/CreateApplicationRequest.java b/src/main/java/bio/overture/ego/model/dto/CreateApplicationRequest.java index 62387df73..a03c92c6f 100644 --- a/src/main/java/bio/overture/ego/model/dto/CreateApplicationRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/CreateApplicationRequest.java @@ -18,7 +18,7 @@ import bio.overture.ego.model.enums.ApplicationType; import bio.overture.ego.model.enums.StatusType; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/dto/CreateTokenRequest.java b/src/main/java/bio/overture/ego/model/dto/CreateTokenRequest.java index e9e19c360..1d8828065 100644 --- a/src/main/java/bio/overture/ego/model/dto/CreateTokenRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/CreateTokenRequest.java @@ -1,7 +1,7 @@ package bio.overture.ego.model.dto; +import jakarta.validation.constraints.NotNull; import java.util.Date; -import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/dto/CreateUserRequest.java b/src/main/java/bio/overture/ego/model/dto/CreateUserRequest.java index fba667fab..f0ffc790a 100644 --- a/src/main/java/bio/overture/ego/model/dto/CreateUserRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/CreateUserRequest.java @@ -20,7 +20,7 @@ import bio.overture.ego.model.enums.ProviderType; import bio.overture.ego.model.enums.StatusType; import bio.overture.ego.model.enums.UserType; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/dto/GroupRequest.java b/src/main/java/bio/overture/ego/model/dto/GroupRequest.java index 25124e102..37af37ad7 100644 --- a/src/main/java/bio/overture/ego/model/dto/GroupRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/GroupRequest.java @@ -17,7 +17,7 @@ package bio.overture.ego.model.dto; import bio.overture.ego.model.enums.StatusType; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/dto/MaskDTO.java b/src/main/java/bio/overture/ego/model/dto/MaskDTO.java index 92c6dcdac..21f30ce50 100644 --- a/src/main/java/bio/overture/ego/model/dto/MaskDTO.java +++ b/src/main/java/bio/overture/ego/model/dto/MaskDTO.java @@ -1,7 +1,7 @@ package bio.overture.ego.model.dto; import bio.overture.ego.model.enums.AccessLevel; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/dto/PermissionRequest.java b/src/main/java/bio/overture/ego/model/dto/PermissionRequest.java index 2baf41782..321671107 100644 --- a/src/main/java/bio/overture/ego/model/dto/PermissionRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/PermissionRequest.java @@ -1,8 +1,8 @@ package bio.overture.ego.model.dto; import bio.overture.ego.model.enums.AccessLevel; +import jakarta.validation.constraints.NotNull; import java.util.UUID; -import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/dto/PolicyRequest.java b/src/main/java/bio/overture/ego/model/dto/PolicyRequest.java index e5ce8a4e9..96be27804 100644 --- a/src/main/java/bio/overture/ego/model/dto/PolicyRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/PolicyRequest.java @@ -1,7 +1,7 @@ package bio.overture.ego.model.dto; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/dto/VisaRequest.java b/src/main/java/bio/overture/ego/model/dto/VisaRequest.java index 6225d995a..d903df140 100644 --- a/src/main/java/bio/overture/ego/model/dto/VisaRequest.java +++ b/src/main/java/bio/overture/ego/model/dto/VisaRequest.java @@ -1,6 +1,6 @@ package bio.overture.ego.model.dto; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/entity/AbstractPermission.java b/src/main/java/bio/overture/ego/model/entity/AbstractPermission.java index 971d99f6f..d0d30f87d 100644 --- a/src/main/java/bio/overture/ego/model/entity/AbstractPermission.java +++ b/src/main/java/bio/overture/ego/model/entity/AbstractPermission.java @@ -1,38 +1,34 @@ package bio.overture.ego.model.entity; -import static bio.overture.ego.model.enums.AccessLevel.EGO_ACCESS_LEVEL_ENUM; - import bio.overture.ego.model.enums.AccessLevel; import bio.overture.ego.model.enums.JavaFields; import bio.overture.ego.model.enums.SqlFields; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType; +import jakarta.persistence.Column; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MappedSuperclass; +import jakarta.validation.constraints.NotNull; import java.util.UUID; -import javax.persistence.Column; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MappedSuperclass; -import javax.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import lombok.experimental.FieldNameConstants; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; @Data @MappedSuperclass @FieldNameConstants @EqualsAndHashCode(of = {"id"}) @ToString(exclude = {"policy"}) -@TypeDef(name = EGO_ACCESS_LEVEL_ENUM, typeClass = PostgreSQLEnumType.class) @JsonPropertyOrder({JavaFields.ID, JavaFields.POLICY, JavaFields.OWNER, JavaFields.ACCESS_LEVEL}) @JsonSubTypes({ @JsonSubTypes.Type(value = UserPermission.class, name = JavaFields.USERPERMISSIONS), @@ -54,7 +50,7 @@ public abstract class AbstractPermission> @NotNull @Column(name = SqlFields.ACCESS_LEVEL, nullable = false) @Enumerated(EnumType.STRING) - @Type(type = EGO_ACCESS_LEVEL_ENUM) + @Type(PostgreSQLEnumType.class) private AccessLevel accessLevel; public abstract O getOwner(); diff --git a/src/main/java/bio/overture/ego/model/entity/ApiKey.java b/src/main/java/bio/overture/ego/model/entity/ApiKey.java index bc048d670..2f7ad0a4b 100644 --- a/src/main/java/bio/overture/ego/model/entity/ApiKey.java +++ b/src/main/java/bio/overture/ego/model/entity/ApiKey.java @@ -8,18 +8,18 @@ import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; import java.util.*; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/entity/ApiKeyScope.java b/src/main/java/bio/overture/ego/model/entity/ApiKeyScope.java index 0e8edba40..4aa35225c 100644 --- a/src/main/java/bio/overture/ego/model/entity/ApiKeyScope.java +++ b/src/main/java/bio/overture/ego/model/entity/ApiKeyScope.java @@ -1,35 +1,31 @@ package bio.overture.ego.model.entity; -import static bio.overture.ego.model.enums.AccessLevel.EGO_ACCESS_LEVEL_ENUM; - import bio.overture.ego.model.enums.AccessLevel; import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; import com.fasterxml.jackson.annotation.JsonIgnore; import com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; // TODO: rename TOKENSCOPE to API_KEY_SCOPE [anncatton] @NoArgsConstructor @AllArgsConstructor @Data @Entity -@TypeDef(name = EGO_ACCESS_LEVEL_ENUM, typeClass = PostgreSQLEnumType.class) @Table(name = Tables.TOKENSCOPE) public class ApiKeyScope implements Serializable { @@ -51,7 +47,7 @@ public class ApiKeyScope implements Serializable { @NotNull @Enumerated(EnumType.STRING) - @Type(type = EGO_ACCESS_LEVEL_ENUM) + @Type(PostgreSQLEnumType.class) @Column(name = SqlFields.ACCESS_LEVEL, nullable = false) private AccessLevel accessLevel; diff --git a/src/main/java/bio/overture/ego/model/entity/Application.java b/src/main/java/bio/overture/ego/model/entity/Application.java index d1a1044f8..b5f685f15 100644 --- a/src/main/java/bio/overture/ego/model/entity/Application.java +++ b/src/main/java/bio/overture/ego/model/entity/Application.java @@ -16,7 +16,6 @@ package bio.overture.ego.model.entity; -import static bio.overture.ego.model.enums.AccessLevel.EGO_ENUM; import static com.google.common.collect.Sets.newHashSet; import bio.overture.ego.model.enums.ApplicationType; @@ -32,19 +31,19 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonView; import com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; import java.util.Set; import java.util.UUID; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -55,7 +54,6 @@ import lombok.experimental.FieldNameConstants; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; @Entity @Table(name = Tables.APPLICATION) @@ -79,8 +77,6 @@ @NoArgsConstructor @JsonView(Views.REST.class) @FieldNameConstants -@TypeDef(name = "application_type_enum", typeClass = PostgreSQLEnumType.class) -@TypeDef(name = EGO_ENUM, typeClass = PostgreSQLEnumType.class) @JsonInclude(JsonInclude.Include.CUSTOM) public class Application implements PolicyOwner, NameableEntity { @@ -96,7 +92,7 @@ public class Application implements PolicyOwner, NameableEntity { private String name; @NotNull - @Type(type = EGO_ENUM) + @Type(PostgreSQLEnumType.class) @Enumerated(EnumType.STRING) @Column(name = SqlFields.TYPE, nullable = false) @JsonView({Views.JWTAccessToken.class, Views.REST.class}) @@ -124,7 +120,7 @@ public class Application implements PolicyOwner, NameableEntity { private String errorRedirectUri; @NotNull - @Type(type = EGO_ENUM) + @Type(PostgreSQLEnumType.class) @Enumerated(EnumType.STRING) @JsonView({Views.JWTAccessToken.class, Views.REST.class}) @Column(name = SqlFields.STATUS, nullable = false) diff --git a/src/main/java/bio/overture/ego/model/entity/ApplicationPermission.java b/src/main/java/bio/overture/ego/model/entity/ApplicationPermission.java index 47d89ac6d..37f6d8e48 100644 --- a/src/main/java/bio/overture/ego/model/entity/ApplicationPermission.java +++ b/src/main/java/bio/overture/ego/model/entity/ApplicationPermission.java @@ -5,7 +5,7 @@ import bio.overture.ego.model.enums.Tables; import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; -import javax.persistence.*; +import jakarta.persistence.*; import lombok.*; import lombok.experimental.FieldNameConstants; diff --git a/src/main/java/bio/overture/ego/model/entity/DefaultProvider.java b/src/main/java/bio/overture/ego/model/entity/DefaultProvider.java index da1216217..f8db8487e 100644 --- a/src/main/java/bio/overture/ego/model/entity/DefaultProvider.java +++ b/src/main/java/bio/overture/ego/model/entity/DefaultProvider.java @@ -1,11 +1,10 @@ package bio.overture.ego.model.entity; -import static bio.overture.ego.model.enums.AccessLevel.EGO_ENUM; - import bio.overture.ego.model.enums.ProviderType; import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; -import javax.persistence.*; +import com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType; +import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.Type; @@ -19,7 +18,7 @@ public class DefaultProvider implements Identifiable { @Id @Column(name = SqlFields.ID, nullable = false) - @Type(type = EGO_ENUM) + @Type(PostgreSQLEnumType.class) @Enumerated(EnumType.STRING) private ProviderType id; } diff --git a/src/main/java/bio/overture/ego/model/entity/Group.java b/src/main/java/bio/overture/ego/model/entity/Group.java index e81fbd6e0..0ad549d21 100644 --- a/src/main/java/bio/overture/ego/model/entity/Group.java +++ b/src/main/java/bio/overture/ego/model/entity/Group.java @@ -16,7 +16,6 @@ package bio.overture.ego.model.entity; -import static bio.overture.ego.model.enums.AccessLevel.EGO_ENUM; import static com.google.common.collect.Sets.newHashSet; import bio.overture.ego.model.enums.JavaFields; @@ -30,19 +29,19 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonView; import com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; import java.util.Set; import java.util.UUID; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -51,7 +50,6 @@ import lombok.ToString; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; @Data @Entity @@ -61,7 +59,6 @@ @Table(name = Tables.GROUP) @JsonView(Views.REST.class) @EqualsAndHashCode(of = "id") -@TypeDef(name = EGO_ENUM, typeClass = PostgreSQLEnumType.class) @ToString(exclude = {"userGroups", "groupApplications", "permissions"}) @JsonPropertyOrder({ JavaFields.ID, @@ -87,7 +84,7 @@ public class Group implements PolicyOwner, NameableEntity { private String description; @NotNull - @Type(type = EGO_ENUM) + @Type(PostgreSQLEnumType.class) @Enumerated(EnumType.STRING) @Column(name = SqlFields.STATUS, nullable = false) private StatusType status; diff --git a/src/main/java/bio/overture/ego/model/entity/GroupPermission.java b/src/main/java/bio/overture/ego/model/entity/GroupPermission.java index 83bf7d919..ec1551ce5 100644 --- a/src/main/java/bio/overture/ego/model/entity/GroupPermission.java +++ b/src/main/java/bio/overture/ego/model/entity/GroupPermission.java @@ -6,13 +6,13 @@ import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonView; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedAttributeNode; -import javax.persistence.NamedEntityGraph; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedAttributeNode; +import jakarta.persistence.NamedEntityGraph; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/bio/overture/ego/model/entity/InitTripWire.java b/src/main/java/bio/overture/ego/model/entity/InitTripWire.java index 22ef4ad28..f736a6973 100644 --- a/src/main/java/bio/overture/ego/model/entity/InitTripWire.java +++ b/src/main/java/bio/overture/ego/model/entity/InitTripWire.java @@ -2,10 +2,10 @@ import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/entity/Policy.java b/src/main/java/bio/overture/ego/model/entity/Policy.java index dd11c17fd..32347191a 100644 --- a/src/main/java/bio/overture/ego/model/entity/Policy.java +++ b/src/main/java/bio/overture/ego/model/entity/Policy.java @@ -10,20 +10,20 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonView; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.NamedAttributeNode; +import jakarta.persistence.NamedEntityGraph; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; import java.util.Set; import java.util.UUID; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.NamedAttributeNode; -import javax.persistence.NamedEntityGraph; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/entity/RefreshToken.java b/src/main/java/bio/overture/ego/model/entity/RefreshToken.java index 1470d32e2..dc63d7d2b 100644 --- a/src/main/java/bio/overture/ego/model/entity/RefreshToken.java +++ b/src/main/java/bio/overture/ego/model/entity/RefreshToken.java @@ -3,9 +3,9 @@ import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; import java.util.*; -import javax.persistence.*; -import javax.validation.constraints.NotNull; import lombok.*; import lombok.experimental.FieldNameConstants; import org.hibernate.annotations.GenericGenerator; diff --git a/src/main/java/bio/overture/ego/model/entity/User.java b/src/main/java/bio/overture/ego/model/entity/User.java index cc1ea6148..88f5d7fe8 100644 --- a/src/main/java/bio/overture/ego/model/entity/User.java +++ b/src/main/java/bio/overture/ego/model/entity/User.java @@ -17,7 +17,6 @@ package bio.overture.ego.model.entity; import static bio.overture.ego.grpc.ProtoUtils.toProtoString; -import static bio.overture.ego.model.enums.AccessLevel.EGO_ENUM; import static bio.overture.ego.service.UserService.resolveUsersPermissions; import static bio.overture.ego.utils.CollectionUtils.mapToImmutableSet; import static bio.overture.ego.utils.PolicyPermissionUtils.extractPermissionStrings; @@ -34,11 +33,11 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonView; import com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; -import javax.persistence.*; -import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -51,7 +50,6 @@ import org.hibernate.LazyInitializationException; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; -import org.hibernate.annotations.TypeDef; @Slf4j @Entity @@ -83,7 +81,6 @@ @AllArgsConstructor @NoArgsConstructor @JsonView(Views.REST.class) -@TypeDef(name = EGO_ENUM, typeClass = PostgreSQLEnumType.class) @FieldNameConstants public class User implements PolicyOwner, Identifiable { @@ -99,14 +96,14 @@ public class User implements PolicyOwner, Identifiable { private String email; @NotNull - @Type(type = EGO_ENUM) + @Type(PostgreSQLEnumType.class) @Enumerated(EnumType.STRING) @Column(name = SqlFields.TYPE, nullable = false) @JsonView({Views.JWTAccessToken.class, Views.REST.class}) private UserType type; @NotNull - @Type(type = EGO_ENUM) + @Type(PostgreSQLEnumType.class) @Enumerated(EnumType.STRING) @JsonView({Views.JWTAccessToken.class, Views.REST.class}) @Column(name = SqlFields.STATUS, nullable = false) @@ -133,14 +130,14 @@ public class User implements PolicyOwner, Identifiable { @Temporal(value = TemporalType.TIMESTAMP) private Date lastLogin; - @Type(type = EGO_ENUM) + @Type(PostgreSQLEnumType.class) @Enumerated(EnumType.STRING) @Column(name = SqlFields.PREFERREDLANGUAGE) @JsonView({Views.JWTAccessToken.class, Views.REST.class}) private LanguageType preferredLanguage; @NotNull - @Type(type = EGO_ENUM) + @Type(PostgreSQLEnumType.class) @Enumerated(EnumType.STRING) @Column(name = SqlFields.PROVIDERTYPE, nullable = false) @JsonView({Views.JWTAccessToken.class, Views.REST.class}) diff --git a/src/main/java/bio/overture/ego/model/entity/UserPermission.java b/src/main/java/bio/overture/ego/model/entity/UserPermission.java index 7a3f37c61..0628faa31 100644 --- a/src/main/java/bio/overture/ego/model/entity/UserPermission.java +++ b/src/main/java/bio/overture/ego/model/entity/UserPermission.java @@ -5,13 +5,13 @@ import bio.overture.ego.model.enums.Tables; import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedAttributeNode; -import javax.persistence.NamedEntityGraph; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedAttributeNode; +import jakarta.persistence.NamedEntityGraph; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/entity/Visa.java b/src/main/java/bio/overture/ego/model/entity/Visa.java index 403b16849..f44a20af2 100644 --- a/src/main/java/bio/overture/ego/model/entity/Visa.java +++ b/src/main/java/bio/overture/ego/model/entity/Visa.java @@ -10,10 +10,10 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonView; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; import java.util.Set; import java.util.UUID; -import javax.persistence.*; -import javax.validation.constraints.NotNull; import lombok.*; import lombok.experimental.FieldNameConstants; import org.hibernate.annotations.GenericGenerator; diff --git a/src/main/java/bio/overture/ego/model/entity/VisaPermission.java b/src/main/java/bio/overture/ego/model/entity/VisaPermission.java index e441e5962..67223b63c 100644 --- a/src/main/java/bio/overture/ego/model/entity/VisaPermission.java +++ b/src/main/java/bio/overture/ego/model/entity/VisaPermission.java @@ -1,16 +1,16 @@ package bio.overture.ego.model.entity; -import static bio.overture.ego.model.enums.AccessLevel.EGO_ACCESS_LEVEL_ENUM; import bio.overture.ego.model.enums.AccessLevel; import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; +import com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; import java.util.Collection; import java.util.UUID; -import javax.persistence.*; -import javax.validation.constraints.NotNull; import lombok.*; import lombok.experimental.FieldNameConstants; import org.hibernate.annotations.GenericGenerator; @@ -42,7 +42,7 @@ public class VisaPermission extends AbstractPermission { @NotNull @Column(name = SqlFields.MASK, nullable = false) @Enumerated(EnumType.STRING) - @Type(type = EGO_ACCESS_LEVEL_ENUM) + @Type(value = PostgreSQLEnumType.class) private AccessLevel mask; @ManyToMany diff --git a/src/main/java/bio/overture/ego/model/exceptions/ExceptionHandlers.java b/src/main/java/bio/overture/ego/model/exceptions/ExceptionHandlers.java index 20835a1c5..0e80a20d0 100644 --- a/src/main/java/bio/overture/ego/model/exceptions/ExceptionHandlers.java +++ b/src/main/java/bio/overture/ego/model/exceptions/ExceptionHandlers.java @@ -5,10 +5,10 @@ import static org.springframework.http.HttpStatus.NOT_FOUND; import bio.overture.ego.utils.Joiners; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.ConstraintViolationException; import java.util.Date; import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.springframework.http.HttpHeaders; diff --git a/src/main/java/bio/overture/ego/model/exceptions/RequestValidationException.java b/src/main/java/bio/overture/ego/model/exceptions/RequestValidationException.java index 0a86301f2..0519cbe2d 100644 --- a/src/main/java/bio/overture/ego/model/exceptions/RequestValidationException.java +++ b/src/main/java/bio/overture/ego/model/exceptions/RequestValidationException.java @@ -5,8 +5,8 @@ import static java.lang.String.format; import static org.springframework.http.HttpStatus.BAD_REQUEST; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import lombok.NonNull; import lombok.val; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/src/main/java/bio/overture/ego/model/exceptions/RequestViolation.java b/src/main/java/bio/overture/ego/model/exceptions/RequestViolation.java index c9eb2f850..9f9182837 100644 --- a/src/main/java/bio/overture/ego/model/exceptions/RequestViolation.java +++ b/src/main/java/bio/overture/ego/model/exceptions/RequestViolation.java @@ -1,6 +1,6 @@ package bio.overture.ego.model.exceptions; -import javax.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolation; import lombok.Builder; import lombok.NonNull; import lombok.Value; diff --git a/src/main/java/bio/overture/ego/model/exceptions/SSOAuthenticationFailureHandler.java b/src/main/java/bio/overture/ego/model/exceptions/SSOAuthenticationFailureHandler.java index d35121741..7dab5dd89 100644 --- a/src/main/java/bio/overture/ego/model/exceptions/SSOAuthenticationFailureHandler.java +++ b/src/main/java/bio/overture/ego/model/exceptions/SSOAuthenticationFailureHandler.java @@ -6,11 +6,11 @@ import bio.overture.ego.model.enums.ProviderType; import bio.overture.ego.service.ApplicationService; import bio.overture.ego.utils.Redirects; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URISyntaxException; import java.util.ArrayList; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/model/join/GroupApplication.java b/src/main/java/bio/overture/ego/model/join/GroupApplication.java index 0b49e4e3d..99fb1ca13 100644 --- a/src/main/java/bio/overture/ego/model/join/GroupApplication.java +++ b/src/main/java/bio/overture/ego/model/join/GroupApplication.java @@ -6,14 +6,14 @@ import bio.overture.ego.model.enums.JavaFields; import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; -import javax.persistence.CascadeType; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MapsId; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/join/GroupApplicationId.java b/src/main/java/bio/overture/ego/model/join/GroupApplicationId.java index c7e5ab2bc..aa5144d93 100644 --- a/src/main/java/bio/overture/ego/model/join/GroupApplicationId.java +++ b/src/main/java/bio/overture/ego/model/join/GroupApplicationId.java @@ -1,10 +1,10 @@ package bio.overture.ego.model.join; import bio.overture.ego.model.enums.SqlFields; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import java.io.Serializable; import java.util.UUID; -import javax.persistence.Column; -import javax.persistence.Embeddable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/join/UserApplication.java b/src/main/java/bio/overture/ego/model/join/UserApplication.java index f6b5f6b6a..63ec91e3e 100644 --- a/src/main/java/bio/overture/ego/model/join/UserApplication.java +++ b/src/main/java/bio/overture/ego/model/join/UserApplication.java @@ -6,14 +6,14 @@ import bio.overture.ego.model.enums.JavaFields; import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; -import javax.persistence.CascadeType; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MapsId; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/join/UserApplicationId.java b/src/main/java/bio/overture/ego/model/join/UserApplicationId.java index 22b942273..cae1172f0 100644 --- a/src/main/java/bio/overture/ego/model/join/UserApplicationId.java +++ b/src/main/java/bio/overture/ego/model/join/UserApplicationId.java @@ -1,10 +1,10 @@ package bio.overture.ego.model.join; import bio.overture.ego.model.enums.SqlFields; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import java.io.Serializable; import java.util.UUID; -import javax.persistence.Column; -import javax.persistence.Embeddable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/join/UserGroup.java b/src/main/java/bio/overture/ego/model/join/UserGroup.java index 21700719b..40a9f326b 100644 --- a/src/main/java/bio/overture/ego/model/join/UserGroup.java +++ b/src/main/java/bio/overture/ego/model/join/UserGroup.java @@ -6,14 +6,14 @@ import bio.overture.ego.model.enums.JavaFields; import bio.overture.ego.model.enums.SqlFields; import bio.overture.ego.model.enums.Tables; -import javax.persistence.CascadeType; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.Table; +import jakarta.persistence.CascadeType; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MapsId; +import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/model/join/UserGroupId.java b/src/main/java/bio/overture/ego/model/join/UserGroupId.java index 5d74805e4..9dcb16c4e 100644 --- a/src/main/java/bio/overture/ego/model/join/UserGroupId.java +++ b/src/main/java/bio/overture/ego/model/join/UserGroupId.java @@ -1,10 +1,10 @@ package bio.overture.ego.model.join; import bio.overture.ego.model.enums.SqlFields; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; import java.io.Serializable; import java.util.UUID; -import javax.persistence.Column; -import javax.persistence.Embeddable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/bio/overture/ego/repository/BaseRepository.java b/src/main/java/bio/overture/ego/repository/BaseRepository.java index 060365171..69f58e78a 100644 --- a/src/main/java/bio/overture/ego/repository/BaseRepository.java +++ b/src/main/java/bio/overture/ego/repository/BaseRepository.java @@ -3,12 +3,13 @@ import java.util.Collection; import java.util.Set; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.PagingAndSortingRepository; @NoRepositoryBean public interface BaseRepository - extends PagingAndSortingRepository, JpaSpecificationExecutor { + extends PagingAndSortingRepository, CrudRepository, JpaSpecificationExecutor { T findFirstBy(); Set findAllByIdIn(Collection ids); diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/AbstractPermissionSpecification.java b/src/main/java/bio/overture/ego/repository/queryspecification/AbstractPermissionSpecification.java index a66bfb5d3..882911298 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/AbstractPermissionSpecification.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/AbstractPermissionSpecification.java @@ -10,10 +10,10 @@ import bio.overture.ego.model.search.SearchFilter; import bio.overture.ego.utils.QueryUtils; import com.google.common.collect.Lists; +import jakarta.persistence.criteria.Predicate; import java.util.List; import java.util.UUID; import java.util.stream.Stream; -import javax.persistence.criteria.Predicate; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/ApplicationSpecification.java b/src/main/java/bio/overture/ego/repository/queryspecification/ApplicationSpecification.java index 04e1a7852..cfc9477df 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/ApplicationSpecification.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/ApplicationSpecification.java @@ -33,8 +33,8 @@ import bio.overture.ego.model.join.GroupApplication; import bio.overture.ego.model.join.UserApplication; import bio.overture.ego.utils.QueryUtils; +import jakarta.persistence.criteria.Join; import java.util.UUID; -import javax.persistence.criteria.Join; import lombok.NonNull; import lombok.val; import org.springframework.data.jpa.domain.Specification; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/GroupSpecification.java b/src/main/java/bio/overture/ego/repository/queryspecification/GroupSpecification.java index 80cdfa11d..664b3004b 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/GroupSpecification.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/GroupSpecification.java @@ -31,8 +31,8 @@ import bio.overture.ego.model.join.GroupApplication; import bio.overture.ego.model.join.UserGroup; import bio.overture.ego.utils.QueryUtils; +import jakarta.persistence.criteria.Join; import java.util.UUID; -import javax.persistence.criteria.Join; import lombok.NonNull; import lombok.val; import org.springframework.data.jpa.domain.Specification; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/SimpleCriteriaBuilder.java b/src/main/java/bio/overture/ego/repository/queryspecification/SimpleCriteriaBuilder.java index f4ff1fab5..475ae60cc 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/SimpleCriteriaBuilder.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/SimpleCriteriaBuilder.java @@ -6,10 +6,10 @@ import bio.overture.ego.model.search.SearchFilter; import bio.overture.ego.utils.QueryUtils; +import jakarta.persistence.criteria.*; import java.util.Collection; import java.util.List; import java.util.UUID; -import javax.persistence.criteria.*; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.val; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/SpecificationBase.java b/src/main/java/bio/overture/ego/repository/queryspecification/SpecificationBase.java index f7e1a8004..ae5277bdb 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/SpecificationBase.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/SpecificationBase.java @@ -18,11 +18,11 @@ import bio.overture.ego.model.search.SearchFilter; import bio.overture.ego.utils.QueryUtils; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import java.util.Arrays; import java.util.List; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; import lombok.NonNull; import lombok.val; import org.springframework.data.jpa.domain.Specification; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/TokenStoreSpecification.java b/src/main/java/bio/overture/ego/repository/queryspecification/TokenStoreSpecification.java index 386e15bad..446ad3126 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/TokenStoreSpecification.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/TokenStoreSpecification.java @@ -21,8 +21,8 @@ import bio.overture.ego.model.entity.ApiKey; import bio.overture.ego.model.entity.User; import bio.overture.ego.utils.QueryUtils; +import jakarta.persistence.criteria.Join; import java.util.UUID; -import javax.persistence.criteria.Join; import lombok.NonNull; import lombok.val; import org.springframework.data.jpa.domain.Specification; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/UserPermissionSpecification.java b/src/main/java/bio/overture/ego/repository/queryspecification/UserPermissionSpecification.java index 5ef7bb928..42fd722b0 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/UserPermissionSpecification.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/UserPermissionSpecification.java @@ -29,9 +29,9 @@ import bio.overture.ego.model.search.SearchFilter; import bio.overture.ego.utils.QueryUtils; import com.google.common.collect.Lists; +import jakarta.persistence.criteria.Predicate; import java.util.List; import java.util.UUID; -import javax.persistence.criteria.Predicate; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/UserSpecification.java b/src/main/java/bio/overture/ego/repository/queryspecification/UserSpecification.java index 2f3826ea5..2bd063152 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/UserSpecification.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/UserSpecification.java @@ -25,9 +25,9 @@ import bio.overture.ego.model.join.UserApplication; import bio.overture.ego.model.join.UserGroup; import bio.overture.ego.utils.QueryUtils; +import jakarta.persistence.criteria.Join; import java.util.Collection; import java.util.UUID; -import javax.persistence.criteria.Join; import lombok.NonNull; import lombok.val; import org.springframework.data.jpa.domain.Specification; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/builder/AbstractSpecificationBuilder.java b/src/main/java/bio/overture/ego/repository/queryspecification/builder/AbstractSpecificationBuilder.java index 4f9f10d3a..6f61161bc 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/builder/AbstractSpecificationBuilder.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/builder/AbstractSpecificationBuilder.java @@ -3,10 +3,10 @@ import static bio.overture.ego.model.enums.JavaFields.NAME; import bio.overture.ego.model.enums.JavaFields; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import java.util.Collection; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; import lombok.NonNull; import lombok.val; import org.springframework.data.jpa.domain.Specification; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/builder/ApplicationSpecificationBuilder.java b/src/main/java/bio/overture/ego/repository/queryspecification/builder/ApplicationSpecificationBuilder.java index 3052fda41..94646eb27 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/builder/ApplicationSpecificationBuilder.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/builder/ApplicationSpecificationBuilder.java @@ -1,13 +1,13 @@ package bio.overture.ego.repository.queryspecification.builder; import static bio.overture.ego.model.enums.JavaFields.*; -import static javax.persistence.criteria.JoinType.LEFT; +import static jakarta.persistence.criteria.JoinType.LEFT; import bio.overture.ego.model.entity.Application; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import java.util.UUID; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; import lombok.NonNull; import lombok.Setter; import lombok.experimental.Accessors; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/builder/GroupSpecificationBuilder.java b/src/main/java/bio/overture/ego/repository/queryspecification/builder/GroupSpecificationBuilder.java index 092a33593..c8a7884b9 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/builder/GroupSpecificationBuilder.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/builder/GroupSpecificationBuilder.java @@ -5,11 +5,11 @@ import static bio.overture.ego.model.enums.JavaFields.PERMISSIONS; import static bio.overture.ego.model.enums.JavaFields.USER; import static bio.overture.ego.model.enums.JavaFields.USERGROUPS; -import static javax.persistence.criteria.JoinType.LEFT; +import static jakarta.persistence.criteria.JoinType.LEFT; import bio.overture.ego.model.entity.Group; +import jakarta.persistence.criteria.Root; import java.util.UUID; -import javax.persistence.criteria.Root; import lombok.Setter; import lombok.experimental.Accessors; import lombok.val; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/builder/RefreshTokenSpecificationBuilder.java b/src/main/java/bio/overture/ego/repository/queryspecification/builder/RefreshTokenSpecificationBuilder.java index 4aae74ebf..453e48126 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/builder/RefreshTokenSpecificationBuilder.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/builder/RefreshTokenSpecificationBuilder.java @@ -1,10 +1,10 @@ package bio.overture.ego.repository.queryspecification.builder; -import static javax.persistence.criteria.JoinType.LEFT; +import static jakarta.persistence.criteria.JoinType.LEFT; import bio.overture.ego.model.entity.RefreshToken; +import jakarta.persistence.criteria.Root; import java.util.UUID; -import javax.persistence.criteria.Root; import lombok.Setter; import lombok.experimental.Accessors; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/builder/TokenSpecificationBuilder.java b/src/main/java/bio/overture/ego/repository/queryspecification/builder/TokenSpecificationBuilder.java index 44ed9aaeb..38b5d3ef2 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/builder/TokenSpecificationBuilder.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/builder/TokenSpecificationBuilder.java @@ -2,11 +2,11 @@ import static bio.overture.ego.model.enums.JavaFields.OWNER; import static bio.overture.ego.model.enums.JavaFields.SCOPES; -import static javax.persistence.criteria.JoinType.LEFT; +import static jakarta.persistence.criteria.JoinType.LEFT; import bio.overture.ego.model.entity.ApiKey; +import jakarta.persistence.criteria.Root; import java.util.UUID; -import javax.persistence.criteria.Root; import lombok.Setter; import lombok.experimental.Accessors; diff --git a/src/main/java/bio/overture/ego/repository/queryspecification/builder/UserSpecificationBuilder.java b/src/main/java/bio/overture/ego/repository/queryspecification/builder/UserSpecificationBuilder.java index 9079b7ea6..badee2024 100644 --- a/src/main/java/bio/overture/ego/repository/queryspecification/builder/UserSpecificationBuilder.java +++ b/src/main/java/bio/overture/ego/repository/queryspecification/builder/UserSpecificationBuilder.java @@ -1,14 +1,14 @@ package bio.overture.ego.repository.queryspecification.builder; import static bio.overture.ego.model.enums.JavaFields.*; -import static javax.persistence.criteria.JoinType.LEFT; +import static jakarta.persistence.criteria.JoinType.LEFT; import bio.overture.ego.model.entity.User; import bio.overture.ego.model.enums.ProviderType; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import java.util.UUID; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; import lombok.NonNull; import lombok.Setter; import lombok.experimental.Accessors; diff --git a/src/main/java/bio/overture/ego/security/CorsFilter.java b/src/main/java/bio/overture/ego/security/CorsFilter.java index b6e054b34..7e5d70cb4 100644 --- a/src/main/java/bio/overture/ego/security/CorsFilter.java +++ b/src/main/java/bio/overture/ego/security/CorsFilter.java @@ -18,10 +18,10 @@ import bio.overture.ego.service.ApplicationService; import bio.overture.ego.utils.Redirects; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.net.URI; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/security/JWTAuthorizationFilter.java b/src/main/java/bio/overture/ego/security/JWTAuthorizationFilter.java index 995c1d341..49b57b72d 100644 --- a/src/main/java/bio/overture/ego/security/JWTAuthorizationFilter.java +++ b/src/main/java/bio/overture/ego/security/JWTAuthorizationFilter.java @@ -25,11 +25,11 @@ import bio.overture.ego.token.app.AppTokenClaims; import bio.overture.ego.token.user.UserTokenClaims; import bio.overture.ego.view.Views; +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; -import javax.servlet.FilterChain; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/security/OAuth2RequestResolver.java b/src/main/java/bio/overture/ego/security/OAuth2RequestResolver.java index 1f0acc356..340af2a37 100644 --- a/src/main/java/bio/overture/ego/security/OAuth2RequestResolver.java +++ b/src/main/java/bio/overture/ego/security/OAuth2RequestResolver.java @@ -2,8 +2,8 @@ import static java.util.Objects.isNull; +import jakarta.servlet.http.HttpServletRequest; import java.net.URI; -import javax.servlet.http.HttpServletRequest; import lombok.SneakyThrows; import lombok.val; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; diff --git a/src/main/java/bio/overture/ego/service/AbstractPermissionService.java b/src/main/java/bio/overture/ego/service/AbstractPermissionService.java index 75d7683ed..e3a2761d3 100644 --- a/src/main/java/bio/overture/ego/service/AbstractPermissionService.java +++ b/src/main/java/bio/overture/ego/service/AbstractPermissionService.java @@ -13,13 +13,13 @@ import static bio.overture.ego.utils.PermissionRequestAnalyzer.analyze; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Maps.uniqueIndex; +import static jakarta.persistence.criteria.JoinType.LEFT; import static java.util.Arrays.stream; import static java.util.Collections.reverse; import static java.util.Comparator.comparing; import static java.util.Objects.isNull; import static java.util.function.Function.identity; import static java.util.stream.Collectors.*; -import static javax.persistence.criteria.JoinType.LEFT; import bio.overture.ego.model.dto.PermissionRequest; import bio.overture.ego.model.dto.ResolvedPermissionResponse; diff --git a/src/main/java/bio/overture/ego/service/GroupService.java b/src/main/java/bio/overture/ego/service/GroupService.java index d3041c476..7bfada9fd 100644 --- a/src/main/java/bio/overture/ego/service/GroupService.java +++ b/src/main/java/bio/overture/ego/service/GroupService.java @@ -51,11 +51,11 @@ import bio.overture.ego.repository.queryspecification.builder.GroupSpecificationBuilder; import bio.overture.ego.utils.EntityServices; import com.google.common.collect.ImmutableSet; +import jakarta.transaction.Transactional; import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.UUID; -import javax.transaction.Transactional; import lombok.NonNull; import lombok.val; import org.mapstruct.Mapper; diff --git a/src/main/java/bio/overture/ego/service/InitializationService.java b/src/main/java/bio/overture/ego/service/InitializationService.java index 65d507a77..7650afdd3 100644 --- a/src/main/java/bio/overture/ego/service/InitializationService.java +++ b/src/main/java/bio/overture/ego/service/InitializationService.java @@ -8,7 +8,7 @@ import bio.overture.ego.model.dto.CreateApplicationRequest; import bio.overture.ego.model.entity.InitTripWire; import bio.overture.ego.repository.InitTripWireRepository; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/service/PolicyService.java b/src/main/java/bio/overture/ego/service/PolicyService.java index 92fb6122e..f0d249947 100644 --- a/src/main/java/bio/overture/ego/service/PolicyService.java +++ b/src/main/java/bio/overture/ego/service/PolicyService.java @@ -7,7 +7,7 @@ import static bio.overture.ego.model.exceptions.RequestValidationException.checkRequestValid; import static bio.overture.ego.model.exceptions.UniqueViolationException.checkUnique; import static bio.overture.ego.utils.FieldUtils.onUpdateDetected; -import static javax.persistence.criteria.JoinType.LEFT; +import static jakarta.persistence.criteria.JoinType.LEFT; import static org.mapstruct.factory.Mappers.getMapper; import bio.overture.ego.event.token.ApiKeyEventsPublisher; diff --git a/src/main/java/bio/overture/ego/service/RefreshContextService.java b/src/main/java/bio/overture/ego/service/RefreshContextService.java index 0a71991a8..419700067 100644 --- a/src/main/java/bio/overture/ego/service/RefreshContextService.java +++ b/src/main/java/bio/overture/ego/service/RefreshContextService.java @@ -11,12 +11,12 @@ import bio.overture.ego.model.exceptions.ForbiddenException; import bio.overture.ego.repository.RefreshTokenRepository; import bio.overture.ego.repository.queryspecification.builder.RefreshTokenSpecificationBuilder; +import jakarta.servlet.http.Cookie; import java.sql.Date; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Optional; import java.util.UUID; -import javax.servlet.http.Cookie; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/service/UserService.java b/src/main/java/bio/overture/ego/service/UserService.java index 04dcb9d0e..894a394a3 100644 --- a/src/main/java/bio/overture/ego/service/UserService.java +++ b/src/main/java/bio/overture/ego/service/UserService.java @@ -51,8 +51,8 @@ import bio.overture.ego.token.IDToken; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import jakarta.transaction.Transactional; import java.util.*; -import javax.transaction.Transactional; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/service/VisaService.java b/src/main/java/bio/overture/ego/service/VisaService.java index 70cf00c2d..9e65f8db1 100644 --- a/src/main/java/bio/overture/ego/service/VisaService.java +++ b/src/main/java/bio/overture/ego/service/VisaService.java @@ -8,9 +8,9 @@ import bio.overture.ego.model.dto.VisaRequest; import bio.overture.ego.model.entity.Visa; import bio.overture.ego.repository.VisaRepository; +import jakarta.validation.constraints.NotNull; import java.util.Optional; import java.util.UUID; -import javax.validation.constraints.NotNull; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/token/CustomTokenEnhancer.java b/src/main/java/bio/overture/ego/token/CustomTokenEnhancer.java index aa44c8ee8..9aba737d8 100644 --- a/src/main/java/bio/overture/ego/token/CustomTokenEnhancer.java +++ b/src/main/java/bio/overture/ego/token/CustomTokenEnhancer.java @@ -26,8 +26,8 @@ import lombok.val; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.oauth2.core.AuthorizationGrantType; -import org.springframework.security.oauth2.server.authorization.JwtEncodingContext; -import org.springframework.security.oauth2.server.authorization.OAuth2TokenCustomizer; +import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer; import org.springframework.stereotype.Component; // This class is responsible to modify and customize the jwt claims diff --git a/src/main/java/bio/overture/ego/token/signer/DefaultTokenSigner.java b/src/main/java/bio/overture/ego/token/signer/DefaultTokenSigner.java index 478d5cd7c..b9edb2ad9 100644 --- a/src/main/java/bio/overture/ego/token/signer/DefaultTokenSigner.java +++ b/src/main/java/bio/overture/ego/token/signer/DefaultTokenSigner.java @@ -16,13 +16,13 @@ package bio.overture.ego.token.signer; +import jakarta.annotation.PostConstruct; import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.Optional; -import javax.annotation.PostConstruct; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/token/signer/JKSTokenSigner.java b/src/main/java/bio/overture/ego/token/signer/JKSTokenSigner.java index 395ba4b1a..5b53b403f 100644 --- a/src/main/java/bio/overture/ego/token/signer/JKSTokenSigner.java +++ b/src/main/java/bio/overture/ego/token/signer/JKSTokenSigner.java @@ -16,12 +16,12 @@ package bio.overture.ego.token.signer; +import jakarta.annotation.PostConstruct; import java.io.FileInputStream; import java.io.IOException; import java.security.*; import java.util.Base64; import java.util.Optional; -import javax.annotation.PostConstruct; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/utils/HibernateSessions.java b/src/main/java/bio/overture/ego/utils/HibernateSessions.java index fe6d67920..8e0ff6a49 100644 --- a/src/main/java/bio/overture/ego/utils/HibernateSessions.java +++ b/src/main/java/bio/overture/ego/utils/HibernateSessions.java @@ -6,7 +6,7 @@ import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; -import org.hibernate.collection.internal.AbstractPersistentCollection; +import org.hibernate.collection.spi.AbstractPersistentCollection; @Slf4j public class HibernateSessions { diff --git a/src/main/java/bio/overture/ego/utils/SwaggerConstants.java b/src/main/java/bio/overture/ego/utils/SwaggerConstants.java index 6ea6e25b3..1aee5d3d3 100644 --- a/src/main/java/bio/overture/ego/utils/SwaggerConstants.java +++ b/src/main/java/bio/overture/ego/utils/SwaggerConstants.java @@ -1,6 +1,19 @@ package bio.overture.ego.utils; +import java.util.Set; + public class SwaggerConstants { public static final String AUTH_CONTROLLER = "auth-controller"; public static final String POST_ACCESS_TOKEN = "postAccessToken"; + + public static final String SECURITY_SCHEME_NAME = "Bearer"; + + public static final Set POST_ACCESS_TOKEN_PARAMS = + Set.of("client_secret", "client_id", "grant_type"); + public static final Set APPLICATION_SCOPED_PATHS = + Set.of( + "/o/check_api_key", + "/o/check_token", + "/transaction/group_permissions", + "/transaction/mass_delete"); } diff --git a/src/main/java/db/migration/V1_1__complete_uuid_migration.java b/src/main/java/db/migration/V1_1__complete_uuid_migration.java index 9a7a8d254..45556a3e7 100644 --- a/src/main/java/db/migration/V1_1__complete_uuid_migration.java +++ b/src/main/java/db/migration/V1_1__complete_uuid_migration.java @@ -8,13 +8,15 @@ import java.util.UUID; import lombok.extern.slf4j.Slf4j; import lombok.val; -import org.flywaydb.core.api.migration.spring.SpringJdbcMigration; +import org.flywaydb.core.api.migration.BaseJavaMigration; +import org.flywaydb.core.api.migration.Context; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; @Slf4j -public class V1_1__complete_uuid_migration implements SpringJdbcMigration { - public void migrate(JdbcTemplate jdbcTemplate) throws Exception { +public class V1_1__complete_uuid_migration extends BaseJavaMigration { + public void migrate(Context context) throws Exception { log.info( "Flyway java migration: V1_1__complete_uuid_migration running ******************************"); @@ -24,6 +26,10 @@ public void migrate(JdbcTemplate jdbcTemplate) throws Exception { UUID userOneId = UUID.randomUUID(); UUID userTwoId = UUID.randomUUID(); + JdbcTemplate jdbcTemplate = + new JdbcTemplate(new SingleConnectionDataSource(context.getConnection(), true)); + ; + // Test data (if set to true) if (runWithTest) { createTestData(jdbcTemplate, userOneId, userTwoId); diff --git a/src/main/java/db/migration/V1_3__string_to_date.java b/src/main/java/db/migration/V1_3__string_to_date.java index 0146de4ca..963a2059b 100644 --- a/src/main/java/db/migration/V1_3__string_to_date.java +++ b/src/main/java/db/migration/V1_3__string_to_date.java @@ -7,21 +7,26 @@ import java.util.UUID; import lombok.extern.slf4j.Slf4j; import lombok.val; -import org.flywaydb.core.api.migration.spring.SpringJdbcMigration; +import org.flywaydb.core.api.migration.BaseJavaMigration; +import org.flywaydb.core.api.migration.Context; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; @Slf4j -public class V1_3__string_to_date implements SpringJdbcMigration { +public class V1_3__string_to_date extends BaseJavaMigration { @Override - public void migrate(JdbcTemplate jdbcTemplate) throws Exception { + public void migrate(Context context) throws Exception { log.info("Flyway java migration: V1_3__string_to_date running ******************************"); boolean runWithTest = false; UUID userOneId = UUID.randomUUID(); UUID userTwoId = UUID.randomUUID(); + JdbcTemplate jdbcTemplate = + new JdbcTemplate(new SingleConnectionDataSource(context.getConnection(), true)); + if (runWithTest) { createTestData(jdbcTemplate, userOneId, userTwoId); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d2d185265..3eec0363b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -27,6 +27,15 @@ refreshToken: cookieIsSecure: false domain: localhost +# Swagger +springdoc: + packagesToScan: bio.overture.ego.controller + swagger-ui: + display-operation-id: true + doc-expansion: none # initial collapse groups + operations-sorter: alpha + tags-sorter: alpha + # security auth: token: @@ -50,6 +59,7 @@ spring: client: registration: google: + provider: google clientName: ego clientId: ego-client clientSecret: diff --git a/src/test/java/bio/overture/ego/controller/AbstractControllerTest.java b/src/test/java/bio/overture/ego/controller/AbstractControllerTest.java index 79bff5286..1de374b34 100644 --- a/src/test/java/bio/overture/ego/controller/AbstractControllerTest.java +++ b/src/test/java/bio/overture/ego/controller/AbstractControllerTest.java @@ -29,7 +29,7 @@ import lombok.val; import org.junit.Before; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpHeaders; @Slf4j diff --git a/src/test/java/bio/overture/ego/controller/AppJWTTest.java b/src/test/java/bio/overture/ego/controller/AppJWTTest.java index d7c285677..f428bd4ed 100644 --- a/src/test/java/bio/overture/ego/controller/AppJWTTest.java +++ b/src/test/java/bio/overture/ego/controller/AppJWTTest.java @@ -407,5 +407,4 @@ public void applicationJwtIsValidAndUsable() { val users = MAPPER.readTree(resolvedUsers); assertNotNull(users); } - } diff --git a/src/test/java/bio/overture/ego/service/initialization/InitializationServiceTest.java b/src/test/java/bio/overture/ego/service/initialization/InitializationServiceTest.java index 433c829f3..9fdeb6ac5 100644 --- a/src/test/java/bio/overture/ego/service/initialization/InitializationServiceTest.java +++ b/src/test/java/bio/overture/ego/service/initialization/InitializationServiceTest.java @@ -16,7 +16,7 @@ import bio.overture.ego.service.ApplicationService; import bio.overture.ego.service.InitializationService; import bio.overture.ego.utils.EntityGenerator; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.junit.Rule; diff --git a/src/test/java/bio/overture/ego/utils/web/AbstractWebResource.java b/src/test/java/bio/overture/ego/utils/web/AbstractWebResource.java index aaee7a2d1..e9d776630 100644 --- a/src/test/java/bio/overture/ego/utils/web/AbstractWebResource.java +++ b/src/test/java/bio/overture/ego/utils/web/AbstractWebResource.java @@ -169,8 +169,8 @@ private static void logResponse(boolean enable, boolean pretty, ResponseEnti val output = CleanResponse.builder() .body(response.hasBody() ? response.getBody() : null) - .statusCodeName(response.getStatusCode().name()) - .statusCodeValue(response.getStatusCodeValue()) + .statusCodeName(response.getStatusCode().toString()) + .statusCodeValue(response.getStatusCode().value()) .build(); if (pretty) { log.info("[RESPONSE] > \n{}", PRETTY_MAPPER.writeValueAsString(output)); From 9a6367c6f03dec4b9b0e3f45e8944f527cd76a88 Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Fri, 28 Apr 2023 12:22:39 -0400 Subject: [PATCH 13/17] committing changes related to remove api fixes --- src/main/java/bio/overture/ego/controller/VisaController.java | 2 +- .../java/bio/overture/ego/service/VisaPermissionService.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java index d320d0484..aa9e64479 100644 --- a/src/main/java/bio/overture/ego/controller/VisaController.java +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -183,7 +183,7 @@ public void deleteVisa( * @param visaPermissionRequest VisaPermissionRequest */ @AdminScoped - @RequestMapping(method = DELETE, value = "/permissions") + @RequestMapping(method = DELETE, value = "/permissions/{policyId}/{visaId}") @ApiResponses(value = {@ApiResponse(code = 200, message = "Remove VisaPermission")}) @JsonView(Views.REST.class) public @ResponseBody void removePermissions( diff --git a/src/main/java/bio/overture/ego/service/VisaPermissionService.java b/src/main/java/bio/overture/ego/service/VisaPermissionService.java index 20ae80963..21b98ce36 100644 --- a/src/main/java/bio/overture/ego/service/VisaPermissionService.java +++ b/src/main/java/bio/overture/ego/service/VisaPermissionService.java @@ -90,6 +90,9 @@ public void removePermission(@NonNull UUID policyId, @NotNull UUID visaId) { visaPermissionRepository.findByPolicyIdAndVisaId(policyId, visaId); if (!visaPermissionEntities.isEmpty()) { visaPermissionRepository.deleteById(visaPermissionEntities.get(0).getId()); + } else { + throw new NotFoundException( + format("No VisaPermissions exists with policyId '%s' and visaId '%s'", policyId, visaId)); } } From c39e6fbcdcf0e0fd3a5d1cb4c946816af594982f Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Tue, 2 May 2023 15:16:55 -0400 Subject: [PATCH 14/17] Committing changes related to spring migration --- .../ego/controller/VisaController.java | 26 ++++++++++++------- .../ego/model/entity/VisaPermission.java | 4 --- .../ego/service/VisaPermissionService.java | 2 +- .../bio/overture/ego/service/VisaService.java | 1 - 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/bio/overture/ego/controller/VisaController.java b/src/main/java/bio/overture/ego/controller/VisaController.java index 7c3066fd6..03997a974 100644 --- a/src/main/java/bio/overture/ego/controller/VisaController.java +++ b/src/main/java/bio/overture/ego/controller/VisaController.java @@ -8,10 +8,13 @@ import bio.overture.ego.service.*; import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; -import io.swagger.annotations.*; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotNull; import java.util.List; import java.util.UUID; -import javax.validation.constraints.NotNull; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -135,10 +138,11 @@ public void deleteVisa( */ @AdminScoped @RequestMapping(method = GET, value = "/permissions/visaId/{id}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Get VisaPermissions by visaId")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Get VisaPermissions by visaId")}) @JsonView(Views.REST.class) public @ResponseBody List getPermissionsByVisaId( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { return visaPermissionService.getPermissionsByVisaId(id); @@ -151,10 +155,11 @@ public void deleteVisa( */ @AdminScoped @RequestMapping(method = GET, value = "/permissions/policyId/{id}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Get VisaPermissions by policyId")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Get VisaPermissions by policyId")}) @JsonView(Views.REST.class) public @ResponseBody List getPermissionsByPolicyId( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "id", required = true) UUID id) { return visaPermissionService.getPermissionsByPolicyId(id); @@ -167,10 +172,11 @@ public void deleteVisa( */ @AdminScoped @RequestMapping(method = POST, value = "/permissions") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Create or Update VisaPermission")}) + @ApiResponses( + value = {@ApiResponse(responseCode = "200", description = "Create or Update VisaPermission")}) @JsonView(Views.REST.class) public @ResponseBody VisaPermission createOrUpdatePermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @RequestBody(required = true) VisaPermissionRequest visaPermissionRequest) { return visaPermissionService.createOrUpdatePermissions(visaPermissionRequest); @@ -182,10 +188,10 @@ public void deleteVisa( */ @AdminScoped @RequestMapping(method = DELETE, value = "/permissions/{policyId}/{visaId}") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Remove VisaPermission")}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Remove VisaPermission")}) @JsonView(Views.REST.class) public @ResponseBody void removePermissions( - @ApiIgnore @RequestHeader(value = "Authorization", required = true) + @Parameter(hidden = true) @RequestHeader(value = "Authorization", required = true) final String authorization, @PathVariable(value = "policyId", required = true) UUID policyId, @PathVariable(value = "visaId", required = true) UUID visaId) { diff --git a/src/main/java/bio/overture/ego/model/entity/VisaPermission.java b/src/main/java/bio/overture/ego/model/entity/VisaPermission.java index 9c0a5b419..ebac950a0 100644 --- a/src/main/java/bio/overture/ego/model/entity/VisaPermission.java +++ b/src/main/java/bio/overture/ego/model/entity/VisaPermission.java @@ -5,11 +5,7 @@ import bio.overture.ego.model.enums.Tables; import bio.overture.ego.view.Views; import com.fasterxml.jackson.annotation.JsonView; -import com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType; import jakarta.persistence.*; -import jakarta.validation.constraints.NotNull; -import java.util.Collection; -import java.util.UUID; import lombok.*; import lombok.experimental.FieldNameConstants; diff --git a/src/main/java/bio/overture/ego/service/VisaPermissionService.java b/src/main/java/bio/overture/ego/service/VisaPermissionService.java index 21b98ce36..6057ce5bc 100644 --- a/src/main/java/bio/overture/ego/service/VisaPermissionService.java +++ b/src/main/java/bio/overture/ego/service/VisaPermissionService.java @@ -8,9 +8,9 @@ import bio.overture.ego.model.entity.VisaPermission; import bio.overture.ego.model.exceptions.NotFoundException; import bio.overture.ego.repository.VisaPermissionRepository; +import jakarta.validation.constraints.NotNull; import java.util.List; import java.util.UUID; -import javax.validation.constraints.NotNull; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; diff --git a/src/main/java/bio/overture/ego/service/VisaService.java b/src/main/java/bio/overture/ego/service/VisaService.java index cac9c9b40..9e65f8db1 100644 --- a/src/main/java/bio/overture/ego/service/VisaService.java +++ b/src/main/java/bio/overture/ego/service/VisaService.java @@ -11,7 +11,6 @@ import jakarta.validation.constraints.NotNull; import java.util.Optional; import java.util.UUID; -import javax.validation.constraints.NotNull; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import lombok.val; From d0cb76eb72da6584cd8a6c936bfe0de61321f18f Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Wed, 3 May 2023 00:34:47 -0400 Subject: [PATCH 15/17] Committing changes related to clientId fix --- 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 3eec0363b..b90530d8d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -59,10 +59,10 @@ spring: client: registration: google: + client-id: ego-client + client-secret: provider: google clientName: ego - clientId: ego-client - clientSecret: authorizationGrantType: authorization_code clientAuthenticationMethod: client_secret_post redirectUri: "http://localhost:8081/oauth/code/google" From ea59624af51afbe5f57e4be48cc1927f4c8a0647 Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Wed, 3 May 2023 12:54:00 -0400 Subject: [PATCH 16/17] Committing changes related to clientId fix --- src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b90530d8d..bcf27223b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -59,10 +59,10 @@ spring: client: registration: google: - client-id: ego-client - client-secret: provider: google clientName: ego + client_id: ego-client + clientSecret: authorizationGrantType: authorization_code clientAuthenticationMethod: client_secret_post redirectUri: "http://localhost:8081/oauth/code/google" @@ -73,7 +73,7 @@ spring: github: clientName: ego - clientId: ego-client + client_id: ego-client clientSecret: redirectUri: "http://localhost:8081/oauth/code/github" clientAuthenticationMethod: client_secret_post From a78a900b571615c9facba726208880505782db34 Mon Sep 17 00:00:00 2001 From: Azher2Ali <121898125+Azher2Ali@users.noreply.github.com> Date: Fri, 5 May 2023 14:52:49 -0400 Subject: [PATCH 17/17] Commiting changes --- pom.xml | 14 +++++++++----- src/main/resources/application.yml | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 20fcf2d30..934054ab3 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,6 @@ 3.0.5 - UTF-8 UTF-8 @@ -241,6 +240,11 @@ spring-cloud-starter-vault-config 2.1.2.RELEASE + + org.springframework.cloud + spring-cloud-vault-config-databases + 4.0.1 + com.amazonaws aws-java-sdk-core @@ -396,14 +400,14 @@ protobuf-maven-plugin 0.6.1 - com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier} + - + com.google.protobuf:protoc:3.21.7:exe:osx-x86_64 ${basedir}/src/main/proto grpc-java - io.grpc:protoc-gen-grpc-java:1.54.0:exe:${os.detected.classifier} + - + io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:osx-x86_64 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bcf27223b..3eec0363b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -61,7 +61,7 @@ spring: google: provider: google clientName: ego - client_id: ego-client + clientId: ego-client clientSecret: authorizationGrantType: authorization_code clientAuthenticationMethod: client_secret_post @@ -73,7 +73,7 @@ spring: github: clientName: ego - client_id: ego-client + clientId: ego-client clientSecret: redirectUri: "http://localhost:8081/oauth/code/github" clientAuthenticationMethod: client_secret_post