CollabPort.java

package com.yumu.noveltranslator.port.in;

import com.yumu.noveltranslator.domain.model.Document;
import com.yumu.noveltranslator.port.dto.collab.CollabProjectResponse;
import com.yumu.noveltranslator.port.dto.collab.CreateCollabProjectRequest;
import com.yumu.noveltranslator.port.dto.collab.InviteMemberRequest;
import com.yumu.noveltranslator.port.dto.collab.ProjectMemberResponse;
import com.yumu.noveltranslator.port.dto.common.PageResponse;
import com.yumu.noveltranslator.enums.CollabProjectStatus;

public interface CollabPort {
    CollabProjectResponse createProject(CreateCollabProjectRequest request, Long userId);
    TeamProjectCreateResult createProjectFromDocument(Long userId, Long documentId, String documentName,
                                                      String filePath, String fileType,
                                                      String sourceLang, String targetLang);
    int addChaptersToProject(Long userId, Long projectId, Document document);
    void startMultiAgentTranslation(Long projectId);
    CollabProjectResponse getProjectById(Long projectId);
    PageResponse<CollabProjectResponse> listByUserId(Long userId, int page, int pageSize);
    CollabProjectResponse updateProject(Long projectId, CreateCollabProjectRequest request, Long userId);
    void changeProjectStatus(Long projectId, CollabProjectStatus targetStatus, Long userId);
    InviteCodeResult generateInviteCode(Long projectId, Long operatorId);
    ProjectMemberResponse inviteMember(Long projectId, InviteMemberRequest request, Long inviterId);
    ProjectMemberResponse joinByInviteCode(String inviteCode, Long userId);
    PageResponse<ProjectMemberResponse> getMembers(Long projectId, int page, int pageSize);
    void removeMember(Long projectId, Long memberId, Long operatorId);
    void deleteProject(Long projectId, Long userId);

    record TeamProjectCreateResult(Long projectId, String documentName, int chapterCount) {}
    record InviteCodeResult(String code, java.time.LocalDateTime expiresAt) {}
}