diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts
index 300e066b5b..923fb1f7cb 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts
@@ -3,6 +3,7 @@ import {Principal} from "../../principal";
import {Book} from "../../book";
import {Response} from "@angular/http";
import {HttpService} from "../../http.service";
+import {Observable} from "rxjs";
@Component({
selector: 'app-book-list',
@@ -30,7 +31,13 @@ export class BookListComponent implements OnInit {
loadBooks() {
this.httpService.getBooks()
.map((response: Response) => response.json())
- .map((data: any) => new Book(data.id, data.author, data.title))
+ .map(books => {
+ return Observable.from(books)
+ })
+ .flatMap(x => x)
+ .map((data: any) => {
+ return new Book(data.id, data.author, data.title)
+ })
.subscribe((book: Book) => {
console.log(book);
this.books.push(book);
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/http.service.ts b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/http.service.ts
index 95bce8c14c..aa07260b33 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/http.service.ts
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/http.service.ts
@@ -55,6 +55,11 @@ export class HttpService {
return this.http.delete("/rating-service/ratings/" + ratingId, options)
}
+ updateRating(rating: Rating, user: any) {
+ let options = this.makeAuthOptions(user);
+ return this.http.put("/rating-service/ratings/" + rating.id, rating, options)
+ }
+
private makeAuthOptions(user: any): RequestOptions {
let headers = new Headers({'Content-Type': 'application/json'});
headers.append('Authorization','Basic ' + btoa(user.username + ':' + user.password));
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.html b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.html
index e6d42ef22c..a6abbed0a1 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.html
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.html
@@ -19,6 +19,7 @@ Ratings:
+
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.ts b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.ts
index 4af0fea4fb..7d49935137 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.ts
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.ts
@@ -3,6 +3,7 @@ import {Rating} from "../rating";
import {Principal} from "../principal";
import {HttpService} from "../http.service";
import {Response} from "@angular/http";
+import {Observable} from "rxjs";
@Component({
selector: 'app-rating',
@@ -35,6 +36,10 @@ export class RatingComponent implements OnInit, OnChanges {
private loadRatings() {
this.httpService.getRatings(this.bookId, this.principal.credentials)
.map((response: Response) => response.json())
+ .map(ratings => {
+ return Observable.from(ratings)
+ })
+ .flatMap(x => x)
.map((data: any) => new Rating(data.id, data.bookId, data.stars))
.subscribe((rating: Rating) => {
console.log(rating);
@@ -54,6 +59,13 @@ export class RatingComponent implements OnInit, OnChanges {
});
}
+ updateRating() {
+ this.httpService.updateRating(this.newRating, this.principal.credentials)
+ .subscribe(() => {
+ this.newRating = new Rating(null, this.bookId, 1);
+ })
+ }
+
selectRating(rating: Rating) {
if (this.principal.isAdmin()) {
this.newRating = rating;
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java
new file mode 100644
index 0000000000..e9db77a462
--- /dev/null
+++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java
@@ -0,0 +1,25 @@
+package com.baeldung.spring.cloud.bootstrap.svcbook;
+
+import com.baeldung.spring.cloud.bootstrap.svcbook.book.Book;
+import com.baeldung.spring.cloud.bootstrap.svcbook.book.BookService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DataLoader implements ApplicationRunner {
+
+ private BookService bookService;
+
+ @Autowired
+ public DataLoader(BookService bookService) {
+ this.bookService = bookService;
+ }
+
+ @Override
+ public void run(ApplicationArguments applicationArguments) throws Exception {
+ this.bookService.createBook(new Book("Aldous Huxley", "Brave new world"));
+ this.bookService.createBook(new Book("George Orwell", "Animal Farm"));
+ }
+}
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java
index 33ea8dcb81..f087967bab 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java
+++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java
@@ -19,6 +19,11 @@ public class Book {
public Book() {
}
+ public Book(String author, String title) {
+ this.author = author;
+ this.title = title;
+ }
+
public Long getId() {
return id;
}
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java
new file mode 100644
index 0000000000..b12808cd62
--- /dev/null
+++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java
@@ -0,0 +1,28 @@
+package com.baeldung.spring.cloud.bootstrap.svcrating;
+
+import com.baeldung.spring.cloud.bootstrap.svcrating.rating.Rating;
+import com.baeldung.spring.cloud.bootstrap.svcrating.rating.RatingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DataLoader implements ApplicationRunner {
+
+ private RatingService ratingService;
+
+ @Autowired
+ public DataLoader(RatingService ratingService) {
+ this.ratingService = ratingService;
+ }
+
+ @Override
+ public void run(ApplicationArguments applicationArguments) throws Exception {
+ this.ratingService.createRating(new Rating(1L, 1));
+ this.ratingService.createRating(new Rating(1L, 2));
+ this.ratingService.createRating(new Rating(2L, 3));
+ this.ratingService.createRating(new Rating(2L, 4));
+ this.ratingService.createRating(new Rating(2L, 5));
+ }
+}
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java
index ae44f9ae2e..c37099f3c1 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java
+++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java
@@ -26,6 +26,11 @@ public class Rating {
this.stars = stars;
}
+ public Rating(Long bookId, int stars) {
+ this.bookId = bookId;
+ this.stars = stars;
+ }
+
public Long getId() {
return id;
}
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java
index b05d7e2f1f..6ab5e0acff 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java
+++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java
@@ -1,15 +1,14 @@
package com.baeldung.spring.cloud.bootstrap.svcrating.rating;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
+import com.google.common.base.Preconditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
-import com.google.common.base.Preconditions;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
@Service
@Transactional(readOnly = true)
@@ -58,6 +57,7 @@ public class RatingService {
return ratingRepository.save(rating);
}
+ @Transactional(propagation = Propagation.REQUIRED)
public Rating updateRating(Rating rating, Long ratingId) {
Preconditions.checkNotNull(rating);
Preconditions.checkState(rating.getId() == ratingId);
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/resources/data-h2.sql b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/resources/data-h2.sql
new file mode 100644
index 0000000000..75fe71f7b4
--- /dev/null
+++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/resources/data-h2.sql
@@ -0,0 +1,8 @@
+insert into book (id, author, title) values
+ (1, 1, 1),
+ (2, 1, 2),
+ (3, 2, 3),
+ (4, 2, 4),
+ (5, 3, 5),
+ (6, 3, 1),
+ (7, 3, 2);
\ No newline at end of file