-- 扩展API文档初始化脚本
-- 运行方式: 在项目根目录执行 go run cmd/scripts/init_extension_docs.go

-- 首先创建扩展API文档分类
INSERT INTO doc_categories (name, slug, description, icon, status, sort, created_at, updated_at)
VALUES ('扩展API', 'extension-api', '开放API文档，供开发者在自己的服务器集成平台功能', 'code', 'active', 100, datetime('now'), datetime('now'));

-- 概述文档
INSERT INTO docs (category_id, title, slug, content, status, sort, created_at, updated_at)
VALUES (
    (SELECT id FROM doc_categories WHERE slug = 'extension-api'),
    '扩展API概述',
    'extension-api-overview',
    '# 扩展API概述

扩展API允许开发者在自己的服务器上集成平台功能，实现自定义的业务逻辑。

## 功能特点

- **用户管理**: 查询用户信息、充值、扣费等操作
- **卡密管理**: 查询卡密、生成卡密
- **消息通知**: 向用户发送通知消息
- **应用管理**: 获取应用信息和统计数据
- **云端变量**: 读写用户和应用级别的云端变量

## 认证方式

所有API请求需要进行签名认证，请求头需要包含以下字段：

| 字段 | 说明 |
|------|------|
| X-Access-Key | API密钥的Access Key |
| X-Signature | 请求签名 |
| X-Timestamp | 请求时间戳（秒级） |

## 签名算法

签名生成步骤：

1. 拼接签名字符串: `METHOD + PATH + TIMESTAMP + BODY`
2. 使用Secret Key对签名字符串进行HMAC-SHA256签名
3. 将签名结果转换为十六进制字符串

```javascript
// JavaScript示例
const crypto = require(''crypto'');

function generateSignature(method, path, timestamp, body, secretKey) {
    const stringToSign = method + path + timestamp + body;
    const hmac = crypto.createHmac(''sha256'', secretKey);
    hmac.update(stringToSign);
    return hmac.digest(''hex'');
}
```

## 请求限制

- 时间戳有效期：5分钟
- 请求频率：根据套餐限制

## 创建API密钥

1. 进入「扩展配置」页面
2. 切换到「API密钥」标签
3. 点击「创建密钥」按钮
4. 选择应用并配置权限
5. 保存Access Key和Secret Key

> ⚠️ **注意**: Secret Key只在创建时显示一次，请妥善保存！
',
    'published',
    1,
    datetime('now'),
    datetime('now')
);

-- 用户管理API文档
INSERT INTO docs (category_id, title, slug, content, status, sort, created_at, updated_at)
VALUES (
    (SELECT id FROM doc_categories WHERE slug = 'extension-api'),
    '用户管理',
    'extension-api-user',
    '# 用户管理

## 获取用户信息

获取指定用户的详细信息。

### 请求

```
GET /api/v1/ext/user/:userId
```

### 请求头

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| X-Access-Key | string | 是 | Access Key |
| X-Signature | string | 是 | 请求签名 |
| X-Timestamp | string | 是 | 时间戳 |

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "id": 1,
        "username": "testuser",
        "email": "test@example.com",
        "status": "active",
        "balance": 100.00,
        "expiry_at": "2024-12-31T23:59:59Z",
        "last_login_at": "2024-01-15T10:30:00Z",
        "is_trial_user": false,
        "created_at": "2024-01-01T00:00:00Z"
    }
}
```

---

## 获取用户列表

获取应用下的用户列表。

### 请求

```
GET /api/v1/ext/users
```

### 查询参数

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| page | int | 否 | 页码，默认1 |
| page_size | int | 否 | 每页数量，默认20 |
| status | string | 否 | 状态筛选 |
| search | string | 否 | 搜索关键词 |

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "users": [...],
        "total": 100,
        "page": 1,
        "page_size": 20,
        "total_page": 5
    }
}
```

---

## 用户充值

为用户充值时长或余额。

### 请求

```
POST /api/v1/ext/user/:userId/recharge
```

### 请求体

```json
{
    "amount": 100,
    "type": "days",
    "description": "在线充值"
}
```

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| amount | int | 是 | 充值数量 |
| type | string | 是 | 类型：days（天数）或 balance（余额） |
| description | string | 否 | 描述说明 |

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "message": "充值成功",
        "user": {
            "id": 1,
            "balance": 100.00,
            "expiry_at": "2024-12-31T23:59:59Z"
        }
    }
}
```

---

## 用户扣费

扣除用户余额或时长。

### 请求

```
POST /api/v1/ext/user/:userId/deduct
```

### 请求体

```json
{
    "amount": 50,
    "type": "balance",
    "description": "消费扣费"
}
```

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| amount | int | 是 | 扣除数量 |
| type | string | 是 | 类型：days（天数）或 balance（余额） |
| description | string | 否 | 描述说明 |

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "message": "扣除成功",
        "user": {
            "id": 1,
            "balance": 50.00
        }
    }
}
```

---

## 获取用户变量

获取用户的云端变量。

### 请求

