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