gc-guide-api/src/main/java/com/gcsc/guide/controller/IssueController.java

72 lines
2.6 KiB
Java
Raw Normal View 히스토리

package com.gcsc.guide.controller;
import com.gcsc.guide.dto.*;
import com.gcsc.guide.service.IssueService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;
import java.net.URI;
import java.util.Map;
/**
* 이슈 관리 API
*/
@RestController
@RequestMapping("/api/issues")
@RequiredArgsConstructor
public class IssueController {
private final IssueService issueService;
/** 이슈 목록 (status 필터, 페이징) */
@GetMapping
public ResponseEntity<Page<IssueResponse>> getIssues(
@RequestParam(required = false) String status,
@PageableDefault(size = 20, sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable) {
return ResponseEntity.ok(issueService.getIssues(status, pageable));
}
/** 이슈 생성 */
@PostMapping
public ResponseEntity<IssueResponse> createIssue(
Authentication authentication,
@Valid @RequestBody CreateIssueRequest request) {
Long authorId = (Long) authentication.getPrincipal();
IssueResponse issue = issueService.createIssue(authorId, request);
return ResponseEntity.created(URI.create("/api/issues/" + issue.id())).body(issue);
}
/** 이슈 상세 (코멘트 포함) */
@GetMapping("/{id}")
public ResponseEntity<Map<String, Object>> getIssue(@PathVariable Long id) {
return ResponseEntity.ok(issueService.getIssueDetail(id));
}
/** 이슈 수정 */
@PutMapping("/{id}")
public ResponseEntity<IssueResponse> updateIssue(
@PathVariable Long id,
@RequestBody UpdateIssueRequest request) {
return ResponseEntity.ok(issueService.updateIssue(id, request));
}
/** 코멘트 추가 */
@PostMapping("/{id}/comments")
public ResponseEntity<IssueCommentResponse> addComment(
@PathVariable Long id,
Authentication authentication,
@Valid @RequestBody CreateCommentRequest request) {
Long authorId = (Long) authentication.getPrincipal();
IssueCommentResponse comment = issueService.addComment(id, authorId, request.body());
return ResponseEntity.created(URI.create("/api/issues/" + id + "/comments/" + comment.id()))
.body(comment);
}
}