Skip to content

Commit 4d13c01

Browse files
authored
Merge pull request #687 from overture-stack/feature/visa
Feature/visa
2 parents f0c8020 + 07d4ead commit 4d13c01

File tree

10 files changed

+359
-0
lines changed

10 files changed

+359
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package bio.overture.ego.controller;
2+
3+
import static bio.overture.ego.controller.resolver.PageableResolver.*;
4+
import static org.springframework.web.bind.annotation.RequestMethod.*;
5+
6+
import bio.overture.ego.model.dto.*;
7+
import bio.overture.ego.model.entity.*;
8+
import bio.overture.ego.security.AdminScoped;
9+
import bio.overture.ego.service.*;
10+
import bio.overture.ego.view.Views;
11+
import com.fasterxml.jackson.annotation.JsonView;
12+
import io.swagger.annotations.*;
13+
import java.util.UUID;
14+
import lombok.NonNull;
15+
import lombok.extern.slf4j.Slf4j;
16+
import org.springframework.beans.factory.annotation.Autowired;
17+
import org.springframework.data.domain.Pageable;
18+
import org.springframework.http.HttpStatus;
19+
import org.springframework.web.bind.annotation.*;
20+
import springfox.documentation.annotations.ApiIgnore;
21+
22+
@Slf4j
23+
@RestController
24+
@RequestMapping("/visa")
25+
@Api(tags = "Visa")
26+
public class VisaController {
27+
28+
/** Dependencies */
29+
private final VisaService visaService;
30+
31+
private final UserPermissionService userPermissionService;
32+
private final GroupPermissionService groupPermissionService;
33+
private final ApplicationPermissionService applicationPermissionService;
34+
35+
@Autowired
36+
public VisaController(
37+
@NonNull VisaService visaService,
38+
@NonNull UserPermissionService userPermissionService,
39+
@NonNull GroupPermissionService groupPermissionService,
40+
@NonNull ApplicationPermissionService applicationPermissionService) {
41+
this.visaService = visaService;
42+
this.groupPermissionService = groupPermissionService;
43+
this.userPermissionService = userPermissionService;
44+
this.applicationPermissionService = applicationPermissionService;
45+
}
46+
47+
@AdminScoped
48+
@RequestMapping(method = GET, value = "/{id}")
49+
@ApiResponses(
50+
value = {@ApiResponse(code = 200, message = "Get Visa by id", response = Visa.class)})
51+
@JsonView(Views.REST.class)
52+
public @ResponseBody Visa getVisa(
53+
@ApiIgnore @RequestHeader(value = "Authorization", required = true)
54+
final String authorization,
55+
@PathVariable(value = "id", required = true) UUID id) {
56+
return visaService.getById(id);
57+
}
58+
59+
@AdminScoped
60+
@RequestMapping(method = GET, value = "")
61+
@ApiResponses(value = {@ApiResponse(code = 200, message = "All Visas")})
62+
@JsonView(Views.REST.class)
63+
public @ResponseBody PageDTO<Visa> listVisa(
64+
@ApiIgnore @RequestHeader(value = "Authorization", required = true)
65+
final String authorization,
66+
@ApiIgnore Pageable pageable) {
67+
return new PageDTO<>(visaService.listVisa(pageable));
68+
}
69+
70+
@AdminScoped
71+
@RequestMapping(method = POST, value = "")
72+
@ApiResponses(
73+
value = {
74+
@ApiResponse(code = 200, message = "New Visa", response = Visa.class),
75+
})
76+
public @ResponseBody Visa createVisa(
77+
@ApiIgnore @RequestHeader(value = "Authorization", required = true)
78+
final String authorization,
79+
@RequestBody(required = true) VisaRequest visaRequest) {
80+
return visaService.create(visaRequest);
81+
}
82+
83+
@AdminScoped
84+
@RequestMapping(method = PUT, value = "/{id}")
85+
@ApiResponses(value = {@ApiResponse(code = 200, message = "Update Visa", response = Visa.class)})
86+
public @ResponseBody Visa updateVisa(
87+
@ApiIgnore @RequestHeader(value = "Authorization", required = true)
88+
final String authorization,
89+
@PathVariable(value = "id", required = true) UUID id,
90+
@RequestBody(required = true) VisaRequest visaRequest) {
91+
return visaService.partialUpdate(id, visaRequest);
92+
}
93+
94+
@AdminScoped
95+
@RequestMapping(method = DELETE, value = "/{id}")
96+
@ResponseStatus(value = HttpStatus.OK)
97+
public void deleteVisa(
98+
@ApiIgnore @RequestHeader(value = "Authorization", required = true)
99+
final String authorization,
100+
@PathVariable(value = "id", required = true) UUID id) {
101+
visaService.delete(id);
102+
}
103+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package bio.overture.ego.model.dto;
2+
3+
import javax.validation.constraints.NotNull;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
9+
@Data
10+
@Builder
11+
@AllArgsConstructor
12+
@NoArgsConstructor
13+
public class VisaRequest {
14+
15+
@NotNull private String type;
16+
17+
@NotNull private String source;
18+
19+
@NotNull private String value;
20+
21+
@NotNull private String by;
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package bio.overture.ego.model.entity;
2+
3+
import bio.overture.ego.model.enums.JavaFields;
4+
import bio.overture.ego.model.enums.SqlFields;
5+
import bio.overture.ego.model.enums.Tables;
6+
import bio.overture.ego.view.Views;
7+
import com.fasterxml.jackson.annotation.JsonInclude;
8+
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
9+
import com.fasterxml.jackson.annotation.JsonView;
10+
import java.util.UUID;
11+
import javax.persistence.*;
12+
import javax.validation.constraints.NotNull;
13+
import lombok.*;
14+
import lombok.experimental.FieldNameConstants;
15+
import org.hibernate.annotations.GenericGenerator;
16+
17+
@Entity
18+
@Table(name = Tables.GA4GHVISA)
19+
@JsonInclude()
20+
@JsonPropertyOrder({
21+
JavaFields.ID,
22+
JavaFields.TYPE,
23+
JavaFields.SOURCE,
24+
JavaFields.VALUE,
25+
JavaFields.BY
26+
})
27+
@JsonView(Views.REST.class)
28+
@Data
29+
@Builder
30+
@NoArgsConstructor
31+
@AllArgsConstructor
32+
@FieldNameConstants
33+
@EqualsAndHashCode(of = {"id"})
34+
public class Visa implements Identifiable<UUID> {
35+
36+
@Id
37+
@Column(name = SqlFields.ID, updatable = false, nullable = false)
38+
@GenericGenerator(name = "visa_uuid", strategy = "org.hibernate.id.UUIDGenerator")
39+
@GeneratedValue(generator = "visa_uuid")
40+
private UUID id;
41+
42+
@NotNull
43+
@Column(name = SqlFields.TYPE, nullable = false)
44+
@JsonView({Views.JWTAccessToken.class, Views.REST.class})
45+
private String type;
46+
47+
@NotNull
48+
@JsonView({Views.JWTAccessToken.class, Views.REST.class})
49+
@Column(name = SqlFields.SOURCE)
50+
private String source;
51+
52+
@NotNull
53+
@JsonView({Views.JWTAccessToken.class, Views.REST.class})
54+
@Column(name = SqlFields.VALUE)
55+
private String value;
56+
57+
@NotNull
58+
@JsonView({Views.JWTAccessToken.class, Views.REST.class})
59+
@Column(name = SqlFields.BY)
60+
private String by;
61+
}

src/main/java/bio/overture/ego/model/enums/JavaFields.java

+5
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,9 @@ public class JavaFields {
6666
public static final String PROVIDERTYPE = "providerType";
6767
public static final String PROVIDER_SUBJECT_ID = "providerSubjectId";
6868
public static final String ERROR_REDIRECT_URI = "errorRedirectUri";
69+
// Visas Added
70+
public static final String SOURCE = "source";
71+
public static final String VALUE = "value";
72+
73+
public static final String BY = "by";
6974
}

src/main/java/bio/overture/ego/model/enums/SqlFields.java

+4
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,8 @@ public class SqlFields {
3838
public static final String PROVIDERSUBJECTID = "providersubjectid";
3939
public static final String INITIALIZED = "initialized";
4040
public static final String ERRORREDIRECTURI = "errorredirecturi";
41+
public static final String SOURCE = "source";
42+
public static final String VALUE = "value";
43+
44+
public static final String BY = "by";
4145
}

src/main/java/bio/overture/ego/model/enums/Tables.java

+2
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@ public class Tables {
2222
public static final String APPLICATION_PERMISSION = "applicationpermission";
2323
public static final String DEFAULTPROVIDERTRIPWIRE = "defaultprovidertripwire";
2424
public static final String INITTRIPWIRE = "inittripwire";
25+
26+
public static final String GA4GHVISA = "ga4ghvisa";
2527
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright (c) 2017. The Ontario Institute for Cancer Research. All rights reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package bio.overture.ego.model.enums;
18+
19+
import static bio.overture.ego.utils.Joiners.COMMA;
20+
import static bio.overture.ego.utils.Streams.stream;
21+
import static java.lang.String.format;
22+
23+
import lombok.NonNull;
24+
import lombok.RequiredArgsConstructor;
25+
26+
@RequiredArgsConstructor
27+
public enum VisaType {
28+
STANDARD_VISA_TYPE,
29+
CUSTOM_VISA_TYPE;
30+
31+
public static VisaType resolveStatusType(@NonNull String statusType) {
32+
return stream(values())
33+
.filter(x -> x.toString().equals(statusType))
34+
.findFirst()
35+
.orElseThrow(
36+
() ->
37+
new IllegalArgumentException(
38+
format(
39+
"The status type '%s' cannot be resolved. Must be one of: [%s]",
40+
statusType, COMMA.join(values()))));
41+
}
42+
43+
@Override
44+
public String toString() {
45+
return this.name();
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package bio.overture.ego.repository;
2+
3+
import bio.overture.ego.model.entity.Visa;
4+
import java.util.List;
5+
import java.util.Optional;
6+
import java.util.UUID;
7+
8+
public interface VisaRepository extends NamedRepository<Visa, UUID> {
9+
@Override
10+
@Deprecated
11+
default Optional<Visa> findByName(String name) {
12+
return null;
13+
}
14+
15+
List<Visa> findAll();
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package bio.overture.ego.service;
2+
3+
import static bio.overture.ego.model.exceptions.NotFoundException.checkNotFound;
4+
import static bio.overture.ego.model.exceptions.RequestValidationException.checkRequestValid;
5+
import static org.mapstruct.factory.Mappers.getMapper;
6+
7+
import bio.overture.ego.event.token.ApiKeyEventsPublisher;
8+
import bio.overture.ego.model.dto.VisaRequest;
9+
import bio.overture.ego.model.entity.Visa;
10+
import bio.overture.ego.repository.VisaRepository;
11+
import java.util.Optional;
12+
import java.util.UUID;
13+
import javax.validation.constraints.NotNull;
14+
import lombok.NonNull;
15+
import lombok.extern.slf4j.Slf4j;
16+
import lombok.val;
17+
import org.mapstruct.Mapper;
18+
import org.mapstruct.MappingTarget;
19+
import org.mapstruct.NullValueCheckStrategy;
20+
import org.mapstruct.ReportingPolicy;
21+
import org.springframework.beans.factory.annotation.Autowired;
22+
import org.springframework.data.domain.Page;
23+
import org.springframework.data.domain.Pageable;
24+
import org.springframework.stereotype.Service;
25+
import org.springframework.transaction.annotation.Transactional;
26+
27+
@Slf4j
28+
@Service
29+
@Transactional
30+
public class VisaService extends AbstractNamedService<Visa, UUID> {
31+
32+
/** Constants */
33+
private static final VisaService.VisaConverter VISA_CONVERTER =
34+
getMapper(VisaService.VisaConverter.class);
35+
36+
/** Dependencies */
37+
@Autowired private VisaRepository visaRepository;
38+
39+
private final ApiKeyEventsPublisher apiKeyEventsPublisher;
40+
41+
@Autowired
42+
public VisaService(
43+
@NonNull VisaRepository visaRepository,
44+
@NonNull ApiKeyEventsPublisher apiKeyEventsPublisher) {
45+
super(Visa.class, visaRepository);
46+
this.visaRepository = visaRepository;
47+
this.apiKeyEventsPublisher = apiKeyEventsPublisher;
48+
}
49+
50+
public Visa create(@NonNull VisaRequest createRequest) {
51+
checkRequestValid(createRequest);
52+
val visa = VISA_CONVERTER.convertToVisa(createRequest);
53+
return getRepository().save(visa);
54+
}
55+
56+
@Override
57+
public Visa getById(@NonNull UUID uuid) {
58+
val result = (Optional<Visa>) getRepository().findById(uuid);
59+
checkNotFound(result.isPresent(), "The visaId '%s' does not exist", uuid);
60+
return result.get();
61+
}
62+
63+
public void delete(@NonNull UUID id) {
64+
checkExistence(id);
65+
super.delete(id);
66+
}
67+
68+
@Override
69+
public Visa getWithRelationships(UUID uuid) {
70+
return null;
71+
}
72+
73+
public Page<Visa> listVisa(@NonNull Pageable pageable) {
74+
return visaRepository.findAll(pageable);
75+
}
76+
77+
public Visa partialUpdate(@NotNull UUID id, @NonNull VisaRequest updateRequest) {
78+
val visa = getById(id);
79+
VISA_CONVERTER.updateVisa(updateRequest, visa);
80+
return getRepository().save(visa);
81+
}
82+
83+
@Mapper(
84+
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
85+
unmappedTargetPolicy = ReportingPolicy.WARN)
86+
public abstract static class VisaConverter {
87+
public abstract Visa convertToVisa(VisaRequest request);
88+
89+
public abstract void updateVisa(VisaRequest request, @MappingTarget Visa visaToUpdate);
90+
}
91+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CREATE TABLE GA4GHVISA (
2+
id UUID PRIMARY KEY,
3+
type varchar(255) NOT NULL,
4+
source varchar(255) NOT NULL,
5+
value varchar(255) NOT NULL,
6+
by varchar(255) NOT NULL
7+
);
8+

0 commit comments

Comments
 (0)