```
GET /api/v1/ext/user/:userId/variables
```

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "vip_level": {
            "value": "3",
            "scope": "user"
        },
        "game_score": {
            "value": "1000",
            "scope": "user"
        }
    }
}
```

---

## 更新用户变量

更新用户的云端变量。

### 请求

```
POST /api/v1/ext/user/:userId/variables
```

### 请求体

```json
{
    "variables": {
        "vip_level": "5",
        "game_score": "2000"
    }
}
```

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "message": "更新成功"
    }
}
```
',
    'published',
    2,
    datetime('now'),
    datetime('now')
);

-- 卡密管理API文档
INSERT INTO docs (category_id, title, slug, content, status, sort, created_at, updated_at)
VALUES (
    (SELECT id FROM doc_categories WHERE slug = 'extension-api'),
    '卡密管理',
    'extension-api-card',
    '# 卡密管理

## 获取卡密列表

获取应用下的卡密列表。

### 请求

```
GET /api/v1/ext/cards
```

### 查询参数

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| page | int | 否 | 页码，默认1 |
| page_size | int | 否 | 每页数量，默认20 |
| status | string | 否 | 状态筛选：unused/used/disabled |
| card_type_id | int | 否 | 卡密类型ID |

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "cards": [
            {
                "id": 1,
                "card_key": "[REDACTED]",
                "card_type_id": 1,
                "status": "unused",
                "created_at": "2024-01-01T00:00:00Z"
            }
        ],
        "total": 100,
        "page": 1,
        "page_size": 20,
        "total_page": 5
    }
}
```

---

## 生成卡密

批量生成卡密。

### 请求

```
POST /api/v1/ext/cards/generate
```

### 请求体

```json
{
    "card_type_id": 1,
    "count": 10
}
```

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| card_type_id | int | 是 | 卡密类型ID |
| count | int | 是 | 生成数量 |

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "message": "生成成功",
        "count": 10,
        "cards": [
            {
                "id": 1,
                "card_key": "[REDACTED]",
                "status": "unused"
            }
        ]
    }
}
```

---

## 获取卡密详情

获取单个卡密的详细信息。

### 请求

```
GET /api/v1/ext/card/:cardId
```

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "id": 1,
        "card_key": "[REDACTED]",
        "card_type_id": 1,
        "status": "unused",
        "used_at": null,
        "app_user_id": null,
        "created_at": "2024-01-01T00:00:00Z"
    }
}
```
',
    'published',
    3,
    datetime('now'),
    datetime('now')
);

-- 消息通知API文档
INSERT INTO docs (category_id, title, slug, content, status, sort, created_at, updated_at)
VALUES (
    (SELECT id FROM doc_categories WHERE slug = 'extension-api'),
    '消息通知',
    'extension-api-notification',
    '# 消息通知

## 发送单个通知

向指定用户发送通知消息。

### 请求

```
POST /api/v1/ext/notification
```

### 请求体

```json
{
    "user_id": 1,
    "title": "系统通知",
    "content": "您的账户已充值成功！",
    "type": "info"
}
```

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| user_id | int | 是 | 用户ID |
| title | string | 是 | 通知标题 |
| content | string | 是 | 通知内容 |
| type | string | 否 | 类型：info/warning/error |

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "message": "发送成功",
        "notification": {
            "id": 1,
            "title": "系统通知",
            "content": "您的账户已充值成功！"
        }
    }
}
```

---

## 批量发送通知

向所有用户发送通知消息。

### 请求

```
POST /api/v1/ext/notification/batch
```

### 请求体

```json
{
    "title": "系统公告",
    "content": "系统将于今晚进行维护...",
    "type": "warning"
}
```

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "message": "发送成功",
        "notification": {
            "id": 1,
            "title": "系统公告",
            "content": "系统将于今晚进行维护..."
        }
    }
}
```
',
    'published',
    4,
    datetime('now'),
    datetime('now')
);

-- 应用管理API文档
INSERT INTO docs (category_id, title, slug, content, status, sort, created_at, updated_at)
VALUES (
    (SELECT id FROM doc_categories WHERE slug = 'extension-api'),
    '应用管理',
    'extension-api-app',
    '# 应用管理

## 获取应用信息

获取当前应用的基本信息。

### 请求

```
GET /api/v1/ext/app/info
```

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "id": 1,
        "name": "我的应用",
        "description": "应用描述",
        "billing_type": "subscription",
        "encrypt_type": "aes",
        "bind_type": "device",
        "max_devices": 3,
        "multi_open": false,
        "enable_trial": true,
        "trial_balance": 7,
        "status": "active",
        "created_at": "2024-01-01T00:00:00Z"
    }
}
```

---

## 获取应用统计

获取应用的统计数据。

### 请求

```
GET /api/v1/ext/app/stats
```

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "user_count": 1000,
        "active_user_count": 500,
        "card_count": 200,
        "used_card_count": 150
    }
}
```

---

## 获取应用变量

获取应用级别的云端变量。

### 请求

```
GET /api/v1/ext/app/variables
```

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "app_version": "1.0.0",
        "maintenance_mode": "false",
        "announcement": "欢迎使用本应用"
    }
}
```

