rwadurian/frontend/mobile-upgrade/docs/API.md

389 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Mobile Upgrade Admin - API 文档
## 概述
本文档描述 Mobile Upgrade Admin 前端与 Admin Service 后端的 API 交互。
## 基础配置
### 环境变量
```bash
# .env.local
NEXT_PUBLIC_API_URL=http://localhost:3000
```
### API 客户端配置
```typescript
// src/infrastructure/http/api-client.ts
export const apiClient = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000',
timeout: 30000,
headers: {
'Content-Type': 'application/json',
},
})
```
## API 端点
### 版本管理 API
Base URL: `/api/v1/versions`
---
### 1. 获取版本列表
**端点**: `GET /api/v1/versions`
**查询参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| platform | string | 否 | 平台筛选:`android` 或 `ios` |
| includeDisabled | boolean | 否 | 是否包含已禁用版本,默认 `true` |
**请求示例**:
```typescript
// 获取所有版本
const response = await apiClient.get('/api/v1/versions')
// 获取 Android 版本
const response = await apiClient.get('/api/v1/versions?platform=android')
// 只获取已启用版本
const response = await apiClient.get('/api/v1/versions?includeDisabled=false')
```
**响应示例**:
```json
[
{
"id": "uuid-1234",
"platform": "android",
"versionCode": 100,
"versionName": "1.0.0",
"buildNumber": "100",
"downloadUrl": "https://example.com/app-1.0.0.apk",
"fileSize": "52428800",
"fileSha256": "abc123...",
"changelog": "1. 新增功能A\n2. 修复问题B",
"isForceUpdate": false,
"isEnabled": true,
"minOsVersion": "8.0",
"releaseDate": "2024-01-01T00:00:00.000Z",
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
]
```
---
### 2. 获取单个版本
**端点**: `GET /api/v1/versions/:id`
**路径参数**:
| 参数 | 类型 | 说明 |
|------|------|------|
| id | string | 版本 ID (UUID) |
**请求示例**:
```typescript
const response = await apiClient.get('/api/v1/versions/uuid-1234')
```
**响应**: 单个 `AppVersion` 对象
---
### 3. 创建版本
**端点**: `POST /api/v1/versions`
**请求体**:
```typescript
interface CreateVersionInput {
platform: 'android' | 'ios'
versionCode: number
versionName: string
buildNumber: string
downloadUrl: string
fileSize: string
fileSha256: string
changelog: string
isForceUpdate: boolean
minOsVersion?: string
releaseDate?: string
}
```
**请求示例**:
```typescript
const response = await apiClient.post('/api/v1/versions', {
platform: 'android',
versionCode: 101,
versionName: '1.0.1',
buildNumber: '101',
downloadUrl: 'https://example.com/app-1.0.1.apk',
fileSize: '52428800',
fileSha256: 'sha256hash...',
changelog: '修复已知问题',
isForceUpdate: false,
minOsVersion: '8.0'
})
```
**响应**: 创建的 `AppVersion` 对象
---
### 4. 更新版本
**端点**: `PUT /api/v1/versions/:id`
**请求体**:
```typescript
interface UpdateVersionInput {
downloadUrl?: string
fileSize?: string
fileSha256?: string
changelog?: string
isForceUpdate?: boolean
isEnabled?: boolean
minOsVersion?: string | null
releaseDate?: string | null
}
```
**请求示例**:
```typescript
const response = await apiClient.put('/api/v1/versions/uuid-1234', {
changelog: '更新的更新日志',
isForceUpdate: true
})
```
**响应**: 更新后的 `AppVersion` 对象
---
### 5. 删除版本
**端点**: `DELETE /api/v1/versions/:id`
**请求示例**:
```typescript
await apiClient.delete('/api/v1/versions/uuid-1234')
```
**响应**: 无内容 (204)
---
### 6. 切换版本状态
**端点**: `PATCH /api/v1/versions/:id/toggle`
**请求体**:
```json
{
"isEnabled": true
}
```
**请求示例**:
```typescript
await apiClient.patch('/api/v1/versions/uuid-1234/toggle', {
isEnabled: false
})
```
**响应**: 无内容 (204)
---
### 7. 上传版本文件
**端点**: `POST /api/v1/versions/upload`
**请求类型**: `multipart/form-data`
**表单字段**:
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| file | File | 是 | APK 或 IPA 文件 |
| platform | string | 是 | `android``ios` |
| versionName | string | 是 | 版本号,如 `1.0.0` |
| buildNumber | string | 是 | 构建号,如 `100` |
| changelog | string | 否 | 更新日志 |
| isForceUpdate | boolean | 否 | 是否强制更新,默认 `false` |
| minOsVersion | string | 否 | 最低系统版本 |
| releaseDate | string | 否 | 发布日期 (ISO 8601) |
**请求示例**:
```typescript
const formData = new FormData()
formData.append('file', file)
formData.append('platform', 'android')
formData.append('versionName', '1.0.0')
formData.append('buildNumber', '100')
formData.append('changelog', '首次发布')
formData.append('isForceUpdate', 'false')
const response = await apiClient.post('/api/v1/versions/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
timeout: 300000, // 5分钟超时适用于大文件
})
```
**响应**: 创建的 `AppVersion` 对象
---
## 移动端检查更新 API
### 检查版本更新
**端点**: `GET /api/app/version/check`
> 注意:此端点不使用 `/api/v1` 前缀
**查询参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| platform | string | 是 | `android``ios` |
| currentVersion | string | 是 | 当前版本号,如 `1.0.0` |
| currentBuild | string | 否 | 当前构建号 |
**请求示例**:
```bash
GET /api/app/version/check?platform=android&currentVersion=1.0.0&currentBuild=100
```
**响应示例**:
```json
{
"hasUpdate": true,
"isForceUpdate": false,
"latestVersion": {
"versionName": "1.1.0",
"buildNumber": "110",
"downloadUrl": "https://example.com/app-1.1.0.apk",
"fileSize": "55000000",
"changelog": "1. 新功能\n2. 性能优化",
"minOsVersion": "8.0"
}
}
```
---
## 错误处理
### 错误响应格式
```json
{
"statusCode": 400,
"message": "错误描述",
"error": "Bad Request"
}
```
### 常见错误码
| 状态码 | 说明 |
|--------|------|
| 400 | 请求参数错误 |
| 404 | 资源不存在 |
| 409 | 资源冲突(如版本已存在) |
| 413 | 文件过大 |
| 500 | 服务器内部错误 |
### 前端错误处理
```typescript
// API 客户端拦截器
apiClient.interceptors.response.use(
(response) => response,
(error) => {
const message = error.response?.data?.message || '请求失败'
return Promise.reject(new Error(message))
}
)
// 组件中使用
try {
await deleteVersion(id)
toast.success('删除成功')
} catch (err) {
toast.error(err.message || '操作失败')
}
```
---
## 数据类型定义
### AppVersion
```typescript
interface AppVersion {
id: string // UUID
platform: 'android' | 'ios' // 平台
versionCode: number // 版本代码(用于比较)
versionName: string // 版本名称(显示用)
buildNumber: string // 构建号
downloadUrl: string // 下载地址
fileSize: string // 文件大小(字节)
fileSha256: string // 文件 SHA256 校验值
changelog: string // 更新日志
isForceUpdate: boolean // 是否强制更新
isEnabled: boolean // 是否启用
minOsVersion: string | null // 最低系统版本要求
releaseDate: string | null // 发布日期
createdAt: string // 创建时间
updatedAt: string // 更新时间
}
```
### VersionListFilter
```typescript
interface VersionListFilter {
platform?: 'android' | 'ios'
includeDisabled?: boolean
}
```
---
## 相关文档
- [架构文档](./ARCHITECTURE.md)
- [开发指南](./DEVELOPMENT.md)
- [测试指南](./TESTING.md)
- [部署指南](./DEPLOYMENT.md)