# camelCase Migration Summary

## 🎯 目标

将项目从 snake_case JSON 迁移到 camelCase JSON，符合 REST API 最佳实践和 Google JSON Style Guide。

## ✅ 实施方案 A：全面 camelCase

### 架构设计

```
Backend Go
├─ struct fields: PascalCase (Go 规范)
└─ json tags: camelCase → JSON: camelCase
     ↓
OpenAPI
├─ schemas: PascalCase
└─ properties: camelCase
     ↓ Orval
Frontend TypeScript
├─ interfaces: PascalCase (TS 规范)
├─ properties: camelCase (TS 规范)
└─ JSON: camelCase (REST 标准)
```

## 📝 修改清单

### 1. Backend Go - JSON Tags (✅ 完成)

修改所有 DTO 文件的 JSON tags 从 snake_case → camelCase：

- ✅ `backend/internal/adapter/input/http/dto/cluster_dto.go`
  - `ca_data` → `caData`
  - `cert_data` → `certData`
  - `key_data` → `keyData`
  - `has_ca_data` → `hasCaData`
  - `created_at` → `createdAt`
  - `updated_at` → `updatedAt`

- ✅ `backend/internal/adapter/input/http/dto/auth_dto.go`
  - `refresh_token` → `refreshToken`
  - `access_token` → `accessToken`
  - `user_id` → `userId`

- ✅ `backend/internal/adapter/input/http/dto/registry_dto.go`
  - `has_password` → `hasPassword`
  - `created_at` → `createdAt`
  - `updated_at` → `updatedAt`

- ✅ `backend/internal/adapter/input/http/dto/instance_dto.go`
  - `registry_id` → `registryId`
  - `cluster_id` → `clusterId`
  - `values_yaml` → `valuesYaml`
  - `keep_history` → `keepHistory`

- ✅ `backend/internal/adapter/input/http/dto/artifact_dto.go`
  - `registry_id` → `registryId`
  - `registry_url` → `registryUrl`
  - `repository_name` → `repositoryName`
  - `catalog_supported` → `catalogSupported`
  - `media_type` → `mediaType`

- ✅ `backend/internal/adapter/input/http/dto/monitoring_dto.go`
  - All monitoring metrics fields converted to camelCase

### 2. OpenAPI Specification (✅ 完成)

- ✅ 创建转换脚本: `backend/scripts/convert-openapi-to-camelcase.cjs`
- ✅ 转换 `backend/docs/openapi.yaml` 所有属性为 camelCase
- ✅ 备份原文件: `backend/docs/openapi.yaml.backup`

### 3. Frontend Setup (✅ 完成)

#### 安装 Orval
- ✅ 添加 `orval@7.3.0` 到 `package.json`
- ✅ 运行 `npm install`

#### 配置 Orval
- ✅ 创建 `frontend/orval.config.ts`
- ✅ 配置生成器指向 OpenAPI 文件
- ✅ 配置 Axios mutator

#### 创建 Axios Mutator
- ✅ 创建 `frontend/src/api/axios-mutator.ts`
- ✅ 配置 Axios 实例和拦截器

#### 更新脚本
- ✅ 修改 `package.json` 的 `openapi-gen` 脚本使用 Orval
- ✅ 修改 `Makefile` 的 `openapi-gen-frontend` 使用 Orval

#### 创建文档和示例
- ✅ 创建 `frontend/src/api/README.md`
- ✅ 创建 `frontend/src/api/example.ts`
- ✅ 更新 `frontend/src/api/index.ts`

### 4. 工具文件 (✅ 保留备用)

- ✅ `frontend/src/api/case-converter.ts` - 保留作为工具函数
- ✅ `frontend/scripts/post-process-openapi.cjs` - 保留作为备用方案

## 🚀 使用方法

### 重新生成 API 代码

```bash
# 从项目根目录
make openapi-gen-frontend

# 或从 frontend 目录
cd frontend
npm run openapi-gen
```

### 前端使用示例

```typescript
import { createCluster, setAuthToken } from '@/api';

// 设置 token
setAuthToken('your-jwt-token');

// 创建集群 - 全部使用 camelCase ✅
const cluster = await createCluster({
  name: 'my-cluster',
  host: 'https://k8s.example.com',
  caData: 'base64...',      // ✅ camelCase
  certData: 'base64...',    // ✅ camelCase
  keyData: 'base64...',     // ✅ camelCase
});
```

## 📊 变更统计

- **后端 Go 文件**: 6 个 DTO 文件修改
- **JSON Tags 转换**: ~50+ 字段
- **OpenAPI 属性**: ~50+ 属性转换
- **新增文件**: 7 个
  - `orval.config.ts`
  - `axios-mutator.ts`
  - `case-converter.ts`
  - `api/README.md`
  - `api/example.ts`
  - `convert-openapi-to-camelcase.cjs`
  - `CAMELCASE-MIGRATION.md`

## ✨ 优势

1. **符合标准**: 遵循 REST API 和 JSON 最佳实践
2. **类型安全**: 完整的 TypeScript 类型支持
3. **IDE 友好**: 自动补全和类型检查
4. **无性能损耗**: 无需运行时转换
5. **维护简单**: OpenAPI 驱动，自动生成
6. **前后端一致**: 统一的命名规范

## 🔍 验证

### 检查生成的类型

```bash
grep -A 5 "export interface CreateClusterRequest" \
  frontend/src/api/generated-orval/api.schemas.ts
```

应该看到:
```typescript
export interface CreateClusterRequest {
  caData?: string;        // ✅ camelCase
  certData?: string;      // ✅ camelCase
  keyData?: string;       // ✅ camelCase
  ...
}
```

### 测试 API 调用

```bash
# 启动后端
cd backend && make run-mock

# 启动前端
cd frontend && npm run dev

# 测试 API
curl -X POST http://localhost:8080/api/v1/clusters \
  -H "Content-Type: application/json" \
  -d '{"name":"test","host":"https://k8s.example.com","caData":"..."}'
```

## 📚 参考文档

- `frontend/src/api/README.md` - API 使用文档
- `frontend/src/api/example.ts` - 代码示例
- [Orval Documentation](https://orval.dev/)
- [Google JSON Style Guide](https://google.github.io/styleguide/jsoncstyleguide.xml)

## 🎉 完成状态

✅ **方案 A 已全面实施完成！**

所有代码已修改为使用 camelCase：
- ✅ 后端 Go JSON tags
- ✅ OpenAPI 规范
- ✅ 前端 TypeScript 类型
- ✅ JSON 传输格式

项目现在符合现代 REST API 最佳实践！

