Skip to content

Commit

Permalink
add booking replace endpoint for testing
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander Schwarz committed Sep 30, 2021
1 parent c0e2c69 commit 5eed8ea
Show file tree
Hide file tree
Showing 7 changed files with 299 additions and 11 deletions.
3 changes: 3 additions & 0 deletions nginx/default.conf.template
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ server {
location /booking {
proxy_pass http://localhost:8080/booking;
}
location /booking/replace {
proxy_pass http://localhost:8080/booking/replace;
}
location /boardingpass {
proxy_pass http://localhost:8080/boardingpass;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@

package eu.europa.ec.dgc.booking.controller;

import eu.europa.ec.dgc.booking.dto.BookingReplaceRequest;
import eu.europa.ec.dgc.booking.dto.BookingRequest;
import eu.europa.ec.dgc.booking.dto.BookingResponse;
import eu.europa.ec.dgc.booking.dto.DevDccStatus;
import eu.europa.ec.dgc.booking.entity.BookingEntity;
import eu.europa.ec.dgc.booking.service.BookingService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
Expand All @@ -47,6 +49,8 @@ public class BookingController {

private static final String PATH = "/booking";

private static final String PATH_REPLACE = "/booking/replace";

private final BookingService bookingService;

private final ConversionService converter;
Expand All @@ -70,13 +74,30 @@ public class BookingController {
@ResponseStatus(code = HttpStatus.OK)
@PostMapping(path = PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public BookingResponse booking(
@Valid @RequestBody BookingRequest booking,
@RequestParam(name = "setDccStatus", required = false) DevDccStatus dccStatus,
@Valid @RequestBody final BookingRequest booking,
@RequestParam(name = "setDccStatus", required = false) final DevDccStatus dccStatus,
HttpSession session) {
String sessionId = session.getId();
final String sessionId = session.getId();
log.debug("Incoming POST request to '{}' with content '{}', optional dccStatus '{}' and sessionId '{}'",
PATH, booking, dccStatus, sessionId);
bookingService.create(sessionId, booking, dccStatus);
return converter.convert(bookingService.getBySessionId(sessionId), BookingResponse.class);
}

@Operation(summary = "Replace Booking Data", description = "Replace Booking Data")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "400", description = "Bad Request / Validation errors"),
@ApiResponse(responseCode = "415", description = "Unsupported Media Type"),
@ApiResponse(responseCode = "500", description = "Internal Server Error")
})
@ResponseStatus(code = HttpStatus.OK)
@PostMapping(path = PATH_REPLACE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public BookingResponse replace(@Valid @RequestBody final BookingReplaceRequest request, final HttpSession session) {
final String sessionId = session.getId();
log.debug("Incoming POST request to '{}' with content '{}' and sessionId '{}'",
PATH_REPLACE, request, sessionId);
final BookingEntity entity = bookingService.replace(sessionId, request);
return converter.convert(entity, BookingResponse.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ private void convertDccStatus(final BookingPassengerResponse passengerResponse,
dccStatusResponse.setIssuer(dccStatusEntity.getIssuer());
dccStatusResponse.setIat(dccStatusEntity.getIat());
dccStatusResponse.setSub(dccStatusEntity.getSub());
dccStatusResponse.setConfirmation(dccStatusResponse.getConfirmation());
dccStatusResponse.setConfirmation(dccStatusEntity.getConfirmation());

final List<BookingPassengerDccStatusResultResponse> results = dccStatusEntity.getResults().stream()
.map(resultEntity -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
/*-
* ---license-start
* European Digital COVID Certificate Booking Demo / dgca-booking-demo-backend
* ---
* Copyright (C) 2021 T-Systems International GmbH and all other contributors
* ---
* 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.
* ---license-end
*/

package eu.europa.ec.dgc.booking.converter;

import eu.europa.ec.dgc.booking.dto.BookingReplaceRequest;
import eu.europa.ec.dgc.booking.dto.BookingReplaceRequest.BookingFlightInfoRequest;
import eu.europa.ec.dgc.booking.dto.BookingReplaceRequest.DccStatusRequest;
import eu.europa.ec.dgc.booking.dto.BookingReplaceRequest.PassengerRequest;
import eu.europa.ec.dgc.booking.dto.BookingReplaceRequest.ResultRequest;
import eu.europa.ec.dgc.booking.entity.BookingEntity;
import eu.europa.ec.dgc.booking.entity.DccStatusEntity;
import eu.europa.ec.dgc.booking.entity.DccStatusResultEntity;
import eu.europa.ec.dgc.booking.entity.FlightInfoEntity;
import eu.europa.ec.dgc.booking.entity.PassengerEntity;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Service;

@Service
public class BookingReplaceRequestToBookingEntityConverter implements Converter<BookingReplaceRequest, BookingEntity> {

@Override
public BookingEntity convert(BookingReplaceRequest request) {
final BookingEntity entity = new BookingEntity();
entity.setReference(request.getReference());
entity.setTime(request.getTime() != null ? request.getTime() : OffsetDateTime.now());
entity.setPassengers(this.convertPassengers(request.getPassengers()));
entity.setFlightInfo(this.convert(request.getFlightInfo()));
return entity;
}

public List<PassengerEntity> convertPassengers(List<PassengerRequest> requests) {
if (requests != null && !requests.isEmpty()) {
return requests.stream()
.map(this::convert)
.collect(Collectors.toList());
}
return new ArrayList<>();
}

public PassengerEntity convert(PassengerRequest request) {
final PassengerEntity entity = new PassengerEntity();
entity.setId(request.getId() != null ? request.getId() : UUID.randomUUID());
entity.setForename(request.getForename());
entity.setLastname(request.getLastname());
entity.setBirthDate(request.getBirthDate());
entity.setDccStatus(this.convert(request.getDccStatus()));
entity.setServiceIdUsed(request.getServiceIdUsed());
entity.setJti(request.getJti());
return entity;
}

public DccStatusEntity convert(final DccStatusRequest request) {
if (request != null) {
return DccStatusEntity.builder()
.issuer(request.getIssuer())
.iat(request.getIat())
.sub(request.getSub())
.results(this.convertResults(request.getResults()))
.confirmation(request.getConfirmation())
.build();
}
return null;
}

public List<DccStatusResultEntity> convertResults(List<ResultRequest> requests) {
if (requests != null && !requests.isEmpty()) {
return requests.stream()
.map(this::convert)
.collect(Collectors.toList());
}
return new ArrayList<>();
}

public DccStatusResultEntity convert(ResultRequest request) {
return DccStatusResultEntity.builder()
.identifier(request.getIdentifier())
.result(request.getResult())
.type(request.getType())
.details(request.getDetails())
.build();
}

private FlightInfoEntity convert(BookingFlightInfoRequest request) {
if (request != null) {
return FlightInfoEntity.builder()
.from(request.getFrom())
.to(request.getTo())
.time(request.getTime())
.countryOfArrival(request.getCountryOfArrival())
.countryOfDeparture(request.getCountryOfDeparture())
.regionOfArrival(request.getRegionOfArrival())
.regionOfDeparture(request.getRegionOfDeparture())
.departureTime(request.getDepartureTime())
.arrivalTime(request.getArrivalTime())
.type(request.getType())
.categories(request.getCategories() != null
? request.getCategories()
: new ArrayList<>())
.language(request.getLanguage())
.conditionTypes(request.getConditionTypes() != null
? request.getConditionTypes()
: new ArrayList<>())
.build();
}
return null;
}
}
131 changes: 131 additions & 0 deletions src/main/java/eu/europa/ec/dgc/booking/dto/BookingReplaceRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
/*-
* ---license-start
* European Digital COVID Certificate Booking Demo / dgca-booking-demo-backend
* ---
* Copyright (C) 2021 T-Systems International GmbH and all other contributors
* ---
* 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.
* ---license-end
*/

package eu.europa.ec.dgc.booking.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import lombok.Data;

@Data
public class BookingReplaceRequest {

@NotBlank
private String reference;

private OffsetDateTime time;

@Valid
private List<PassengerRequest> passengers = new ArrayList<>();

@Valid
private BookingFlightInfoRequest flightInfo;

@Data
public static final class PassengerRequest {

private UUID id;

@NotBlank
private String forename;

@NotBlank
private String lastname;

private String birthDate;

@Valid
private DccStatusRequest dccStatus;

private String serviceIdUsed;

// AccessTokenPayload.jti
private String jti;
}

@Data
public static final class DccStatusRequest {

private String issuer;

private long iat;

private String sub;

@Valid
private List<ResultRequest> results;

private String confirmation;
}

@Data
public static final class ResultRequest {

private String identifier;

private String result;

private String type;

private String details;
}

@Data
public static final class BookingFlightInfoRequest {

private String from;

private String to;

private OffsetDateTime time;

@JsonProperty("coa")
private String countryOfArrival;

@JsonProperty("cod")
private String countryOfDeparture;

@JsonProperty("roa")
private String regionOfArrival;

@JsonProperty("rod")
private String regionOfDeparture;

@JsonProperty("departureTime")
private OffsetDateTime departureTime;

@JsonProperty("arrivalTime")
private OffsetDateTime arrivalTime;

private int type;

private List<String> categories;

@JsonProperty("lang")
private String language;

private List<String> conditionTypes;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,13 @@
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Data;
import lombok.Setter;
import lombok.ToString;

@Getter
@ToString
@EqualsAndHashCode
@Data
public class PassengerEntity {

private static final DateTimeFormatter BIRTH_DATE_FORMATTER = DateTimeFormatter.ofPattern("MM-dd-yyyy");
public static final DateTimeFormatter BIRTH_DATE_FORMATTER = DateTimeFormatter.ofPattern("MM-dd-yyyy");

private UUID id;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

package eu.europa.ec.dgc.booking.service;

import eu.europa.ec.dgc.booking.dto.BookingReplaceRequest;
import eu.europa.ec.dgc.booking.dto.BookingRequest;
import eu.europa.ec.dgc.booking.dto.DevDccStatus;
import eu.europa.ec.dgc.booking.dto.ResultStatusRequest;
Expand Down Expand Up @@ -126,6 +127,12 @@ public void create(String sessionId, BookingRequest bookingRequest, DevDccStatus

persistence.save(sessionId, bookingEntity);
}

public BookingEntity replace(final String sessionId, final BookingReplaceRequest request) {
final BookingEntity entity = this.converter.convert(request, BookingEntity.class);
persistence.save(sessionId, entity);
return entity;
}

/**
* Checks whether DCC status is set for all passengers.
Expand Down

0 comments on commit 5eed8ea

Please sign in to comment.