Skip to content

Commit 168292f

Browse files
committed
Added Airport Tests + Update Airport and Airline classes
1 parent 74784d8 commit 168292f

File tree

5 files changed

+232
-214
lines changed

5 files changed

+232
-214
lines changed

src/main/java/org/couchbase/quickstart/springboot/controllers/AirlineController.java

Lines changed: 56 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -56,60 +56,83 @@ public ResponseEntity<Airline> getAirline(@PathVariable String id) {
5656

5757
@PostMapping("/{id}")
5858
public ResponseEntity<Airline> createAirline(@PathVariable String id, @RequestBody Airline airline) {
59-
airlineCol.insert(id, airline);
60-
Airline createdAirline = airlineCol.get(id).contentAs(Airline.class);
61-
62-
return ResponseEntity.created(URI.create("/api/v1/airline/" + id)).body(createdAirline);
59+
try {
60+
airlineCol.insert(id, airline);
61+
Airline createdAirline = airlineCol.get(id).contentAs(Airline.class);
62+
return ResponseEntity.created(new URI("/api/v1/airline/" + id)).body(createdAirline);
63+
} catch (Exception e) {
64+
return new ResponseEntity<>(HttpStatus.CONFLICT);
65+
}
6366

6467
}
6568

6669
@PutMapping("/{id}")
6770
public ResponseEntity<Airline> updateAirline(@PathVariable String id, @RequestBody Airline airline) {
68-
airlineCol.replace(id, airline);
69-
Airline updatedAirline = airlineCol.get(id).contentAs(Airline.class);
70-
return new ResponseEntity<>(updatedAirline, HttpStatus.OK);
71+
try {
72+
airlineCol.replace(id, airline);
73+
Airline updatedAirline = airlineCol.get(id).contentAs(Airline.class);
74+
return new ResponseEntity<>(updatedAirline, HttpStatus.OK);
75+
} catch (Exception e) {
76+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
77+
}
7178
}
7279

7380
@DeleteMapping("/{id}")
7481
public ResponseEntity<Void> deleteAirline(@PathVariable String id) {
75-
airlineCol.remove(id);
76-
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
82+
try {
83+
airlineCol.remove(id);
84+
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
85+
} catch (Exception e) {
86+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
87+
}
7788
}
7889

7990
@GetMapping("/list")
8091
public ResponseEntity<List<Airline>> listAirlines() {
81-
String statement = "SELECT airline.id, airline.type, airline.name, airline.iata, airline.icao, airline.callsign, airline.country FROM `"
82-
+ dbProperties.getBucketName() + "`.`inventory`.`airline`";
83-
List<Airline> airlines = cluster
84-
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
85-
.rowsAs(Airline.class);
86-
return new ResponseEntity<>(airlines, HttpStatus.OK);
92+
try {
93+
String statement = "SELECT airline.id, airline.type, airline.name, airline.iata, airline.icao, airline.callsign, airline.country FROM `"
94+
+ dbProperties.getBucketName() + "`.`inventory`.`airline`";
95+
List<Airline> airlines = cluster
96+
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
97+
.rowsAs(Airline.class);
98+
return new ResponseEntity<>(airlines, HttpStatus.OK);
99+
} catch (Exception e) {
100+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
101+
}
87102
}
88103

89104
@GetMapping("/country/{country}")
90105
public ResponseEntity<List<Airline>> listAirlinesByCountry(@PathVariable String country) {
91-
String statement = "SELECT airline.id, airline.type, airline.name, airline.iata, airline.icao, airline.callsign, airline.country FROM `"
92-
+ dbProperties.getBucketName() + "`.`inventory`.`airline` WHERE country = '" + country + "'";
93-
List<Airline> airlines = cluster
94-
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS)
95-
.parameters(JsonObject.create().put("country", country)))
96-
.rowsAs(Airline.class);
97-
return new ResponseEntity<>(airlines, HttpStatus.OK);
106+
try {
107+
String statement = "SELECT airline.id, airline.type, airline.name, airline.iata, airline.icao, airline.callsign, airline.country FROM `"
108+
+ dbProperties.getBucketName() + "`.`inventory`.`airline` WHERE country = '" + country + "'";
109+
List<Airline> airlines = cluster
110+
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS)
111+
.parameters(JsonObject.create().put("country", country)))
112+
.rowsAs(Airline.class);
113+
return new ResponseEntity<>(airlines, HttpStatus.OK);
114+
} catch (Exception e) {
115+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
116+
}
98117
}
99118

