Skip to content

Commit ddbf2e0

Browse files
committed
added initial models and controllers
1 parent e2692a4 commit ddbf2e0

File tree

6 files changed

+161
-16
lines changed

6 files changed

+161
-16
lines changed

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@
7575
<artifactId>java-client</artifactId>
7676
<version>${couchbase.version}</version>
7777
</dependency>
78+
<dependency>
79+
<groupId>org.projectlombok</groupId>
80+
<artifactId>lombok</artifactId>
81+
<version>1.18.30</version>
82+
</dependency>
7883
<!-- https://mvnrepository.com/artifact/org.mindrot/jbcrypt -->
7984
<dependency>
8085
<groupId>org.mindrot</groupId>

src/main/java/org/couchbase/quickstart/configs/DBProperties.java

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
import org.springframework.beans.factory.annotation.Value;
44
import org.springframework.context.annotation.Configuration;
55

6+
import lombok.Getter;
7+
68
@Configuration
9+
@Getter
710
public class DBProperties {
811

912
@Value("${spring.couchbase.bootstrap-hosts}")
@@ -14,19 +17,8 @@ public class DBProperties {
1417
private String password;
1518
@Value("${spring.couchbase.bucket.name}")
1619
private String bucketName;
17-
18-
public String getHostName() {
19-
return hostName;
20-
}
21-
public String getUsername() {
22-
return username;
23-
}
24-
public String getPassword() {
25-
return password;
26-
}
27-
public String getBucketName() {
28-
return bucketName;
29-
}
20+
@Value("${spring.couchbase.bucket.scope}")
21+
private String scopeName;
3022

3123

3224
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
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+
}

src/main/java/org/couchbase/quickstart/controllers/ProfileController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public ResponseEntity<List<Profile>> getProfiles(
145145
+"%' OR lower(p.lastName) LIKE '%"+search.toLowerCase()+"%' LIMIT "+limit+" OFFSET "+skip;
146146
System.out.println("Query="+qryString);
147147
//TBD with params: final List<Profile> profiles = cluster.query("SELECT p.* FROM `$bucketName`.`_default`.`$collectionName` p WHERE lower(p.firstName) LIKE '$search' OR lower(p.lastName) LIKE '$search' LIMIT $limit OFFSET $skip",
148-
final List<Profile> profiles =
148+
final List<Profile> profiles =
149149
cluster.query(qryString,
150150
QueryOptions.queryOptions().scanConsistency(QueryScanConsistency.REQUEST_PLUS))
151151
.rowsAs(Profile.class);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.couchbase.quickstart.models;
2+
3+
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.Setter;
8+
9+
import java.io.Serializable;
10+
11+
@Getter
12+
@Setter
13+
@AllArgsConstructor
14+
@NoArgsConstructor
15+
public class Airline implements Serializable {
16+
17+
private String id;
18+
19+
private String type;
20+
21+
private String name;
22+
23+
private String iata;
24+
25+
private String icao;
26+
27+
private String callsign;
28+
29+
private String country;
30+
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
spring.couchbase.bootstrap-hosts=localhost
2-
spring.couchbase.bucket.name=user_profile_spring
3-
spring.couchbase.bucket.user=Administrator
2+
spring.couchbase.bucket.name=travel-sample
3+
spring.couchbase.bucket.user=kaustav
4+
spring.couchbase.bucket.scope=inventory
45
spring.couchbase.bucket.password=password
56
spring.mvc.pathmatch.matching-strategy=ant_path_matcher

0 commit comments

Comments
 (0)