BAEL-684 Adding spring JPA to resource servers

This commit is contained in:
tschiman
2017-02-11 11:52:16 -07:00
parent c670ac9166
commit c1b9675c43
18 changed files with 487 additions and 133 deletions

View File

@@ -3,39 +3,11 @@ package com.baeldung.spring.cloud.bootstrap.svcrating;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@SpringBootApplication
@EnableEurekaClient
@RestController
@RequestMapping("/ratings")
public class RatingServiceApplication {
public static void main(String[] args) {
SpringApplication.run(RatingServiceApplication.class, args);
}
private List<Rating> ratingList = Arrays.asList(
new Rating(1L, 1L, 2),
new Rating(2L, 1L, 3),
new Rating(3L, 2L, 4),
new Rating(4L, 2L, 5)
);
@GetMapping("")
public List<Rating> findRatingsByBookId(@RequestParam Long bookId) {
return bookId == null || bookId.equals(0L) ? Collections.EMPTY_LIST : ratingList.stream().filter(r -> r.getBookId().equals(bookId)).collect(Collectors.toList());
}
@GetMapping("/all")
public List<Rating> findAllRatings() {
return ratingList;
}
}

View File

@@ -2,6 +2,7 @@ package com.baeldung.spring.cloud.bootstrap.svcrating;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
@@ -22,8 +23,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
http.httpBasic()
.disable()
.authorizeRequests()
.antMatchers("/ratings").hasRole("USER")
.antMatchers("/ratings/all").hasRole("ADMIN")
.regexMatchers("^/ratings\\?bookId.*$").authenticated()
.antMatchers(HttpMethod.POST,"/ratings").authenticated()
.antMatchers(HttpMethod.PATCH,"/ratings/*").hasRole("ADMIN")
.antMatchers(HttpMethod.DELETE,"/ratings/*").hasRole("ADMIN")
.antMatchers(HttpMethod.GET,"/ratings").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.csrf()

View File

@@ -1,6 +1,18 @@
package com.baeldung.spring.cloud.bootstrap.svcrating;
package com.baeldung.spring.cloud.bootstrap.svcrating.rating;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class Rating {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Long bookId;
private int stars;

View File

@@ -0,0 +1,38 @@
package com.baeldung.spring.cloud.bootstrap.svcrating.rating;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/ratings")
public class RatingController {
@Autowired
private RatingService ratingService;
@GetMapping("")
public List<Rating> findRatingsByBookId(@RequestParam(required = false, defaultValue = "0") Long bookId) {
if (bookId.equals(0L)) {
return ratingService.findAllRatings();
}
return ratingService.findRatingsByBookId(bookId);
}
@PostMapping("")
public Rating createRating(@RequestBody Rating rating) {
return ratingService.createRating(rating);
}
@DeleteMapping("/{ratingId}")
public void deleteRating(@PathVariable Long ratingId) {
ratingService.deleteRating(ratingId);
}
@PatchMapping("/{ratingId")
public Rating updateRating(@RequestBody Map<String, String> updates, @PathVariable Long ratingId) {
return ratingService.updateRating(updates, ratingId);
}
}

View File

@@ -0,0 +1,11 @@
package com.baeldung.spring.cloud.bootstrap.svcrating.rating;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(HttpStatus.NOT_FOUND)
class RatingNotFoundException extends RuntimeException {
RatingNotFoundException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,9 @@
package com.baeldung.spring.cloud.bootstrap.svcrating.rating;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
interface RatingRepository extends JpaRepository<Rating, Long>{
List<Rating> findRatingsByBookId(Long bookId);
}

View File

@@ -0,0 +1,57 @@
package com.baeldung.spring.cloud.bootstrap.svcrating.rating;
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 java.util.List;
import java.util.Map;
import java.util.Optional;
@Service
@Transactional(readOnly = true)
public class RatingService {
@Autowired
private RatingRepository ratingRepository;
public Rating findRatingById(Long ratingId) {
return Optional.ofNullable(ratingRepository.findOne(ratingId))
.orElseThrow(() -> new RatingNotFoundException("Rating not found. ID: " + ratingId));
}
public List<Rating> findRatingsByBookId(Long bookId) {
return ratingRepository.findRatingsByBookId(bookId);
}
public List<Rating> findAllRatings() {
return ratingRepository.findAll();
}
@Transactional(propagation = Propagation.REQUIRED)
public Rating createRating(Rating rating) {
Rating newRating = new Rating();
newRating.setBookId(rating.getBookId());
newRating.setStars(rating.getStars());
return ratingRepository.save(newRating);
}
@Transactional(propagation = Propagation.REQUIRED)
public void deleteRating(Long ratingId) {
ratingRepository.delete(ratingId);
}
@Transactional(propagation = Propagation.REQUIRED)
public Rating updateRating(Map<String, String> updates, Long ratingId) {
Rating rating = findRatingById(ratingId);
updates.keySet().forEach(key -> {
switch (key) {
case "stars":
rating.setStars(Integer.parseInt(updates.get(key)));
break;
}
});
return ratingRepository.save(rating);
}
}