100119
@GetMapping("/destination/{destinationAirport}")
101120
public ResponseEntity<List<Airline>> listAirlinesByDestinationAirport(@PathVariable String destinationAirport) {
102-
String statement = "SELECT air.callsign, air.country, air.iata, air.icao, air.id, air.name, air.type FROM (SELECT DISTINCT META(airline).id AS airlineId FROM `"
103-
+ dbProperties.getBucketName() + "`.`inventory`.`route` JOIN `" + dbProperties.getBucketName()
104-
+ "`.`inventory`.`airline` ON route.airlineid = META(airline).id WHERE route.destinationairport = "
105-
+ destinationAirport + ") AS subquery JOIN `" + dbProperties.getBucketName()
106-
+ "`.`inventory`.`airline` AS air ON META(air).id = subquery.airlineId";
107-
List<Airline> airlines = cluster
108-
.query(statement,
109-
QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS)
110-
.parameters(JsonObject.create().put("destinationAirport", destinationAirport)))
111-
.rowsAs(Airline.class);
112-
return new ResponseEntity<>(airlines, HttpStatus.OK);
121+
try {
122+
String statement = "SELECT air.callsign, air.country, air.iata, air.icao, air.id, air.name, air.type FROM (SELECT DISTINCT META(airline).id AS airlineId FROM `"
123+
+ dbProperties.getBucketName() + "`.`inventory`.`route` JOIN `" + dbProperties.getBucketName()
124+
+ "`.`inventory`.`airline` ON route.airlineid = META(airline).id WHERE route.destinationairport = "
125+
+ destinationAirport + ") AS subquery JOIN `" + dbProperties.getBucketName()
126+
+ "`.`inventory`.`airline` AS air ON META(air).id = subquery.airlineId";
127+
List<Airline> airlines = cluster
128+
.query(statement,
129+
QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS)
130+
.parameters(JsonObject.create().put("destinationAirport", destinationAirport)))
131+
.rowsAs(Airline.class);
132+
return new ResponseEntity<>(airlines, HttpStatus.OK);
133+
} catch (Exception e) {
134+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
135+
}
113136
}
114137

115138
}
Lines changed: 52 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,11 @@
11
package org.couchbase.quickstart.springboot.controllers;
22

3-
import java.util.Arrays;
43
import java.util.List;
5-
import java.util.UUID;
6-
7-
import com.couchbase.client.core.error.DocumentNotFoundException;
8-
import com.couchbase.client.core.msg.kv.DurabilityLevel;
9-
import com.couchbase.client.java.Bucket;
10-
import com.couchbase.client.java.Cluster;
11-
import com.couchbase.client.java.Collection;
12-
import com.couchbase.client.java.json.JsonObject;
13-
import com.couchbase.client.java.query.QueryOptions;
14-
import com.couchbase.client.java.query.QueryScanConsistency;
15-
import com.couchbase.client.java.transactions.TransactionQueryOptions;
16-
import com.couchbase.client.java.transactions.config.TransactionOptions;
174

185
import org.couchbase.quickstart.springboot.configs.DBProperties;
196
import org.couchbase.quickstart.springboot.models.Airport;
207
import org.springframework.http.HttpStatus;
21-
import org.springframework.http.MediaType;
228
import org.springframework.http.ResponseEntity;
23-
import org.springframework.web.bind.annotation.CrossOrigin;
249
import org.springframework.web.bind.annotation.DeleteMapping;
2510
import org.springframework.web.bind.annotation.GetMapping;
2611
import org.springframework.web.bind.annotation.PathVariable;
@@ -31,9 +16,11 @@
3116
import org.springframework.web.bind.annotation.RequestParam;
3217
import org.springframework.web.bind.annotation.RestController;
3318

34-
import io.swagger.annotations.ApiOperation;
35-
import io.swagger.annotations.ApiResponse;
36-
import io.swagger.annotations.ApiResponses;
19+
import com.couchbase.client.java.Bucket;
20+
import com.couchbase.client.java.Cluster;
21+
import com.couchbase.client.java.Collection;
22+
import com.couchbase.client.java.query.QueryOptions;
23+
import com.couchbase.client.java.query.QueryScanConsistency;
3724

