Skip to content

Commit 7ea73f2

Browse files
committed
commiting changes related to visa implementation
1 parent b9a832c commit 7ea73f2

File tree

9 files changed

+359
-0
lines changed

9 files changed

+359
-0
lines changed
Lines changed: 103 additions & 0 deletions
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") 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+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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 id;
16+
17+
@NotNull private String type;
18+
19+
@NotNull private String source;
20+
21+
@NotNull private String value;
22+
23+
@NotNull private String by;
24+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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+
@NamedEntityGraph(
35+
name = "policy-entity-with-relationships",
36+
attributeNodes = {
37+
@NamedAttributeNode(value = JavaFields.USERPERMISSIONS),
38+
@NamedAttributeNode(value = JavaFields.GROUPPERMISSIONS),
39+
})
40+
public class Visa implements Identifiable<UUID> {
41+
42+
@Id
43+
@Column(name = SqlFields.ID, updatable = false, nullable = false)
44+
@GenericGenerator(name = "visa_uuid", strategy = "org.hibernate.id.UUIDGenerator")
45+
@GeneratedValue(generator = "visa_uuid")
46+
private UUID id;
47+
48+
@NotNull
49+
@Column(name = SqlFields.TYPE, nullable = false)
50+
@JsonView({Views.JWTAccessToken.class, Views.REST.class})
51+
private String type;
52+
53+
@NotNull
54+
@JsonView({Views.JWTAccessToken.class, Views.REST.class})
55+
@Column(name = SqlFields.SOURCE)
56+
private String source;
57+
58+
@NotNull
59+
@JsonView({Views.JWTAccessToken.class, Views.REST.class})
60+
@Column(name = SqlFields.VALUE)
61+
private String value;
62+
63+
@NotNull
64+
@JsonView({Views.JWTAccessToken.class, Views.REST.class})
65+
@Column(name = SqlFields.BY)
66+
private String by;
67+
}

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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 2 additions & 0 deletions
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
}
Lines changed: 47 additions & 0 deletions
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+
}
Lines changed: 16 additions & 0 deletions
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+
}
Lines changed: 91 additions & 0 deletions
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.PolicyRequest;
9+
import bio.overture.ego.model.dto.VisaRequest;
10+
import bio.overture.ego.model.entity.Policy;
11+
import bio.overture.ego.model.entity.Visa;
12+
import bio.overture.ego.repository.VisaRepository;
13+
import java.util.Optional;
14+
import java.util.UUID;
15+
import lombok.NonNull;
16+
import lombok.extern.slf4j.Slf4j;
17+
import lombok.val;
18+
import org.mapstruct.Mapper;
19+
import org.mapstruct.MappingTarget;
20+
import org.mapstruct.NullValueCheckStrategy;
21+
import org.mapstruct.ReportingPolicy;
22+
import org.springframework.beans.factory.annotation.Autowired;
23+
import org.springframework.data.domain.Page;
24+
import org.springframework.data.domain.Pageable;
25+
import org.springframework.stereotype.Service;
26+
import org.springframework.transaction.annotation.Transactional;
27+
28+
@Slf4j
29+
@Service
30+
@Transactional
31+
public class VisaService extends AbstractNamedService<Visa, UUID> {
32+
33+
/** Constants */
34+
private static final VisaService.VisaConverter VISA_CONVERTER = getMapper(VisaService.VisaConverter.class);
35+
36+
/** Dependencies */
37+
@Autowired
38+
39+
private VisaRepository visaRepository;
40+
41+
private final ApiKeyEventsPublisher apiKeyEventsPublisher;
42+
43+
@Autowired
44+
public VisaService(
45+
@NonNull VisaRepository visaRepository,
46+
@NonNull ApiKeyEventsPublisher apiKeyEventsPublisher) {
47+
super(Visa.class, visaRepository);
48+
this.visaRepository = visaRepository;
49+
this.apiKeyEventsPublisher = apiKeyEventsPublisher;
50+
}
51+
52+
public Visa create(@NonNull VisaRequest createRequest) {
53+
checkRequestValid(createRequest);
54+
val visa = VISA_CONVERTER.convertToVisa(createRequest);
55+
return getRepository().save(visa);
56+
}
57+
58+
@Override
59+
public Visa getById(@NonNull UUID uuid) {
60+
val result = (Optional<Visa>) getRepository().findById(uuid);
61+
checkNotFound(result.isPresent(), "The visaId '%s' does not exist", uuid);
62+
return result.get();
63+
}
64+
65+
public void delete(@NonNull UUID id) {
66+
checkExistence(id);
67+
super.delete(id);
68+
}
69+
70+
@Override
71+
public Visa getWithRelationships(UUID uuid) {
72+
return null;
73+
}
74+
75+
public Page<Visa> listVisa(@NonNull Pageable pageable) {
76+
return visaRepository.findAll(pageable);
77+
}
78+
79+
public Visa partialUpdate(@NonNull UUID id, @NonNull VisaRequest updateRequest) {
80+
val visa = getById(id);
81+
VISA_CONVERTER.updateVisa(updateRequest, visa);
82+
return getRepository().save(visa);
83+
}
84+
@Mapper(
85+
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
86+
unmappedTargetPolicy = ReportingPolicy.WARN)
87+
public abstract static class VisaConverter {
88+
public abstract Visa convertToVisa(VisaRequest request);
89+
public abstract void updateVisa(VisaRequest request, @MappingTarget Visa visaToUpdate);
90+
91+
}}

0 commit comments

Comments
 (0)