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을 발급받습니다.

 

게시글 생성

게시글 삭제

 


궁금한신점이나 잘못된 부분이 있으면 자유롭게 댓글 달아주세요.

github : https://github.com/jaeyeon423/spring_board_api