72 lines
2.6 KiB
Java
72 lines
2.6 KiB
Java
|
|
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);
|
||
|
|
}
|
||
|
|
}
|