BAEL-684 Adding spring JPA to resource servers
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user