1+ package org .couchbase .quickstart .controllers ;
2+
3+ import java .util .Arrays ;
4+ 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 ;
17+
18+ import org .couchbase .quickstart .configs .DBProperties ;
19+ import org .couchbase .quickstart .models .Airline ;
20+ import org .springframework .http .HttpStatus ;
21+ import org .springframework .http .MediaType ;
22+ import org .springframework .http .ResponseEntity ;
23+ import org .springframework .web .bind .annotation .CrossOrigin ;
24+ import org .springframework .web .bind .annotation .DeleteMapping ;
25+ import org .springframework .web .bind .annotation .GetMapping ;
26+ import org .springframework .web .bind .annotation .PathVariable ;
27+ import org .springframework .web .bind .annotation .PostMapping ;
28+ import org .springframework .web .bind .annotation .PutMapping ;
29+ import org .springframework .web .bind .annotation .RequestBody ;
30+ import org .springframework .web .bind .annotation .RequestMapping ;
31+ import org .springframework .web .bind .annotation .RequestParam ;
32+ import org .springframework .web .bind .annotation .RestController ;
33+
34+ import io .swagger .annotations .ApiOperation ;
35+ import io .swagger .annotations .ApiResponse ;
36+ import io .swagger .annotations .ApiResponses ;
37+
38+ @ RestController
39+ @ RequestMapping ("/api/v1/airline" )
40+ public class AirlineController {
41+
42+ private Cluster cluster ;
43+ private Collection airlineCol ;
44+ private DBProperties dbProperties ;
45+ private Bucket bucket ;
46+
47+ public AirlineController (Cluster cluster , Bucket bucket , DBProperties dbProperties ) {
48+ System .out .println ("Initializing airline controller, cluster: " + cluster + "; bucket: " + bucket );
49+ this .cluster = cluster ;
50+ this .bucket = bucket ;
51+ this .airlineCol = bucket .scope ("inventory" ).collection ("airline" );
52+ this .dbProperties = dbProperties ;
53+ }
54+
55+ @ GetMapping ("/{id}" )
56+ public ResponseEntity <Airline > getAirline (@ PathVariable String id ) {
57+ Airline createdAirline = airlineCol .get (id ).contentAs (Airline .class );
58+ return new ResponseEntity <>(createdAirline , HttpStatus .CREATED );
59+ }
60+
61+ @ PostMapping ("/{id}" )
62+ public ResponseEntity <Airline > createAirline (@ PathVariable String id , @ RequestBody Airline airline ) {
63+ airlineCol .insert (id , airline );
64+ Airline createdAirline = airlineCol .get (id ).contentAs (Airline .class );
65+ return new ResponseEntity <>(createdAirline , HttpStatus .CREATED );
66+ }
67+
68+ @ PutMapping ("/{id}" )
69+ public ResponseEntity <Airline > updateAirline (@ PathVariable String id , @ RequestBody Airline airline ) {
70+ airlineCol .replace (id , airline );
71+ Airline updatedAirline = airlineCol .get (id ).contentAs (Airline .class );
72+ return new ResponseEntity <>(updatedAirline , HttpStatus .OK );
73+ }
74+
75+ @ DeleteMapping ("/{id}" )
76+ public ResponseEntity <Void > deleteAirline (@ PathVariable String id ) {
77+ airlineCol .remove (id );
78+ return new ResponseEntity <>(HttpStatus .NO_CONTENT );
79+ }
80+
81+ @ GetMapping ("/list" )
82+ public ResponseEntity <List <Airline >> listAirlines () {
83+ String statement = "SELECT airline.id, airline.type, airline.name, airline.iata, airline.icao, airline.callsign, airline.country FROM `"
84+ + dbProperties .getBucketName () + "`.`inventory`.`airline`" ;
85+ List <Airline > airlines = cluster
86+ .query (statement , QueryOptions .queryOptions ().scanConsistency (QueryScanConsistency .REQUEST_PLUS ))
87+ .rowsAs (Airline .class );
88+ return new ResponseEntity <>(airlines , HttpStatus .OK );
89+ }
90+
91+ @ GetMapping ("/country/{country}" )
92+ public ResponseEntity <List <Airline >> listAirlinesByCountry (@ PathVariable String country ) {
93+ String statement = "SELECT airline.id, airline.type, airline.name, airline.iata, airline.icao, airline.callsign, airline.country FROM `"
94+ + dbProperties .getBucketName () + "`.`inventory`.`airline` WHERE country = '" + country + "'" ;
95+ List <Airline > airlines = cluster
96+ .query (statement , QueryOptions .queryOptions ().scanConsistency (QueryScanConsistency .REQUEST_PLUS )
97+ .parameters (JsonObject .create ().put ("country" , country )))
98+ .rowsAs (Airline .class );
99+ return new ResponseEntity <>(airlines , HttpStatus .OK );
100+ }
101+
102+ @ GetMapping ("/destination/{destinationAirport}" )
103+ public ResponseEntity <List <Airline >> listAirlinesByDestinationAirport (@ PathVariable String destinationAirport ) {
104+ 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 `"
105+ + dbProperties .getBucketName () + "`.`inventory`.`route` JOIN `" + dbProperties .getBucketName ()
106+ + "`.`inventory`.`airline` ON route.airlineid = META(airline).id WHERE route.destinationairport = "
107+ + destinationAirport + ") AS subquery JOIN `" + dbProperties .getBucketName ()
108+ + "`.`inventory`.`airline` AS air ON META(air).id = subquery.airlineId" ;
109+ List <Airline > airlines = cluster
110+ .query (statement ,
111+ QueryOptions .queryOptions ().scanConsistency (QueryScanConsistency .REQUEST_PLUS )
112+ .parameters (JsonObject .create ().put ("destinationAirport" , destinationAirport )))
113+ .rowsAs (Airline .class );
114+ return new ResponseEntity <>(airlines , HttpStatus .OK );
115+ }
116+
117+ }
0 commit comments