mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-16 15:43:13 +08:00
后端:
- UpdateService 新增 ListRollbackVersions/RollbackToVersion,回退目标强制
限定为比当前版本更旧的近3个正式版本(排除当前/更新/预发布/草稿),
越界返回 400 ROLLBACK_VERSION_NOT_ALLOWED;下载复用既有 HTTPS 域名
白名单 + checksum 校验 + 原子换二进制管线
- GitHubReleaseClient 新增 FetchRecentReleases(releases 列表 API)
- 新增 GET /admin/system/rollback-versions;POST /admin/system/rollback
支持可选 {"version"} body,无 body 保持原 .backup 本地回退行为不变
- 端点均在 /admin 组 adminAuth(IsAdmin+TokenVersion)保护内
前端:
- VersionBadge「已是最新版本」状态下新增版本回退面板:radio 卡片选择
近3个版本,手动回退方式按部署形态 tab 切换(脚本部署 curl 命令 /
Docker 镜像 tag 指引),支持一键复制;release 构建提供一键回退并
复用重启流程;源码构建仅提示不支持在线回退
- 下拉根元素重置 whitespace-normal,修复 sidebar-brand 的
white-space:nowrap 继承导致的长文本溢出裁切
测试:服务层过滤/排序/上限/非法目标拒绝、handler 双模式与鉴权错误映射、
GitHub client 列表拉取、前端 API 请求体行为共 16 个新增用例
103 lines
2.3 KiB
TypeScript
103 lines
2.3 KiB
TypeScript
/**
|
|
* System API endpoints for admin operations
|
|
*/
|
|
|
|
import { apiClient } from '../client'
|
|
|
|
export interface ReleaseInfo {
|
|
name: string
|
|
body: string
|
|
published_at: string
|
|
html_url: string
|
|
}
|
|
|
|
export interface VersionInfo {
|
|
current_version: string
|
|
latest_version: string
|
|
has_update: boolean
|
|
release_info?: ReleaseInfo
|
|
cached: boolean
|
|
warning?: string
|
|
build_type: string // "source" for manual builds, "release" for CI builds
|
|
}
|
|
|
|
/**
|
|
* Get current version
|
|
*/
|
|
export async function getVersion(): Promise<{ version: string }> {
|
|
const { data } = await apiClient.get<{ version: string }>('/admin/system/version')
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Check for updates
|
|
* @param force - Force refresh from GitHub API
|
|
*/
|
|
export async function checkUpdates(force = false): Promise<VersionInfo> {
|
|
const { data } = await apiClient.get<VersionInfo>('/admin/system/check-updates', {
|
|
params: force ? { force: 'true' } : undefined
|
|
})
|
|
return data
|
|
}
|
|
|
|
export interface UpdateResult {
|
|
message: string
|
|
need_restart: boolean
|
|
}
|
|
|
|
export interface RollbackVersionInfo {
|
|
version: string
|
|
published_at: string
|
|
html_url: string
|
|
}
|
|
|
|
/**
|
|
* Get versions available for rollback (up to 3 versions older than current)
|
|
*/
|
|
export async function getRollbackVersions(): Promise<{ versions: RollbackVersionInfo[] }> {
|
|
const { data } = await apiClient.get<{ versions: RollbackVersionInfo[] }>(
|
|
'/admin/system/rollback-versions'
|
|
)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Perform system update
|
|
* Downloads and applies the latest version
|
|
*/
|
|
export async function performUpdate(): Promise<UpdateResult> {
|
|
const { data } = await apiClient.post<UpdateResult>('/admin/system/update')
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Rollback to a previous version
|
|
* @param version - Target version (e.g. "0.1.146"); omit to restore the local backup binary
|
|
*/
|
|
export async function rollback(version?: string): Promise<UpdateResult> {
|
|
const { data } = await apiClient.post<UpdateResult>(
|
|
'/admin/system/rollback',
|
|
version ? { version } : undefined
|
|
)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Restart the service
|
|
*/
|
|
export async function restartService(): Promise<{ message: string }> {
|
|
const { data } = await apiClient.post<{ message: string }>('/admin/system/restart')
|
|
return data
|
|
}
|
|
|
|
export const systemAPI = {
|
|
getVersion,
|
|
checkUpdates,
|
|
performUpdate,
|
|
getRollbackVersions,
|
|
rollback,
|
|
restartService
|
|
}
|
|
|
|
export default systemAPI
|