---

## 更新应用变量

更新应用级别的云端变量。

### 请求

```
POST /api/v1/ext/app/variables
```

### 请求体

```json
{
    "variables": {
        "app_version": "1.0.1",
        "maintenance_mode": "true",
        "announcement": "系统维护中，请稍后..."
    }
}
```

### 响应示例

```json
{
    "code": 200,
    "message": "success",
    "data": {
        "message": "更新成功"
    }
}
```
',
    'published',
    5,
    datetime('now'),
    datetime('now')
);

-- 代码示例文档
INSERT INTO docs (category_id, title, slug, content, status, sort, created_at, updated_at)
VALUES (
    (SELECT id FROM doc_categories WHERE slug = 'extension-api'),
    '代码示例',
    'extension-api-examples',
    '# 代码示例

## JavaScript/Node.js

```javascript
const crypto = require(''crypto'');
const axios = require(''axios'');

const ACCESS_KEY = ''your_access_key'';
const SECRET_KEY = ''your_secret_key'';
const BASE_URL = ''https://your-domain.com/api/v1/ext'';

// 生成签名
function generateSignature(method, path, timestamp, body) {
    const bodyStr = body ? JSON.stringify(body) : '''';
    const stringToSign = method + path + timestamp + bodyStr;
    const hmac = crypto.createHmac(''sha256'', SECRET_KEY);
    hmac.update(stringToSign);
    return hmac.digest(''hex'');
}

// 发送请求
async function request(method, path, body = null) {
    const timestamp = Math.floor(Date.now() / 1000).toString();
    const signature = generateSignature(method, path, timestamp, body);
    
    const headers = {
        ''X-Access-Key'': ACCESS_KEY,
        ''X-Signature'': signature,
        ''X-Timestamp'': timestamp,
        ''Content-Type'': ''application/json''
    };
    
    const config = {
        method,
        url: BASE_URL + path,
        headers
    };
    
    if (body) {
        config.data = body;
    }
    
    const response = await axios(config);
    return response.data;
}

// 使用示例
async function main() {
    // 获取用户信息
    const user = await request(''GET'', ''/user/1'');
    console.log(''用户信息:'', user);
    
    // 用户充值
    const result = await request(''POST'', ''/user/1/recharge'', {
        amount: 100,
        type: ''days'',
        description: ''在线充值''
    });
    console.log(''充值结果:'', result);
}

main().catch(console.error);
```

## Python

```python
import hmac
import hashlib
import time
import requests
import json

ACCESS_KEY = ''your_access_key''
SECRET_KEY = ''your_secret_key''
BASE_URL = ''https://your-domain.com/api/v1/ext''

def generate_signature(method, path, timestamp, body=''''):
    string_to_sign = method + path + timestamp + body
    signature = hmac.new(
        SECRET_KEY.encode(''utf-8''),
        string_to_sign.encode(''utf-8''),
        hashlib.sha256
    ).hexdigest()
    return signature

def request(method, path, body=None):
    timestamp = str(int(time.time()))
    body_str = json.dumps(body) if body else ''''
    signature = generate_signature(method, path, timestamp, body_str)
    
    headers = {
        ''X-Access-Key'': ACCESS_KEY,
        ''X-Signature'': signature,
        ''X-Timestamp'': timestamp,
        ''Content-Type'': ''application/json''
    }
    
    url = BASE_URL + path
    response = requests.request(method, url, headers=headers, json=body)
    return response.json()

# 使用示例
if __name__ == ''__main__'':
    # 获取用户信息
    user = request(''GET'', ''/user/1'')
    print(''用户信息:'', user)
    
    # 用户充值
    result = request(''POST'', ''/user/1/recharge'', {
        ''amount'': 100,
        ''type'': ''days'',
        ''description'': ''在线充值''
    })
    print(''充值结果:'', result)
```

## 在线充值集成示例

以下是一个完整的在线充值集成示例，展示如何实现用户在线支付后自动充值：

```javascript
// 支付回调处理
app.post(''/payment/callback'', async (req, res) => {
    const { order_id, user_id, amount, status } = req.body;
    
    // 验证支付状态
    if (status !== ''success'') {
        return res.json({ code: -1, message: ''支付失败'' });
    }
    
    try {
        // 调用扩展API为用户充值
        const result = await request(''POST'', ''/user/'' + user_id + ''/recharge'', {
            amount: parseFloat(amount),
            type: ''days'',
            description: ''在线支付充值 - 订单号: '' + order_id
        });
        
        if (result.code === 200) {
            // 更新订单状态
            await updateOrderStatus(order_id, ''completed'');
            res.json({ code: 0, message: ''充值成功'' });
        } else {
            res.json({ code: -1, message: result.message });
        }
    } catch (error) {
        console.error(''充值失败:'', error);
        res.json({ code: -1, message: ''充值失败'' });
    }
});
```
',
    'published',
    6,
    datetime('now'),
    datetime('now')
);
