728x90
이전글
체크사항
- 포스트 수정 / 삭제
- ADMIN회원이나 글을 작성한 일반회원이 글에 대한 수정과 삭제를 할 수 있다.
Controller
...
public class PostController {
private final PostService postService;
...
@PutMapping("/{postId}")
public Response<PostResponse> modifiedPost(@PathVariable Integer postId,
@RequestBody PostModifyRequest dto,
Authentication authentication) {
String userName = authentication.getName();
Post post = postService.modifyPost(postId, dto, userName);
return Response.success(new PostResponse("포스트 수정 완료", post.getId()));
}
}
기존의 데이터를 대체하는 작업으로 HTTP의 PUT메서드를 사용합니다.
게시물을 수정해야 하므로 게시물을 특정할 수 있는 postId, 수정할 내용을 담은 dto, 그리고 토큰 정보를 가지고 있는 authentication 세 가지의 정보를 받아온 뒤 서비스 파라미터로 함께 넘겨줬다.
예외 없이 Post 정보를 받아온다면 해당 post변수에는 수정된 Post의 정보가 담겨 있을 것이고, 그 post의 Id를 반환했다.
Service
...
public class PostService {
private final PostRepository postRepository;
private final UserRepository userRepository;
...
public Post modifyPost(Integer postId, PostModifyRequest dto, String userName) {
// user가 찾아지지 않는다면 수정할 수 없다.
User user = userRepository.findByUserName(userName)
.orElseThrow(
() -> new SNSAppException(ErrorCode.USERNAME_NOT_FOUND, "일치하지 않은 회원 입니다.")
);
// post가 찾아지지 않는다면 수정할 수 없다.
Post post = postRepository.findById(postId)
.orElseThrow(
() -> new SNSAppException(ErrorCode.POST_NOT_FOUND, "해당 포스트가 없습니다.")
);
// User가 관리자가 아닌데, User와 Post를 작성한 User가 다르면 수정할 수 없다.
if (!user.getUserRole().equals(ADMIN) && !user.getId().equals(post.getUser().getId())) {
throw new SNSAppException(INVALID_PERMISSION, "사용자가 권한이 없습니다.");
}
modifyPostTitleAndBodyAndLastModifiedAt(dto, post);
postRepository.save(post);
return post;
}
private void modifyPostTitleAndBodyAndLastModifiedAt(PostModifyRequest dto, Post post) {
post.setTitle(dto.getTitle());
post.setBody(dto.getBody());
post.setLastModifiedAt(LocalDateTime.now());
}
}
- 넘어온 userName으로 User의 정보를 먼저 찾습니다. userName으로 검색한 결과가 없다면 잘못된 토큰을 받아온 경우이므로 예외를 발생시킵니다.
- 넘어온 postId로 Post 정보를 찾습니다. Post의 결과가 없다면 해당 게시물은 존재하지 않으므로 예외를 발생시킵니다.
- User가 관리자가 아님에도 Post작성자와 해당 Post를 수정하려는 User의 정보가 다르다면 예외를 발생시킵니다.
- post정보에 수정시킬 dto를 대입시킨 후 다시 save합니다.
결과
수정 전 DB
수정 api 실행
수정 후 DB
다음글
반응형
'프로젝트 > Archive' 카테고리의 다른 글
[JWT] JWT Exception 처리 (0) | 2022.12.25 |
---|---|
[03] 게시된 포스트 삭제 (0) | 2022.12.23 |
[03] 게시된 모든 포스트 목록 보기 (0) | 2022.12.23 |
[03] 포스트 단건 상세 정보 보기 만들기 (0) | 2022.12.23 |
[03] 포스트 등록 만들기 (0) | 2022.12.23 |