spring/게시판 api
Spring boot 게시판 API 서버 제작 (21) - 게시글 - 삭제
얼킴
2023. 3. 5. 15:20
이번에는 게시글 삭제 기능을 구현해 보겠습니다.
File 삭제 -> Post 삭제 -> Post Controller 요청 순으로 진행하겠습니다.
File 삭제
LocalFileService
@Override
public void delete(String filename) {
new File(location + filename).delete();
}
파라미터로 filename을 받아 file을 삭제합니다.
Post 삭제
PostService
@Transactional
public void delete(Long id){
Post post = postRepository.findById(id).orElseThrow(PostNotFoundException::new);
deleteImages(post.getImages());
postRepository.delete(post);
}
private void deleteImages(List<Image> images){
images.stream().forEach(i -> fileService.delete(i.getUniqueName()));
}
id를 받아 post를 불러오고 위에서 생성한 file delete메서트를 불러서 파일을 삭제합니다. 그리고 postRepository의 delete메서드를 불러서 post 를 삭제합니다.
PostController 요청
PostController
@ApiOperation(value = "게시글 삭제", notes = "게시글을 삭제한다.")
@DeleteMapping("/api/posts/{id}")
@ResponseStatus(HttpStatus.OK)
public Response delete(@ApiParam(value = "게시글 id", required = true) @PathVariable Long id) {
postService.delete(id);
return Response.success();
}
게시글 삭제는 작성자와 관리자만 가능하기 때문에 Member에서 delete할 때 와 동일한 로직으로 처리 됩니다.
PostGuard
@Component
@RequiredArgsConstructor
@Slf4j
public class PostGuard {
private final AuthHelper authHelper;
private final PostRepository postRepository;
public boolean check(Long id){
return authHelper.isAuthenticated() && hasAuthority(id);
}
private boolean hasAuthority(Long id) {
return hasAdminRole() || isResourceOwner(id);
}
private boolean isResourceOwner(Long id){
Post post = postRepository.findById(id).orElseThrow(() -> {throw new AccessDeniedException();});
Long memberId = authHelper.extractMemberId();
log.info("isResourceOwner : {}",post.getMember().getId().equals(memberId));
return post.getMember().getId().equals(memberId);
}
private boolean hasAdminRole() {
log.info("hasAdminRole : {}",authHelper.extractMemberRoles().contains(RoleType.ROLE_ADMIN) );
return authHelper.extractMemberRoles().contains(RoleType.ROLE_ADMIN);
}
}
API 테스트
Sign-in
먼저 로그인을 통해 access token을 발급받습니다.
게시글 생성
게시글 삭제
궁금한신점이나 잘못된 부분이 있으면 자유롭게 댓글 달아주세요.