Skip to content

Commit 8c013f1

Browse files
committed
refactor to MVC pattern with controllers,services and repositories
1 parent 91e97dc commit 8c013f1

21 files changed

+1033
-733
lines changed
Lines changed: 38 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package org.couchbase.quickstart.springboot.controllers;
22

3-
import java.net.URI;
43
import java.util.List;
54

65
import javax.validation.Valid;
76

8-
import org.couchbase.quickstart.springboot.configs.DBProperties;
97
import org.couchbase.quickstart.springboot.models.Airline;
8+
import org.couchbase.quickstart.springboot.services.AirlineService;
109
import org.springframework.http.HttpStatus;
1110
import org.springframework.http.ResponseEntity;
1211
import org.springframework.web.bind.annotation.CrossOrigin;
@@ -19,121 +18,94 @@
1918
import org.springframework.web.bind.annotation.RequestMapping;
2019
import org.springframework.web.bind.annotation.RestController;
2120

21+
import com.couchbase.client.core.error.DocumentExistsException;
2222
import 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")
3327
public 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+
}

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

Lines changed: 40 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package org.couchbase.quickstart.springboot.controllers;
22

3-
import java.net.URI;
43
import java.util.List;
54

65
import javax.validation.Valid;
76

8-
import org.couchbase.quickstart.springboot.configs.DBProperties;
97
import org.couchbase.quickstart.springboot.models.Airport;
8+
import org.couchbase.quickstart.springboot.services.AirportService;
109
import org.springframework.http.HttpStatus;
1110
import org.springframework.http.ResponseEntity;
1211
import org.springframework.web.bind.annotation.DeleteMapping;
@@ -19,99 +18,93 @@
1918
import org.springframework.web.bind.annotation.RequestParam;
2019
import org.springframework.web.bind.annotation.RestController;
2120

22-
import com.couchbase.client.java.Bucket;
23-
import com.couchbase.client.java.Cluster;
24-
import com.couchbase.client.java.Collection;
25-
import com.couchbase.client.java.query.QueryOptions;
26-
import com.couchbase.client.java.query.QueryScanConsistency;
27-
21+
import com.couchbase.client.core.error.DocumentExistsException;
22+
import com.couchbase.client.core.error.DocumentNotFoundException;
2823

2924
@RestController
3025
@RequestMapping("/api/v1/airport")
3126
public class AirportController {
3227

33-
private Cluster cluster;
34-
private Collection airportCol;
35-
private DBProperties dbProperties;
36-
private Bucket bucket;
28+
private final AirportService airportService;
3729

38-
public AirportController(Cluster cluster, Bucket bucket, DBProperties dbProperties) {
39-
System.out.println("Initializing airport controller, cluster: " + cluster + "; bucket: " + bucket);
40-
this.cluster = cluster;
41-
this.bucket = bucket;
42-
this.airportCol = bucket.scope("inventory").collection("airport");
43-
this.dbProperties = dbProperties;
30+
public AirportController(AirportService airportService) {
31+
this.airportService = airportService;
4432
}
4533

4634
@GetMapping("/{id}")
4735
public ResponseEntity<Airport> getAirport(@PathVariable String id) {
4836
try {
49-
Airport airport = airportCol.get(id).contentAs(Airport.class);
50-
return new ResponseEntity<>(airport, HttpStatus.OK);
51-
} catch (Exception e) {
37+
Airport airport = airportService.getAirportById(id);
38+
if (airport != null) {
39+
return new ResponseEntity<>(airport, HttpStatus.OK);
40+
} else {
41+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
42+
}
43+
} catch (DocumentNotFoundException e) {
5244
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
45+
} catch (Exception e) {
46+
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
5347
}
5448
}
5549

5650
@PostMapping("/{id}")
57-
public ResponseEntity<Airport> createAirport(@PathVariable String id,@Valid @RequestBody Airport airport) {
51+
public ResponseEntity<Airport> createAirport(@PathVariable String id, @Valid @RequestBody Airport airport) {
5852
try {
59-
airportCol.insert(id, airport);
60-
Airport createdAirport = airportCol.get(id).contentAs(Airport.class);
61-
return ResponseEntity.created(new URI("/api/v1/airport/" + id)).body(createdAirport);
62-
} catch (Exception e) {
53+
Airport newAirport = airportService.createAirport(airport);
54+
return new ResponseEntity<>(newAirport, HttpStatus.CREATED);
55+
} catch (DocumentExistsException e) {
6356
return new ResponseEntity<>(HttpStatus.CONFLICT);
57+
} catch (Exception e) {
58+
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
6459
}
60+
6561
}
6662

6763
@PutMapping("/{id}")
68-
public ResponseEntity<Airport> updateAirport(@PathVariable String id,@Valid @RequestBody Airport airport) {
64+
public ResponseEntity<Airport> updateAirport(@PathVariable String id, @Valid @RequestBody Airport airport) {
6965
try {
70-
airportCol.replace(id, airport);
71-
Airport updatedAirport = airportCol.get(id).contentAs(Airport.class);
72-
return new ResponseEntity<>(updatedAirport, HttpStatus.OK);
73-
} catch (Exception e) {
66+
Airport updatedAirport = airportService.updateAirport(id, airport);
67+
if (updatedAirport != null) {
68+
return new ResponseEntity<>(updatedAirport, HttpStatus.OK);
69+
} else {
70+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
71+
}
72+
} catch (DocumentNotFoundException e) {
7473
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
74+
} catch (Exception e) {
75+
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
7576
}
7677
}
7778

7879
@DeleteMapping("/{id}")
7980
public ResponseEntity<Void> deleteAirport(@PathVariable String id) {
8081
try {
81-
airportCol.remove(id);
82+
airportService.deleteAirport(id);
8283
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
83-
} catch (Exception e) {
84+
} catch (DocumentNotFoundException e) {
8485
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
86+
} catch (Exception e) {
87+
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
8588
}
8689
}
8790

8891
@GetMapping("/list")
8992
public ResponseEntity<List<Airport>> listAirports() {
9093
try {
91-
String statement = "SELECT airport.* FROM `" + dbProperties.getBucketName() + "`.`inventory`.`airport`";
92-
List<Airport> airports = cluster
93-
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
94-
.rowsAs(Airport.class);
94+
List<Airport> airports = airportService.listAirports();
9595
return new ResponseEntity<>(airports, HttpStatus.OK);
9696
} catch (Exception e) {
97-
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
97+
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
9898
}
9999
}
100100

101101
@GetMapping("/direct-connections")
102102
public ResponseEntity<List<Airport>> listDirectConnections(@RequestParam String airportCode) {
103103
try {
104-
String statement = "SELECT airport.* FROM `" + dbProperties.getBucketName()
105-
+ "`.`inventory`.`airport` as airport JOIN `" + dbProperties.getBucketName()
106-
+ "`.`inventory`.`route` as route on route.sourceairport = airport.faa WHERE airport.faa = \""
107-
+ airportCode + "\" and route.stops = 0";
108-
List<Airport> airports = cluster
109-
.query(statement, QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
110-
.rowsAs(Airport.class);
111-
104+
List<Airport> airports = airportService.listDirectConnections(airportCode);
112105
return new ResponseEntity<>(airports, HttpStatus.OK);
113106
} catch (Exception e) {
114-
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
107+
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
115108
}
116109
}
117110

0 commit comments

Comments
 (0)