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
|
|
|
}
|