# OpenAPI 3.0 使用指南

## 📚 概述

從 v1.1.0 開始，`go-doc` 支援生成 **Swagger 2.0** 和 **OpenAPI 3.0** 兩種規格。

## 🚀 快速開始

### 生成 Swagger 2.0（預設）
```bash
go-doc -a example/example.api -d output
```

### 生成 OpenAPI 3.0
```bash
go-doc -a example/example.api -d output -s openapi3.0
```

### 生成 OpenAPI 3.0 YAML
```bash
go-doc -a example/example.api -d output -s openapi3.0 -y
```

## 🔍 兩種規格的差異

### 1. 版本宣告
**Swagger 2.0:**
```json
{
  "swagger": "2.0"
}
```

**OpenAPI 3.0:**
```json
{
  "openapi": "3.0.3"
}
```

### 2. 伺服器定義
**Swagger 2.0:**
```json
{
  "host": "example.com",
  "basePath": "/v1",
  "schemes": ["http", "https"]
}
```

**OpenAPI 3.0:**
```json
{
  "servers": [
    {"url": "http://example.com/v1"},
    {"url": "https://example.com/v1"}
  ]
}
```

### 3. 資料模型定義
**Swagger 2.0:**
```json
{
  "definitions": {
    "User": {
      "type": "object",
      "properties": {...}
    }
  }
}
```

**OpenAPI 3.0:**
```json
{
  "components": {
    "schemas": {
      "User": {
        "type": "object",
        "properties": {...}
      }
    }
  }
}
```

### 4. 安全定義
**Swagger 2.0:**
```json
{
  "securityDefinitions": {
    "apiKey": {
      "type": "apiKey",
      "in": "header",
      "name": "Authorization"
    }
  }
}
```

**OpenAPI 3.0:**
```json
{
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "Authorization"
      }
    }
  }
}
```

### 5. 請求內容
**Swagger 2.0:**
```json
{
  "parameters": [
    {
      "in": "body",
      "name": "body",
      "schema": {"$ref": "#/definitions/User"}
    }
  ]
}
```

**OpenAPI 3.0:**
```json
{
  "requestBody": {
    "content": {
      "application/json": {
        "schema": {"$ref": "#/components/schemas/User"}
      }
    }
  }
}
```

### 6. 回應內容
**Swagger 2.0:**
```json
{
  "responses": {
    "200": {
      "description": "Success",
      "schema": {"$ref": "#/definitions/User"}
    }
  }
}
```

**OpenAPI 3.0:**
```json
{
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {"$ref": "#/components/schemas/User"}
        }
      }
    }
  }
}
```

## 🎯 使用範例

### 完整範例：生成多種格式

```bash
# Swagger 2.0 JSON
go-doc -a example/example.api -d output -f api-swagger2

# Swagger 2.0 YAML
go-doc -a example/example.api -d output -f api-swagger2 -y

# OpenAPI 3.0 JSON
go-doc -a example/example.api -d output -f api-openapi3 -s openapi3.0

# OpenAPI 3.0 YAML
go-doc -a example/example.api -d output -f api-openapi3 -s openapi3.0 -y
```

### 使用 Makefile

```bash
# 生成所有範例（包含 Swagger 2.0 和 OpenAPI 3.0）
make example

# 僅編譯
make build

# 測試
make test
```

## ⚙️ 轉換邏輯

`go-doc` 的內部轉換流程：

1. **解析 `.api` 檔案** → 使用 go-zero 的 API parser
2. **生成 Swagger 2.0 結構** → 基礎的 OpenAPI 2.0 規格
3. **轉換為 OpenAPI 3.0**（如果指定）→ 自動轉換：
   - `definitions` → `components/schemas`
   - `securityDefinitions` → `components/securitySchemes`
   - `host/basePath/schemes` → `servers`
   - body parameters → `requestBody`
4. **序列化輸出** → JSON 或 YAML 格式

## 🔧 技術細節

### 使用的函式庫
- **Swagger 2.0**: `github.com/go-openapi/spec`
- **OpenAPI 3.0**: `github.com/getkin/kin-openapi`

### 轉換函數
- `spec2Swagger()`: 將 go-zero API 轉為 Swagger 2.0
- `convertSwagger2ToOpenAPI3()`: 將 Swagger 2.0 轉為 OpenAPI 3.0

### 型別轉換
```go
// Swagger 2.0 Type
type: "string"

// OpenAPI 3.0 Type
type: &Types{"string"}
```

## 📖 參考資源

- [OpenAPI 3.0 Specification](https://spec.openapis.org/oas/v3.0.3)
- [Swagger 2.0 Specification](https://swagger.io/specification/v2/)
- [go-zero API 規範](https://go-zero.dev/docs/tutorials)

## ❓ 常見問題

### Q: 應該使用哪個版本？
**A:** 
- **Swagger 2.0**: 如果需要與舊工具或系統相容
- **OpenAPI 3.0**: 推薦使用，功能更強大且為現代標準

### Q: 可以同時生成兩種格式嗎？
**A:** 可以！執行兩次命令即可：
```bash
go-doc -a api.api -d out -f api-v2
go-doc -a api.api -d out -f api-v3 -s openapi3.0
```

### Q: 轉換有什麼限制嗎？
**A:** 大部分功能都能完整轉換。唯一差異是：
- OpenAPI 3.0 的 server URLs 會根據 schemes 自動生成多個
- 某些 Swagger 2.0 特定的擴展可能不會轉換

### Q: 如何驗證生成的文檔？
**A:** 可以使用以下工具：
- **Swagger Editor**: https://editor.swagger.io/
- **Swagger UI**: 本地運行或線上版本
- **OpenAPI Generator**: 生成客戶端/伺服器代碼來驗證

## 🎉 總結

`go-doc` 現在支援：
- ✅ Swagger 2.0 (OpenAPI 2.0)
- ✅ OpenAPI 3.0
- ✅ JSON 和 YAML 輸出
- ✅ 自動轉換
- ✅ 完整的 go-zero API 特性支援

開始使用：
```bash
go-doc -a your-api.api -d output -s openapi3.0
```
