2026-07-21 15:28:55 +08:00
|
|
|
export type ReviewStatus = 'draft' | 'pending' | 'changes_requested' | 'approved';
|
|
|
|
|
export type CollectionStatus = 'draft' | 'reviewing' | 'completed' | 'archived';
|
|
|
|
|
export type UserRole = 'platform_admin' | 'group_admin' | 'operator';
|
|
|
|
|
|
|
|
|
|
export interface CurrentUser {
|
|
|
|
|
id: number;
|
|
|
|
|
group_id: number | null;
|
|
|
|
|
group_name: string | null;
|
|
|
|
|
username: string;
|
|
|
|
|
display_name: string;
|
|
|
|
|
role: UserRole;
|
|
|
|
|
must_change_password: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface OperationGroup {
|
|
|
|
|
id: number;
|
|
|
|
|
name: string;
|
|
|
|
|
status: 'active' | 'disabled';
|
|
|
|
|
user_count: number;
|
|
|
|
|
active_user_count: number;
|
|
|
|
|
operator_count: number;
|
|
|
|
|
disabled_user_count: number;
|
|
|
|
|
project_count: number;
|
|
|
|
|
customer_link_count: number;
|
|
|
|
|
group_admin_name: string | null;
|
|
|
|
|
group_admin_status: 'active' | 'disabled' | null;
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ManagedUser {
|
|
|
|
|
id: number;
|
|
|
|
|
group_id: number | null;
|
|
|
|
|
group_name: string | null;
|
|
|
|
|
username: string;
|
|
|
|
|
display_name: string;
|
|
|
|
|
role: UserRole;
|
|
|
|
|
status: 'active' | 'disabled';
|
|
|
|
|
must_change_password: boolean;
|
|
|
|
|
last_login_at: string | null;
|
|
|
|
|
last_operation_at: string | null;
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ManagedApiKey {
|
|
|
|
|
id: number;
|
|
|
|
|
group_id: number | null;
|
|
|
|
|
project_id: number | null;
|
|
|
|
|
project_name: string | null;
|
|
|
|
|
name: string;
|
|
|
|
|
key_prefix: string;
|
|
|
|
|
scope: 'platform' | 'project';
|
|
|
|
|
status: 'active' | 'revoked';
|
|
|
|
|
created_by_name: string;
|
|
|
|
|
last_used_at: string | null;
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface StorageConfig {
|
|
|
|
|
id: number;
|
|
|
|
|
provider: 'tencent_cos';
|
|
|
|
|
region: string;
|
|
|
|
|
bucket: string;
|
|
|
|
|
public_base_url: string;
|
|
|
|
|
cdn_domain: string;
|
|
|
|
|
path_prefix: string;
|
|
|
|
|
status: 'draft' | 'active' | 'archived';
|
|
|
|
|
test_status: 'untested' | 'passed' | 'failed';
|
|
|
|
|
test_message: string;
|
|
|
|
|
last_tested_at: string | null;
|
|
|
|
|
created_by_name: string;
|
|
|
|
|
created_at: string;
|
|
|
|
|
activated_at: string | null;
|
|
|
|
|
has_credentials: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface AuditLogEntry {
|
|
|
|
|
id: number;
|
|
|
|
|
group_id: number | null;
|
|
|
|
|
group_name: string | null;
|
|
|
|
|
user_id: number | null;
|
|
|
|
|
user_name: string | null;
|
|
|
|
|
action: string;
|
|
|
|
|
entity_type: string;
|
|
|
|
|
entity_id: number | null;
|
|
|
|
|
detail: Record<string, unknown>;
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface Project {
|
|
|
|
|
id: number;
|
|
|
|
|
group_id: number;
|
|
|
|
|
group_name: string;
|
|
|
|
|
name: string;
|
|
|
|
|
slug: string;
|
|
|
|
|
client_description: string;
|
|
|
|
|
status: 'active' | 'closed' | 'archived';
|
|
|
|
|
customer_access_enabled: boolean;
|
|
|
|
|
access_expires_at: string | null;
|
|
|
|
|
has_access_password: boolean;
|
|
|
|
|
collection_count: number;
|
|
|
|
|
work_count: number;
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface CustomerAccessState {
|
|
|
|
|
project_name: string;
|
|
|
|
|
client_description: string;
|
|
|
|
|
enabled: boolean;
|
|
|
|
|
expired: boolean;
|
|
|
|
|
authenticated: boolean;
|
|
|
|
|
reviewer_name: string | null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface WorkCollection {
|
|
|
|
|
id: number;
|
|
|
|
|
project_id: number;
|
|
|
|
|
name: string;
|
|
|
|
|
client_description: string;
|
|
|
|
|
status: CollectionStatus;
|
|
|
|
|
work_count: number;
|
|
|
|
|
approved_count: number;
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface Note {
|
|
|
|
|
id: number;
|
|
|
|
|
collection_id: number;
|
2026-07-21 18:28:21 +08:00
|
|
|
external_id: string | null;
|
2026-07-21 15:28:55 +08:00
|
|
|
title: string;
|
|
|
|
|
description: string;
|
|
|
|
|
tags: string[];
|
|
|
|
|
review_status: ReviewStatus;
|
|
|
|
|
version_number: number;
|
|
|
|
|
cover_image: string;
|
|
|
|
|
image_count: number;
|
|
|
|
|
annotation_count: number;
|
|
|
|
|
comment_count: number;
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface NoteImage {
|
|
|
|
|
id: number;
|
|
|
|
|
note_id: number;
|
|
|
|
|
url: string;
|
|
|
|
|
width: number;
|
|
|
|
|
height: number;
|
|
|
|
|
order_index: number;
|
2026-07-21 18:28:21 +08:00
|
|
|
storage_provider: 'local' | 'tencent_cos' | 'external';
|
2026-07-21 15:28:55 +08:00
|
|
|
storage_key: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface Annotation {
|
|
|
|
|
id: number;
|
|
|
|
|
image_id: number;
|
|
|
|
|
x: number;
|
|
|
|
|
y: number;
|
|
|
|
|
content: string;
|
|
|
|
|
author_name: string;
|
|
|
|
|
status: 'open' | 'resolved' | 'confirmed';
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface WorkComment {
|
|
|
|
|
id: number;
|
|
|
|
|
note_id: number;
|
|
|
|
|
content: string;
|
|
|
|
|
author_name: string;
|
|
|
|
|
author_role: 'client' | 'operator';
|
|
|
|
|
status: 'open' | 'resolved' | 'confirmed';
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface TextAnnotation {
|
|
|
|
|
id: number;
|
|
|
|
|
note_id: number;
|
|
|
|
|
version_number: number;
|
|
|
|
|
target: 'title' | 'description';
|
|
|
|
|
content: string;
|
|
|
|
|
author_name: string;
|
|
|
|
|
status: 'open' | 'resolved' | 'confirmed';
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ImageWithAnnotations extends NoteImage {
|
|
|
|
|
annotations: Annotation[];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface NoteDetail extends Note {
|
|
|
|
|
images: ImageWithAnnotations[];
|
|
|
|
|
text_annotations: TextAnnotation[];
|
|
|
|
|
comments: WorkComment[];
|
|
|
|
|
project: Pick<Project, 'id' | 'name' | 'slug'>;
|
|
|
|
|
collection: Pick<WorkCollection, 'id' | 'name'>;
|
|
|
|
|
versions: WorkVersion[];
|
|
|
|
|
review_events: ReviewEvent[];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface WorkVersion {
|
|
|
|
|
version_number: number;
|
|
|
|
|
title: string;
|
|
|
|
|
description: string;
|
|
|
|
|
tags: string[];
|
|
|
|
|
review_status: ReviewStatus;
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ReviewEvent {
|
|
|
|
|
id: number;
|
|
|
|
|
version_number: number;
|
|
|
|
|
event_type: 'submitted' | 'approved' | 'changes_requested' | 'reopened';
|
|
|
|
|
from_status: ReviewStatus | null;
|
|
|
|
|
to_status: ReviewStatus;
|
|
|
|
|
reason: string;
|
|
|
|
|
actor_name: string;
|
|
|
|
|
actor_role: 'client' | 'operator' | 'group_admin' | 'platform_admin';
|
|
|
|
|
created_at: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface CreateAnnotationRequest {
|
|
|
|
|
x: number;
|
|
|
|
|
y: number;
|
|
|
|
|
content: string;
|
|
|
|
|
author_name?: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface NoteListQuery {
|
|
|
|
|
sort?: 'created_at' | 'annotations';
|
|
|
|
|
order?: 'asc' | 'desc';
|
|
|
|
|
q?: string;
|
|
|
|
|
collectionId?: number;
|
|
|
|
|
status?: ReviewStatus;
|
|
|
|
|
tag?: string;
|
|
|
|
|
projectId?: number;
|
|
|
|
|
groupId?: number;
|
2026-07-21 18:28:21 +08:00
|
|
|
externalId?: string;
|
2026-07-21 15:28:55 +08:00
|
|
|
}
|