# PlanService
> 套餐相关服务

---

## countAllEnabledPlans
> 计算套餐数量

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/PlanService/countAllEnabledPlans`
- RPC：`rpc countAllEnabledPlans(CountAllEnabledPlansRequest) returns (RPCCountResponse);`

**请求对象 (`CountAllEnabledPlansRequest`)**

```json
{}
```

**响应对象 (`RPCCountResponse`)**

```json
{
  "count": "int64 // 数量"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/PlanService/countAllEnabledPlans" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## createPlan
> 创建套餐

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/PlanService/createPlan`
- RPC：`rpc createPlan(CreatePlanRequest) returns (CreatePlanResponse);`

**请求对象 (`CreatePlanRequest`)**

```json
{
  "name": "string // 套餐名称",
  "description": "string // 套餐简介",
  "clusterId": "int64 // 集群ID",
  "trafficLimitJSON": "bytes // 流量限制",
  "bandwidthLimitPerNodeJSON": "bytes // 单节点带宽限制 json:bit_size_capacity",
  "hasFullFeatures": "bool // 是否有所有权限",
  "featuresJSON": "bytes // 权限列表，[code1, code2, ...]",
  "priceType": "string // 价格类型：traffic, bandwidth, period",
  "trafficPriceJSON": "bytes // 流量价格配置",
  "bandwidthPriceJSON": "bytes // 带宽价格配置",
  "monthlyPrice": "float // 月度价格",
  "seasonallyPrice": "float // 季度价格",
  "yearlyPrice": "float // 年度价格",
  "totalServers": "int32 // 可以添加的网站数",
  "totalServerNamesPerServer": "int32 // 每个网站可以添加的域名数",
  "totalServerNames": "int32 // 可以添加的域名总数",
  "dailyRequests": "int64 // 每日访问量额度",
  "monthlyRequests": "int64 // 每月访问量额度",
  "dailyWebsocketConnections": "int64 // 每日Websocket连接数额度",
  "monthlyWebsocketConnections": "int64 // 每月Websocket连接数额度",
  "maxUploadSizeJSON": "bytes // 文件最大上传尺寸 json:size_capacity"
}
```

**响应对象 (`CreatePlanResponse`)**

```json
{
  "planId": "int64"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/PlanService/createPlan" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## deletePlan
> 删除套餐

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/PlanService/deletePlan`
- RPC：`rpc deletePlan(DeletePlanRequest) returns (RPCSuccess);`

**请求对象 (`DeletePlanRequest`)**

```json
{
  "planId": "int64 // 套餐ID"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/PlanService/deletePlan" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findAllAvailablePlans
> 列出所有可用的套餐

- 角色：`admin`, `user`
- HTTP：`POST https://backend.dooki.cloud/PlanService/findAllAvailablePlans`
- RPC：`rpc findAllAvailablePlans(FindAllAvailablePlansRequest) returns (FindAllAvailablePlansResponse);`

**请求对象 (`FindAllAvailablePlansRequest`)**

```json
{}
```

**响应对象 (`FindAllAvailablePlansResponse`)**

```json
{
  "plans": "[]Plan // 套餐列表"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/PlanService/findAllAvailablePlans" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findBasicPlan
> 查找套餐基本信息

- 角色：`admin`, `user`
- HTTP：`POST https://backend.dooki.cloud/PlanService/findBasicPlan`
- RPC：`rpc findBasicPlan(FindBasicPlanRequest) returns (FindBasicPlanResponse);`

**请求对象 (`FindBasicPlanRequest`)**

```json
{
  "planId": "int64 // 套餐ID"
}
```

**响应对象 (`FindBasicPlanResponse`)**

```json
{
  "plan": "Plan // 套餐信息（只读取基本信息）"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/PlanService/findBasicPlan" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findEnabledPlan
> 查找单个套餐

- 角色：`admin`, `user`
- HTTP：`POST https://backend.dooki.cloud/PlanService/findEnabledPlan`
- RPC：`rpc findEnabledPlan(FindEnabledPlanRequest) returns (FindEnabledPlanResponse);`

**请求对象 (`FindEnabledPlanRequest`)**

```json
{
  "planId": "int64 // 套餐ID"
}
```

**响应对象 (`FindEnabledPlanResponse`)**

```json
{
  "plan": "Plan // 套餐信息"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/PlanService/findEnabledPlan" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## listEnabledPlans
> 列出单页套餐

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/PlanService/listEnabledPlans`
- RPC：`rpc listEnabledPlans(ListEnabledPlansRequest) returns (ListEnabledPlansResponse);`

**请求对象 (`ListEnabledPlansRequest`)**

```json
{
  "offset": "int64 // 读取位置",
  "size": "int64 // 数量，通常不能小于0"
}
```

**响应对象 (`ListEnabledPlansResponse`)**

```json
{
  "plans": "[]Plan // 套餐列表"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/PlanService/listEnabledPlans" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## sortPlans
> 对套餐进行排序

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/PlanService/sortPlans`
- RPC：`rpc sortPlans(SortPlansRequest) returns (RPCSuccess);`

**请求对象 (`SortPlansRequest`)**

```json
{
  "planIds": "[]int64 // 排序后的套餐ID列表"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/PlanService/sortPlans" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updatePlan
> 修改套餐

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/PlanService/updatePlan`
- RPC：`rpc updatePlan(UpdatePlanRequest) returns (RPCSuccess);`

**请求对象 (`UpdatePlanRequest`)**

```json
{
  "planId": "int64 // 套餐ID",
  "name": "string // 套餐名称",
  "description": "string // 套餐简介",
  "isOn": "bool // 是否启用",
  "clusterId": "int64 // 集群ID",
  "trafficLimitJSON": "bytes // 流量限制",
  "bandwidthLimitPerNodeJSON": "bytes // 单节点带宽限制",
  "hasFullFeatures": "bool // 是否有所有权限",
  "featuresJSON": "bytes // 权限列表，[code1, code2, ...]",
  "priceType": "string // 价格类型：traffic, bandwidth, period",
  "trafficPriceJSON": "bytes // 流量价格配置",
  "bandwidthPriceJSON": "bytes // 带宽价格配置",
  "monthlyPrice": "float // 月费用",
  "seasonallyPrice": "float // 季度费用",
  "yearlyPrice": "float // 年度费用",
  "totalServers": "int32 // 可以添加的网站数",
  "totalServerNamesPerServer": "int32 // 每个网站可以添加的域名数",
  "totalServerNames": "int32 // 可以添加的域名总数",
  "dailyRequests": "int64 // 每日访问量额度",
  "monthlyRequests": "int64 // 每月访问量额度",
  "dailyWebsocketConnections": "int64 // 每日Websocket连接数额度",
  "monthlyWebsocketConnections": "int64 // 每月Websocket连接数额度",
  "maxUploadSizeJSON": "bytes // 文件最大上传尺寸 json:size_capacity"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/PlanService/updatePlan" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---
