11package org .couchbase .quickstart .springboot .controllers ;
22
3- import java .net .URI ;
43import java .util .List ;
54
65import javax .validation .Valid ;
76
8- import org .couchbase .quickstart .springboot .configs .DBProperties ;
97import org .couchbase .quickstart .springboot .models .Airline ;
8+ import org .couchbase .quickstart .springboot .services .AirlineService ;
109import org .springframework .http .HttpStatus ;
1110import org .springframework .http .ResponseEntity ;
1211import org .springframework .web .bind .annotation .CrossOrigin ;
1918import org .springframework .web .bind .annotation .RequestMapping ;
2019import org .springframework .web .bind .annotation .RestController ;
2120
21+ import com .couchbase .client .core .error .DocumentExistsException ;
2222import com .couchbase .client .core .error .DocumentNotFoundException ;
23- import com .couchbase .client .java .Bucket ;
24- import com .couchbase .client .java .Cluster ;
25- import com .couchbase .client .java .Collection ;
26- import com .couchbase .client .java .json .JsonObject ;
27- import com .couchbase .client .java .query .QueryOptions ;
28- import com .couchbase .client .java .query .QueryScanConsistency ;
2923
3024@ RestController
3125@ CrossOrigin
3226@ RequestMapping ("/api/v1/airline" )
3327public class AirlineController {
3428
35- private Cluster cluster ;
36- private Collection airlineCol ;
37- private DBProperties dbProperties ;
38- private Bucket bucket ;
29+ private final AirlineService airlineService ;
3930
40- public AirlineController (Cluster cluster , Bucket bucket , DBProperties dbProperties ) {
41- System .out .println ("Initializing airline controller, cluster: " + cluster + "; bucket: " + bucket );
42- this .cluster = cluster ;
43- this .bucket = bucket ;
44- this .airlineCol = bucket .scope ("inventory" ).collection ("airline" );
45- this .dbProperties = dbProperties ;
31+ public AirlineController (AirlineService airlineService ) {
32+ this .airlineService = airlineService ;
4633 }
4734
4835 @ GetMapping ("/{id}" )
4936 public ResponseEntity <Airline > getAirline (@ PathVariable String id ) {
5037 try {
51- Airline airline = airlineCol .get (id ).contentAs (Airline .class );
52- return new ResponseEntity <>(airline , HttpStatus .OK );
38+ Airline airline = airlineService .getAirlineById (id );
39+ if (airline != null ) {
40+ return new ResponseEntity <>(airline , HttpStatus .OK );
41+ } else {
42+ return new ResponseEntity <>(HttpStatus .NOT_FOUND );
43+ }
5344 } catch (DocumentNotFoundException e ) {
5445 return new ResponseEntity <>(HttpStatus .NOT_FOUND );
46+ } catch (Exception e ) {
47+ return new ResponseEntity <>(HttpStatus .INTERNAL_SERVER_ERROR );
5548 }
5649 }
5750
5851 @ PostMapping ("/{id}" )
59- public ResponseEntity <Airline > createAirline (@ PathVariable String id ,@ Valid @ RequestBody Airline airline ) {
52+ public ResponseEntity <Airline > createAirline (@ PathVariable String id , @ Valid @ RequestBody Airline airline ) {
6053 try {
61- airlineCol .insert (id , airline );
62- Airline createdAirline = airlineCol .get (id ).contentAs (Airline .class );
63- return ResponseEntity .created (new URI ("/api/v1/airline/" + id )).body (createdAirline );
64- } catch (Exception e ) {
54+ Airline newAirline = airlineService .createAirline (airline );
55+ return new ResponseEntity <>(newAirline , HttpStatus .CREATED );
56+ } catch (DocumentExistsException e ) {
6557 return new ResponseEntity <>(HttpStatus .CONFLICT );
58+ } catch (Exception e ) {
59+ return new ResponseEntity <>(HttpStatus .INTERNAL_SERVER_ERROR );
6660 }
6761
6862 }
6963
7064 @ PutMapping ("/{id}" )
71- public ResponseEntity <Airline > updateAirline (@ PathVariable String id ,@ Valid @ RequestBody Airline airline ) {
65+ public ResponseEntity <Airline > updateAirline (@ PathVariable String id , @ Valid @ RequestBody Airline airline ) {
7266 try {
73- airlineCol .replace (id , airline );
74- Airline updatedAirline = airlineCol .get (id ).contentAs (Airline .class );
75- return new ResponseEntity <>(updatedAirline , HttpStatus .OK );
76- } catch (Exception e ) {
67+ Airline updatedAirline = airlineService .updateAirline (id , airline );
68+ if (updatedAirline != null ) {
69+ return new ResponseEntity <>(updatedAirline , HttpStatus .OK );
70+ } else {
71+ return new ResponseEntity <>(HttpStatus .NOT_FOUND );
72+ }
73+ } catch (DocumentNotFoundException e ) {
7774 return new ResponseEntity <>(HttpStatus .NOT_FOUND );
75+ } catch (Exception e ) {
76+ return new ResponseEntity <>(HttpStatus .INTERNAL_SERVER_ERROR );
7877 }
7978 }
8079
8180 @ DeleteMapping ("/{id}" )
8281 public ResponseEntity <Void > deleteAirline (@ PathVariable String id ) {
8382 try {
84- airlineCol . remove (id );
83+ airlineService . deleteAirline (id );
8584 return new ResponseEntity <>(HttpStatus .NO_CONTENT );
86- } catch (Exception e ) {
85+ } catch (DocumentNotFoundException e ) {
8786 return new ResponseEntity <>(HttpStatus .NOT_FOUND );
87+ } catch (Exception e ) {
88+ return new ResponseEntity <>(HttpStatus .INTERNAL_SERVER_ERROR );
8889 }
8990 }
9091
9192 @ GetMapping ("/list" )
9293 public ResponseEntity <List <Airline >> listAirlines () {
9394 try {
94- String statement = "SELECT airline.id, airline.type, airline.name, airline.iata, airline.icao, airline.callsign, airline.country FROM `"
95- + dbProperties .getBucketName () + "`.`inventory`.`airline`" ;
96- List <Airline > airlines = cluster
97- .query (statement , QueryOptions .queryOptions ().scanConsistency (QueryScanConsistency .REQUEST_PLUS ))
98- .rowsAs (Airline .class );
95+ List <Airline > airlines = airlineService .listAirlines ();
9996 return new ResponseEntity <>(airlines , HttpStatus .OK );
10097 } catch (Exception e ) {
101- return new ResponseEntity <>(HttpStatus .NOT_FOUND );
98+ return new ResponseEntity <>(HttpStatus .INTERNAL_SERVER_ERROR );
10299 }
103100 }
104101
105102 @ GetMapping ("/country/{country}" )
106103 public ResponseEntity <List <Airline >> listAirlinesByCountry (@ PathVariable String country ) {
107104 try {
108- String statement = "SELECT airline.id, airline.type, airline.name, airline.iata, airline.icao, airline.callsign, airline.country FROM `"
109- + dbProperties .getBucketName () + "`.`inventory`.`airline` WHERE country = '" + country + "'" ;
110- List <Airline > airlines = cluster
111- .query (statement , QueryOptions .queryOptions ().scanConsistency (QueryScanConsistency .REQUEST_PLUS )
112- .parameters (JsonObject .create ().put ("country" , country )))
113- .rowsAs (Airline .class );
105+ List <Airline > airlines = airlineService .listAirlinesByCountry (country );
114106 return new ResponseEntity <>(airlines , HttpStatus .OK );
115107 } catch (Exception e ) {
116- return new ResponseEntity <>(HttpStatus .NOT_FOUND );
108+ return new ResponseEntity <>(HttpStatus .INTERNAL_SERVER_ERROR );
117109 }
118110 }
119-
120- @ GetMapping ("/destination/{destinationAirport}" )
121- public ResponseEntity <List <Airline >> listAirlinesByDestinationAirport (@ PathVariable String destinationAirport ) {
122- try {
123- 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 `"
124- + dbProperties .getBucketName () + "`.`inventory`.`route` JOIN `" + dbProperties .getBucketName ()
125- + "`.`inventory`.`airline` ON route.airlineid = META(airline).id WHERE route.destinationairport = "
126- + destinationAirport + ") AS subquery JOIN `" + dbProperties .getBucketName ()
127- + "`.`inventory`.`airline` AS air ON META(air).id = subquery.airlineId" ;
128- List <Airline > airlines = cluster
129- .query (statement ,
130- QueryOptions .queryOptions ().scanConsistency (QueryScanConsistency .REQUEST_PLUS )
131- .parameters (JsonObject .create ().put ("destinationAirport" , destinationAirport )))
132- .rowsAs (Airline .class );
133- return new ResponseEntity <>(airlines , HttpStatus .OK );
134- } catch (Exception e ) {
135- return new ResponseEntity <>(HttpStatus .NOT_FOUND );
136- }
137- }
138-
139- }
111+ }
0 commit comments