ChapterTaskController.java

package com.yumu.noveltranslator.adapter.in.rest.collab;

import com.yumu.noveltranslator.port.dto.common.Result;
import com.yumu.noveltranslator.port.dto.common.PageResponse;
import com.yumu.noveltranslator.port.dto.collab.ChapterTaskResponse;
import com.yumu.noveltranslator.port.dto.collab.AssignChapterRequest;
import com.yumu.noveltranslator.port.dto.collab.SubmitChapterRequest;
import com.yumu.noveltranslator.port.dto.collab.ReviewChapterRequest;
import com.yumu.noveltranslator.enums.ProjectMemberRole;
import com.yumu.noveltranslator.adapter.in.security.annotation.RequireProjectAccess;
import com.yumu.noveltranslator.port.in.ChapterTaskPort;
import com.yumu.noveltranslator.util.SecurityUtil;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;


import java.util.List;

/**
 * 章节任务管理 Controller
 */
@RestController
@RequestMapping("/v1/collab")
@RequiredArgsConstructor
@Slf4j
public class ChapterTaskController {

    private final ChapterTaskPort chapterTaskPort;

    @PutMapping("/chapters/{chapterId}/assign")
    public Result<ChapterTaskResponse> assignChapter(@PathVariable Long chapterId,
                                                       @Valid @RequestBody AssignChapterRequest request) {
        Long assignerId = SecurityUtil.getRequiredUserId();
        ChapterTaskResponse chapter = chapterTaskPort.assignChapter(chapterId, request.getAssigneeId(), assignerId);
        return Result.ok(chapter);
    }

    @PutMapping("/chapters/{chapterId}/submit")
    public Result<ChapterTaskResponse> submitChapter(@PathVariable Long chapterId,
                                                       @Valid @RequestBody SubmitChapterRequest request) {
        ChapterTaskResponse chapter = chapterTaskPort.submitChapter(chapterId, request.getTranslatedText());
        return Result.ok(chapter);
    }

    @PutMapping("/chapters/{chapterId}/review")
    public Result<ChapterTaskResponse> reviewChapter(@PathVariable Long chapterId,
                                                       @Valid @RequestBody ReviewChapterRequest request) {
        Long reviewerId = SecurityUtil.getRequiredUserId();
        ChapterTaskResponse chapter = chapterTaskPort.reviewChapter(chapterId, request.getApproved(), request.getComment(), reviewerId);
        return Result.ok(chapter);
    }

    @GetMapping("/chapters/{chapterId}")
    public Result<ChapterTaskResponse> getChapter(@PathVariable Long chapterId) {
        Long userId = SecurityUtil.getRequiredUserId();
        ChapterTaskResponse chapter = chapterTaskPort.getChapterById(chapterId, userId);
        return Result.ok(chapter);
    }

    @GetMapping("/chapters/my")
    public Result<PageResponse<ChapterTaskResponse>> listMyChapters(
            @RequestParam(required = false, defaultValue = "1") Integer page,
            @RequestParam(required = false, defaultValue = "20") Integer pageSize) {
        Long userId = SecurityUtil.getRequiredUserId();
        PageResponse<ChapterTaskResponse> chapters = chapterTaskPort.listByAssigneeId(userId, page, pageSize);
        return Result.ok(chapters);
    }
}