SeriesController.java

package com.newbit.column.controller;

import com.newbit.auth.model.CustomUser;
import com.newbit.column.dto.request.CreateSeriesRequestDto;
import com.newbit.column.dto.request.UpdateSeriesRequestDto;
import com.newbit.column.dto.response.*;
import com.newbit.column.service.SeriesService;
import com.newbit.common.dto.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/series")
@Tag(name = "시리즈 API", description = "시리즈 관련 API")
public class SeriesController {

    private final SeriesService seriesService;

    @PostMapping
    @Operation(summary = "시리즈 생성", description = "기존 칼럼을 묶어 시리즈를 생성합니다.")
    public ApiResponse<CreateSeriesResponseDto> createSeries(
            @RequestBody @Valid CreateSeriesRequestDto dto,
            @AuthenticationPrincipal CustomUser customUser
            ) {
        return ApiResponse.success(seriesService.createSeries(dto, customUser.getUserId()));
    }

    @PatchMapping("/{seriesId}")
    @Operation(summary = "시리즈 수정", description = "기존 시리즈 정보를 수정합니다.")
    public ApiResponse<UpdateSeriesResponseDto> updateSeries(
            @PathVariable Long seriesId,
            @RequestBody @Valid UpdateSeriesRequestDto dto,
            @AuthenticationPrincipal CustomUser customUser
    ) {
        return ApiResponse.success(seriesService.updateSeries(seriesId, dto, customUser.getUserId()));
    }

    @DeleteMapping("/{seriesId}")
    @Operation(summary = "시리즈 삭제", description = "시리즈를 삭제하고, 연결된 칼럼의 시리즈 정보를 제거합니다.")
    public ApiResponse<Void> deleteSeries(
            @PathVariable Long seriesId,
            @AuthenticationPrincipal CustomUser customUser
    ) {
        seriesService.deleteSeries(seriesId, customUser.getUserId());
        return ApiResponse.success(null);
    }

    @GetMapping("/{seriesId}")
    @Operation(summary = "시리즈 상세 조회", description = "시리즈의 상세 정보를 조회합니다.")
    public ApiResponse<GetSeriesDetailResponseDto> getSeriesDetail(
            @PathVariable Long seriesId
    ) {
        return ApiResponse.success(seriesService.getSeriesDetail(seriesId));
    }

    @GetMapping("/my")
    @Operation(summary = "본인 시리즈 목록 조회", description = "멘토 본인이 생성한 시리즈 목록을 조회합니다.")
    public ApiResponse<List<GetMySeriesListResponseDto>> getMySeriesList(
            @AuthenticationPrincipal CustomUser customUser
    ) {
        return ApiResponse.success(seriesService.getMySeriesList(customUser.getUserId()));
    }

    @GetMapping("/{seriesId}/columns")
    @Operation(summary = "시리즈에 포함된 칼럼 목록 조회", description = "해당 시리즈에 포함된 칼럼 목록을 조회합니다.")
    public ApiResponse<List<GetSeriesColumnsResponseDto>> getSeriesColumns(
            @PathVariable Long seriesId
    ) {
        return ApiResponse.success(seriesService.getSeriesColumns(seriesId));
    }

}