spring-boot-realworld-examp.../src/main/java/io/spring/api/ArticleApi.java

92 lines
3.7 KiB
Java
Raw Normal View History

2017-08-15 10:21:55 +07:00
package io.spring.api;
2017-08-15 13:17:54 +07:00
import com.fasterxml.jackson.annotation.JsonRootName;
import io.spring.api.exception.NoAuthorizationException;
2017-08-15 10:21:55 +07:00
import io.spring.api.exception.ResourceNotFoundException;
2017-08-18 16:08:27 +07:00
import io.spring.core.service.AuthorizationService;
import io.spring.application.data.ArticleData;
import io.spring.application.ArticleQueryService;
2017-08-15 13:17:54 +07:00
import io.spring.core.article.ArticleRepository;
2017-08-15 10:21:55 +07:00
import io.spring.core.user.User;
2017-08-15 13:17:54 +07:00
import lombok.Getter;
import lombok.NoArgsConstructor;
2017-08-15 10:21:55 +07:00
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
2017-08-15 13:35:29 +07:00
import org.springframework.web.bind.annotation.DeleteMapping;
2017-08-15 10:21:55 +07:00
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
2017-08-15 13:17:54 +07:00
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
2017-08-15 10:21:55 +07:00
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
2017-08-15 13:17:54 +07:00
import javax.validation.Valid;
2017-08-15 16:52:23 +07:00
import java.util.HashMap;
import java.util.Map;
2017-08-15 13:17:54 +07:00
2017-08-15 10:21:55 +07:00
@RestController
@RequestMapping(path = "/articles/{slug}")
public class ArticleApi {
private ArticleQueryService articleQueryService;
2017-08-15 13:17:54 +07:00
private ArticleRepository articleRepository;
2017-08-15 10:21:55 +07:00
@Autowired
2017-08-15 13:17:54 +07:00
public ArticleApi(ArticleQueryService articleQueryService, ArticleRepository articleRepository) {
2017-08-15 10:21:55 +07:00
this.articleQueryService = articleQueryService;
2017-08-15 13:17:54 +07:00
this.articleRepository = articleRepository;
2017-08-15 10:21:55 +07:00
}
@GetMapping
2017-08-15 16:52:23 +07:00
public ResponseEntity<?> article(@PathVariable("slug") String slug,
2017-08-18 16:40:21 +07:00
@AuthenticationPrincipal User user) {
2017-08-15 16:52:23 +07:00
return articleQueryService.findBySlug(slug, user)
.map(articleData -> ResponseEntity.ok(articleResponse(articleData)))
.orElseThrow(ResourceNotFoundException::new);
2017-08-15 10:21:55 +07:00
}
2017-08-15 13:17:54 +07:00
@PutMapping
2017-08-15 16:52:23 +07:00
public ResponseEntity<?> updateArticle(@PathVariable("slug") String slug,
2017-08-18 16:40:21 +07:00
@AuthenticationPrincipal User user,
@Valid @RequestBody UpdateArticleParam updateArticleParam) {
2017-08-15 13:17:54 +07:00
return articleRepository.findBySlug(slug).map(article -> {
2017-08-15 13:35:29 +07:00
if (!AuthorizationService.canWriteArticle(user, article)) {
2017-08-15 13:17:54 +07:00
throw new NoAuthorizationException();
}
article.update(
updateArticleParam.getTitle(),
updateArticleParam.getDescription(),
updateArticleParam.getBody());
articleRepository.save(article);
2017-08-15 16:52:23 +07:00
return ResponseEntity.ok(articleResponse(articleQueryService.findBySlug(slug, user).get()));
2017-08-15 13:17:54 +07:00
}).orElseThrow(ResourceNotFoundException::new);
}
2017-08-15 13:35:29 +07:00
@DeleteMapping
public ResponseEntity deleteArticle(@PathVariable("slug") String slug,
@AuthenticationPrincipal User user) {
return articleRepository.findBySlug(slug).map(article -> {
if (!AuthorizationService.canWriteArticle(user, article)) {
throw new NoAuthorizationException();
}
articleRepository.remove(article);
return ResponseEntity.noContent().build();
}).orElseThrow(ResourceNotFoundException::new);
}
2017-08-15 16:52:23 +07:00
private Map<String, Object> articleResponse(ArticleData articleData) {
return new HashMap<String, Object>() {{
put("article", articleData);
}};
}
2017-08-15 13:17:54 +07:00
}
@Getter
@NoArgsConstructor
@JsonRootName("article")
class UpdateArticleParam {
private String title = "";
private String body = "";
private String description = "";
2017-08-15 10:21:55 +07:00
}