본문 바로가기

카테고리 없음

작성자만 수정 삭제

package com.teamsparta.task.comment.controller;

import com.teamsparta.task.comment.dto.CommentRequestDto;
import com.teamsparta.task.comment.dto.CommentResponseDto;
import com.teamsparta.task.comment.model.Comment;
import com.teamsparta.task.comment.service.CommentService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/api/comments")
@RequiredArgsConstructor
public class CommentController {

    private final CommentService commentService;

    @Operation(summary = "모든 댓글 조회")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "Fetched all comments.")
    })
    @GetMapping
    public ResponseEntity<List<CommentResponseDto>> getComments() {
        List<Comment> comments = commentService.findAllComments();
        List<CommentResponseDto> responseDtos = comments.stream()
                .map(comment -> new CommentResponseDto(
                        comment.getCommentId(),
                        comment.getContent(),
                        comment.getUser().getId().toString(),
                        comment.getCreatedAt().toString()
                ))
                .collect(Collectors.toList());

        return ResponseEntity.ok(responseDtos);
    }

    @Operation(summary = "댓글 추가")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "201", description = "Created the comment.")
    })
    @PostMapping
    public ResponseEntity<CommentResponseDto> addComment(
            @RequestBody CommentRequestDto commentRequest,
            @RequestParam Long todoId
//            @RequestParam String userId
    ) {
        // 현재 로그인한 사용자 ID 가져오기. 이 밑의 세줄이 바로 RequestParam없이 인식하는것
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        String currentUserId = authentication.getName();

        Comment createdComment = commentService.addComment(commentRequest, todoId, currentUserId);

        CommentResponseDto responseDto = new CommentResponseDto(
                createdComment.getCommentId(),
                createdComment.getContent(),
                createdComment.getUser().getId().toString(),
                createdComment.getCreatedAt().toString()
        );

        return new ResponseEntity<>(responseDto, HttpStatus.CREATED);
    }

    @Operation(summary = "댓글 수정")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "Updated the comment."),
            @ApiResponse(responseCode = "404", description = "Comment not found.")
    })
    @PutMapping("/{commentId}")
    public ResponseEntity<CommentResponseDto> updateComment(
            @PathVariable Long commentId,
            @RequestBody CommentRequestDto commentRequest,
            @RequestParam Long todoId
//            @RequestParam String userId
    ) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        String currentUserId = authentication.getName();
        // 댓글 업데이트
        Comment updatedComment = commentService.updateComment(commentId, commentRequest, todoId, currentUserId);

        CommentResponseDto responseDto = new CommentResponseDto(
                updatedComment.getCommentId(),
                updatedComment.getContent(),
                updatedComment.getUser().getId().toString(),
                updatedComment.getCreatedAt().toString()
        );

        return new ResponseEntity<>(responseDto, HttpStatus.OK);
    }

    @Operation(summary = "댓글 삭제")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "Deleted the comment."),
            @ApiResponse(responseCode = "404", description = "Comment not found.")
    })
    @DeleteMapping("/{commentId}")
    public ResponseEntity<String> deleteComment(@PathVariable Long commentId) {
        // 현재 로그인한 사용자 ID 가져오기
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        String currentUserId = authentication.getName(); // 사용자 ID 추출

        // 댓글 삭제
        commentService.deleteComment(commentId, currentUserId);
        return new ResponseEntity<>("댓글이 삭제되었습니다.", HttpStatus.OK);
    }
}

 

 

  • 댓글 작성 (addComment 메서드):
    • 기술적 설명: SecurityContextHolder.getContext().getAuthentication().getName()을 사용하여 현재 로그인한 사용자의 ID를 가져옵니다.
    • 적용 방식: 로그인한 사용자만 댓글을 추가할 수 있도록 사용자의 ID를 서비스 메서드에 전달합니다. 서비스 메서드는 이 ID를 사용하여 댓글을 작성합니다.
  • 댓글 수정 (updateComment 메서드):
    • 기술적 설명: SecurityContextHolder를 통해 현재 로그인한 사용자의 ID를 가져와서, 댓글의 작성자 ID와 비교합니다.
    • 적용 방식: 댓글 수정 요청 시, 현재 사용자의 ID와 댓글 작성자의 ID를 비교하여 일치할 경우에만 댓글을 수정할 수 있도록 합니다.
  • 댓글 삭제 (deleteComment 메서드):
    • 기술적 설명: 마찬가지로 SecurityContextHolder를 사용하여 로그인한 사용자의 ID를 확인합니다.
    • 적용 방식: 댓글 삭제 요청 시, 현재 사용자의 ID와 댓글 작성자의 ID를 비교하여 일치할 경우에만 댓글을 삭제할 수 있도록 합니다.