ci: Prettier纳入两层防御体系 (#520)
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Frontend Lint (push) Successful in 1m6s
CI Build & Deploy Pipeline / Build Staging Web Image (push) Successful in 1m49s
CI Build & Deploy Pipeline / Build Production API Image (push) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (push) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (push) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (push) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 3m1s
CI/CD Pipeline / Unit Tests (push) Successful in 3m20s
CI/CD Pipeline / Integration Tests (push) Successful in 1m29s
CI Build & Deploy Pipeline / Build Staging API Image (push) Successful in 7m4s
CI Build & Deploy Pipeline / Build Staging Worker Image (push) Successful in 7m54s
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 45s
CI Build & Deploy Pipeline / Staging E2E Tests (push) Failing after 2m50s
CI Build & Deploy Pipeline / Staging API Integration Tests (push) Successful in 3m28s

Co-authored-by: xiaoxia <dev@xiaoxiajianji.com>
Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
This commit was merged in pull request #520.
This commit is contained in:
2026-07-18 18:08:19 +08:00
committed by auto-approve-bot
parent 1ee779a566
commit 0fcb77b991
145 changed files with 10310 additions and 12869 deletions
+43 -54
View File
@@ -2,109 +2,98 @@
* 查重 API 模块
* 提供视频查重相关接口
*/
import apiClient from "./client";
import apiClient from "./client"
/** 查重记录状态 */
export type DuplicationStatus =
"pending" | "processing" | "completed" | "failed";
export type DuplicationStatus = "pending" | "processing" | "completed" | "failed"
/** 查重记录 */
export interface DuplicationRecord {
id: string;
id: string
/** 原始文件名 */
filename: string;
filename: string
/** 文件大小(字节) */
file_size: number;
file_size: number
/** 时长(秒) */
duration_seconds?: number;
duration_seconds?: number
/** 状态 */
status: DuplicationStatus;
status: DuplicationStatus
/** 查重率(0-100 */
duplicate_rate?: number;
duplicate_rate?: number
/** 重复片段数 */
duplicate_count?: number;
duplicate_count?: number
/** 创建时间 */
created_at: string;
created_at: string
/** 更新时间 */
updated_at: string;
updated_at: string
}
/** 重复片段详情 */
export interface DuplicateSegment {
id: string;
id: string
/** 在原始视频中的起始时间(秒) */
source_start: number;
source_start: number
/** 在原始视频中的结束时间(秒) */
source_end: number;
source_end: number
/** 匹配到的已有视频 ID */
matched_video_id: string;
matched_video_id: string
/** 匹配到的已有视频名称 */
matched_video_name: string;
matched_video_name: string
/** 匹配片段在已有视频中的起始时间 */
matched_start: number;
matched_start: number
/** 匹配片段在已有视频中的结束时间 */
matched_end: number;
matched_end: number
/** 相似度(0-100 */
similarity: number;
similarity: number
}
/** 查重详情 */
export interface DuplicationDetail extends DuplicationRecord {
/** 重复片段列表 */
segments: DuplicateSegment[];
segments: DuplicateSegment[]
}
/** 上传查重响应 */
export interface DuplicationUploadResponse {
/** 查重记录 ID */
id: string;
id: string
/** 状态 */
status: DuplicationStatus;
status: DuplicationStatus
/** 消息 */
message: string;
message: string
}
// ============ API 函数 ============
/** 上传视频进行查重 */
export const uploadForDuplication = async (
file: File,
): Promise<DuplicationUploadResponse> => {
const formData = new FormData();
formData.append("file", file);
export const uploadForDuplication = async (file: File): Promise<DuplicationUploadResponse> => {
const formData = new FormData()
formData.append("file", file)
const response = await apiClient.post("/duplication/upload", formData, {
headers: { "Content-Type": "multipart/form-data" },
});
return response.data;
};
})
return response.data
}
/** 获取查重记录列表 */
export const getDuplicationRecords = async (): Promise<DuplicationRecord[]> => {
const response = await apiClient.get("/duplication/records");
return response.data;
};
const response = await apiClient.get("/duplication/records")
return response.data
}
/** 获取查重详情 */
export const getDuplicationDetail = async (
recordId: string,
): Promise<DuplicationDetail> => {
const response = await apiClient.get(`/duplication/records/${recordId}`);
return response.data;
};
export const getDuplicationDetail = async (recordId: string): Promise<DuplicationDetail> => {
const response = await apiClient.get(`/duplication/records/${recordId}`)
return response.data
}
/** 删除查重记录 */
export const deleteDuplicationRecord = async (
recordId: string,
): Promise<void> => {
await apiClient.delete(`/duplication/records/${recordId}`);
};
export const deleteDuplicationRecord = async (recordId: string): Promise<void> => {
await apiClient.delete(`/duplication/records/${recordId}`)
}
/** 重新查重 */
export const retryDuplication = async (
recordId: string,
): Promise<DuplicationUploadResponse> => {
const response = await apiClient.post(
`/duplication/records/${recordId}/retry`,
);
return response.data;
};
export const retryDuplication = async (recordId: string): Promise<DuplicationUploadResponse> => {
const response = await apiClient.post(`/duplication/records/${recordId}/retry`)
return response.data
}