feat: implement browser extension for media publishing and add backend support for media management

This commit is contained in:
2026-04-03 00:39:15 +08:00
parent 8958cb44c0
commit 32d6a462cd
60 changed files with 8268 additions and 26 deletions
+179
View File
@@ -282,6 +282,185 @@ export interface ArticleVersion {
created_at: string;
}
export const MIN_BROWSER_EXTENSION_VERSION = "0.1.0";
export interface MediaPlatform {
id: number;
platform_id: string;
name: string;
category: string;
short_name: string;
accent_color: string;
login_url: string | null;
logo_url: string | null;
status: string;
sort_order: number;
}
export interface PlatformAccount {
id: number;
platform_id: string;
platform_name: string;
platform_category: string;
platform_uid: string;
nickname: string;
avatar_url: string | null;
status: string;
login_url: string | null;
last_check_at: string | null;
metadata?: Record<string, JsonValue> | null;
created_at: string;
updated_at: string;
}
export interface CreatePluginSessionRequest {
action_type: "bind" | "check";
platform_id: string;
platform_account_id?: number | null;
plugin_installation_id?: number | null;
resource_type?: string | null;
resource_id?: number | null;
}
export interface CreatePluginSessionResponse {
plugin_session_id: number;
session_token: string;
expire_at: string;
min_plugin_version: string;
}
export interface CreatePublishBatchRequest {
platform_account_ids: number[];
plugin_installation_id?: number | null;
publish_type?: "publish" | "draft";
cover_asset_url?: string | null;
}
export interface PublishBatchTask {
publish_record_id: number;
platform_account_id: number;
platform_id: string;
platform_name: string;
platform_uid: string;
platform_nickname: string;
plugin_session_id: number;
session_token: string;
expire_at: string;
}
export interface CreatePublishBatchResponse {
publish_batch_id: number;
status: string;
tasks: PublishBatchTask[];
}
export interface PublishRecord {
id: number;
publish_batch_id: number;
article_id: number;
platform_account_id: number;
platform_id: string;
platform_name: string;
platform_nickname: string;
status: string;
external_article_id: string | null;
external_article_url: string | null;
external_manage_url: string | null;
published_at: string | null;
error_message: string | null;
created_at: string;
updated_at: string;
}
export interface PublisherLocalPlatformState {
platform_id: string;
connected: boolean;
platform_uid?: string | null;
nickname?: string | null;
avatar_url?: string | null;
message?: string | null;
}
export interface PublisherPluginPingResponse {
installed: boolean;
version?: string;
capabilities?: Array<"ping" | "detect" | "bind" | "publish" | "background">;
installation_key?: string;
plugin_installation_id?: number | null;
}
export interface RegisterPluginInstallationRequest {
installation_key: string;
installation_name: string;
browser_name?: string | null;
client_version?: string | null;
}
export interface RegisterPluginInstallationResponse {
plugin_installation_id: number;
installation_token: string;
status: string;
last_seen_at: string;
}
export interface PublisherRegisterInstallationPayload {
plugin_installation_id: number;
installation_token: string;
api_base_url: string;
}
export interface PublisherRegisterInstallationResult {
success: boolean;
plugin_installation_id: number;
}
export interface PublisherBindRequest {
platform_id: string;
login_url?: string | null;
callback_base_url: string;
plugin_session_id: number;
session_token: string;
}
export interface PublisherBindResponse {
success: boolean;
platform_id: string;
platform_uid?: string | null;
nickname?: string | null;
avatar_url?: string | null;
platform_account_id?: number | null;
message?: string | null;
}
export interface PublisherPublishArticleRequest {
article_id: number;
title: string;
markdown_content: string;
html_content?: string | null;
cover_asset_url?: string | null;
callback_base_url: string;
publish_type: "publish" | "draft";
tasks: PublishBatchTask[];
}
export interface PublisherPublishTaskResult {
publish_record_id: number;
platform_account_id: number;
platform_id: string;
success: boolean;
status: "success" | "failed" | "pending_review";
external_article_id?: string | null;
external_article_url?: string | null;
external_manage_url?: string | null;
message?: string | null;
}
export interface PublisherPublishResponse {
success: boolean;
batch_status: string;
results: PublisherPublishTaskResult[];
}
export interface BrandRequest {
name: string;
website?: string | null;