Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.venkata</groupId>
<artifactId>simple-flight-search</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<jdk.version>1.8</jdk.version>
</properties>


<dependencies>

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>


</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

</project>
16 changes: 16 additions & 0 deletions src/main/java/com/flightmgr/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.flightmgr;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
try {
SpringApplication.run(Application.class, args);
}catch (Exception e){
e.printStackTrace();
}
}
}
43 changes: 43 additions & 0 deletions src/main/java/com/flightmgr/controller/SearchController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.flightmgr.controller;

import com.flightmgr.model.FlightInfo;
import com.flightmgr.model.SearchRequest;
import com.flightmgr.service.SearchService;
import com.flightmgr.validator.RequestValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/flight")
public class SearchController {

@Autowired
private SearchService searchService;

@Autowired
private RequestValidator validator;

@RequestMapping(value = "/search", method = RequestMethod.GET)
public List<FlightInfo> search(@RequestParam("date") String date,
@RequestParam(required = false, value = "origin") String origin,
@RequestParam (required = false, value = "destination") String destination,
@RequestParam(required = false, value = "flightNumber") String flightNumber){
final SearchRequest request = SearchRequest.builder()
.date(LocalDate.parse(date))
.destination(Optional.ofNullable(destination))
.origin(Optional.ofNullable(origin))
.flightNumber(Optional.ofNullable(flightNumber))
.build();
validator.validate(request);
return searchService.find(request);

}

}
16 changes: 16 additions & 0 deletions src/main/java/com/flightmgr/controller/ViewController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.flightmgr.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class ViewController {


@RequestMapping(value = "/", method = RequestMethod.GET)
public String main(Model model) {
return "welcome";
}
}
24 changes: 24 additions & 0 deletions src/main/java/com/flightmgr/model/FlightInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.flightmgr.model;

import lombok.Builder;
import lombok.Data;

import java.time.LocalDateTime;

@Data
@Builder
public class FlightInfo {
private String flightNumber;
private String carrier;
private String origin;
private LocalDateTime departure;
private String destination;
private LocalDateTime arrival;
private String aircraft;
private Long distance;
private String travelTime;
private String status;



}
18 changes: 18 additions & 0 deletions src/main/java/com/flightmgr/model/SearchRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

package com.flightmgr.model;

import lombok.Builder;
import lombok.Data;

import java.time.LocalDate;
import java.util.Optional;

@Data
@Builder
public class SearchRequest {

private Optional<String> origin;
private Optional<String> destination;
private Optional<String> flightNumber;
private LocalDate date;
}
61 changes: 61 additions & 0 deletions src/main/java/com/flightmgr/repo/FlightData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@

package com.flightmgr.repo;

import com.flightmgr.model.FlightInfo;
import com.flightmgr.model.SearchRequest;
import com.google.gson.Gson;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Repository;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Repository
public class FlightData {
private List<FlightInfo> flightInfoList;

public FlightData() throws IOException {
String dataStr = IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream("data.json"));
List<Map> d = new Gson().fromJson(dataStr, List.class);
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'hh:mm:ss");
flightInfoList = d.stream().map(e ->
FlightInfo.builder()
.aircraft(e.get("aircraft").toString())
.departure(LocalDateTime.parse(e.get("departure").toString()))
.arrival(LocalDateTime.parse(e.get("arrival").toString()))
.carrier(e.get("carrier").toString())
.destination(e.get("destination").toString())
.origin(e.get("origin").toString())
.flightNumber(e.get("flightNumber").toString())
.status(e.get("status").toString())
.distance(((Double) e.get("distance")).longValue())
.travelTime(e.get("travelTime").toString())
.build()
).collect(Collectors.toList());

}

public List<FlightInfo> findBy(SearchRequest searchRequest) {
Stream<FlightInfo> stream = flightInfoList.stream();
if (Objects.nonNull(searchRequest.getDate())) {
stream = stream.filter(e -> e.getDeparture().toLocalDate().equals(searchRequest.getDate()));
}
if (searchRequest.getOrigin().isPresent()) {
stream = stream.filter(e -> e.getOrigin().equalsIgnoreCase(searchRequest.getOrigin().get()));
}
if (searchRequest.getDestination().isPresent()) {
stream = stream.filter(e -> e.getDestination().equalsIgnoreCase(searchRequest.getDestination().get()));
}
if (searchRequest.getFlightNumber().isPresent()) {
stream = stream.filter(e -> e.getFlightNumber().equalsIgnoreCase(searchRequest.getFlightNumber().get()));
}
return stream.collect(Collectors.toList());
}

}
21 changes: 21 additions & 0 deletions src/main/java/com/flightmgr/service/SearchService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@

package com.flightmgr.service;

import com.flightmgr.model.FlightInfo;
import com.flightmgr.model.SearchRequest;
import com.flightmgr.repo.FlightData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SearchService {

@Autowired
private FlightData data;

public List<FlightInfo> find(SearchRequest request){
return data.findBy(request);
}
}
29 changes: 29 additions & 0 deletions src/main/java/com/flightmgr/validator/RequestValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@

package com.flightmgr.validator;

import com.flightmgr.model.SearchRequest;
import org.springframework.stereotype.Component;

import java.util.Objects;

@Component
public class RequestValidator {

public void validate(SearchRequest request){
if(Objects.isNull(request.getDate())){
throw new RuntimeException("Invalid Input. Date is mandatory param");
}
if(request.getFlightNumber().isPresent()){
if(request.getOrigin().isPresent() || request.getDestination().isPresent()){
throw new RuntimeException("Invalid Input. Origin destiation and flight number both cannot be searched");
}

}else if(request.getDestination().isPresent() && request.getOrigin().isPresent()){
if(request.getFlightNumber().isPresent()){
throw new RuntimeException("Invalid input");
}
}else {
throw new RuntimeException("Invalid Inputs..");
}
}
}
1 change: 1 addition & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
spring.thymeleaf.cache=false
Loading