3825
@RestController
3926
@RequestMapping("/api/v1/airport")
@@ -54,50 +41,74 @@ public AirportController(Cluster cluster, Bucket bucket, DBProperties dbProperti
5441

5542
@GetMapping("/{id}")
5643
public ResponseEntity<Airport> getAirport(@PathVariable String id) {
57-
Airport createdAirport = airportCol.get(id).contentAs(Airport.class);
58-
return new ResponseEntity<>(createdAirport, HttpStatus.CREATED);
44+
try {
45+
Airport airport = airportCol.get(id).contentAs(Airport.class);
46+
return new ResponseEntity<>(airport, HttpStatus.OK);
47+
} catch (Exception e) {
48+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
49+
}
5950
}
6051

6152
@PostMapping("/{id}")
6253
public ResponseEntity<Airport> createAirport(@PathVariable String id, @RequestBody Airport airport) {
63-
airportCol.insert(id, airport);
64-
Airport createdAirport = airportCol.get(id).contentAs(Airport.class);
65-
return new ResponseEntity<>(createdAirport, HttpStatus.CREATED);
54+
try {
55+
airportCol.insert(id, airport);
56+
Airport createdAirport = airportCol.get(id).contentAs(Airport.class);
57+
return new ResponseEntity<>(createdAirport, HttpStatus.CREATED);
58+
} catch (Exception e) {
59+
return new ResponseEntity<>(HttpStatus.CONFLICT);
60+
}
6661
}
6762

6863
@PutMapping("/{id}")
6964
public ResponseEntity<Airport> updateAirport(@PathVariable String id, @RequestBody Airport airport) {
70-
airportCol.replace(id, airport);
71-
Airport updatedAirport = airportCol.get(id).contentAs(Airport.class);
72-
return new ResponseEntity<>(updatedAirport, HttpStatus.OK);
65+
try {
66+
airportCol.replace(id, airport);
67+
Airport updatedAirport = airportCol.get(id).contentAs(Airport.class);
68+
return new ResponseEntity<>(updatedAirport, HttpStatus.OK);
69+
} catch (Exception e) {
70+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
71+
}
7372
}
7473

7574
@DeleteMapping("/{id}")
7675
public ResponseEntity<Void> deleteAirport(@PathVariable String id) {
77-
airportCol.remove(id);
78-
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
76+
try {
77+
airportCol.remove(id);
78+
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
79+
} catch (Exception e) {
80+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
81+
}
7982
}
8083

8184
@GetMapping("/list")
8285
public ResponseEntity<List<Airport>> listAirports() {
83-
String statement = "SELECT airport.* FROM `" + dbProperties.getBucketName() + "`.`inventory`.`airport`";
84-
List<Airport> airports = cluster
85-
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
86-
.rowsAs(Airport.class);
87-
return new ResponseEntity<>(airports, HttpStatus.OK);
86+
try {
87+
String statement = "SELECT airport.* FROM `" + dbProperties.getBucketName() + "`.`inventory`.`airport`";
88+
List<Airport> airports = cluster
89+
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
90+
.rowsAs(Airport.class);
91+
return new ResponseEntity<>(airports, HttpStatus.OK);
92+
} catch (Exception e) {
93+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
94+
}
8895
}
8996

9097
@GetMapping("/direct-connections")
9198
public ResponseEntity<List<Airport>> listDirectConnections(@RequestParam String airportCode) {
92-
String statement = "SELECT airport.* FROM `" + dbProperties.getBucketName()
93-
+ "`.`inventory`.`airport` as airport JOIN `" + dbProperties.getBucketName()
94-
+ "`.`inventory`.`route` as route on route.sourceairport = airport.faa WHERE airport.faa = \""
95-
+ airportCode + "\" and route.stops = 0";
96-
List<Airport> airports = cluster
97-
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
98-
.rowsAs(Airport.class);
99+
try {
100+
String statement = "SELECT airport.* FROM `" + dbProperties.getBucketName()
101+
+ "`.`inventory`.`airport` as airport JOIN `" + dbProperties.getBucketName()
102+
+ "`.`inventory`.`route` as route on route.sourceairport = airport.faa WHERE airport.faa = \""
103+
+ airportCode + "\" and route.stops = 0";
104+
List<Airport> airports = cluster
105+
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
106+
.rowsAs(Airport.class);
99107

100-
return new ResponseEntity<>(airports, HttpStatus.OK);
108+
return new ResponseEntity<>(airports, HttpStatus.OK);
109+
} catch (Exception e) {
110+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
111+
}
101112
}
102113

103114
}

src/main/java/org/couchbase/quickstart/springboot/models/Airport.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ public class Airport {
3535
@NoArgsConstructor
3636
public static class Geo {
3737

38-
private float alt;
38+
private double alt;
3939

40-
private float lat;
40+
private double lat;
4141

42-
private float lon;
42+
private double lon;
4343
}
4444
}

src/test/java/org/couchbase/quickstart/springboot/controllers/AirlineControllerTest.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,13 @@ void testUpdateAirline() {
8383

8484
@Test
8585
void testDeleteAirline() {
86-
ResponseEntity<Airline> response = restTemplate
87-
.getForEntity("http://localhost:" + port + "/api/v1/airline/airline_11", Airline.class);
88-
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
89-
Airline airline = response.getBody();
90-
assertThat(airline).isNotNull();
86+
Airline airline = new Airline("airline_11", "airline", "Test Airline", "TA", "TST", "TEST", "United States");
87+
restTemplate.postForEntity("http://localhost:" + port + "/api/v1/airline/" + airline.getId(), airline,
88+
Airline.class);
9189
restTemplate.delete("http://localhost:" + port + "/api/v1/airline/" + airline.getId());
92-
ResponseEntity<Airline> response2 = restTemplate
93-
.getForEntity("http://localhost:" + port + "/api/v1/airline/airline_11", Airline.class);
94-
assertThat(response2.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
90+
ResponseEntity<Airline> response = restTemplate
91+
.getForEntity("http://localhost:" + port + "/api/v1/airline/" + airline.getId(), Airline.class);
92+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
9593
}
9694

9795
@Test

0 commit comments

Comments
 (0)