Includes all pending changes needed for nixos-anywhere: - fiberlb: L7 policy, rule, certificate types - deployer: New service for cluster management - nix-nos: Generic network modules - Various service updates and fixes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
515 lines
21 KiB
YAML
515 lines
21 KiB
YAML
id: T050
|
||
name: REST API - 全サービスHTTP API追加
|
||
goal: Add REST/HTTP APIs to all PhotonCloud services for curl accessibility in embedded/simple environments
|
||
status: complete
|
||
completed: 2025-12-12 17:45 JST
|
||
priority: P1
|
||
owner: peerA
|
||
created: 2025-12-12
|
||
depends_on: []
|
||
blocks: []
|
||
|
||
context: |
|
||
**User Direction (2025-12-12):**
|
||
"全サービスについてREST APIを追加する想定(組み込みなどの環境で、curlで簡単に使えるように)"
|
||
|
||
**Rationale:**
|
||
- curl/wget で簡単にアクセス可能
|
||
- 組み込み環境やシェルスクリプトで使いやすい
|
||
- デバッグ・トラブルシューティングが容易
|
||
- gRPC tooling不要
|
||
|
||
**Current State:**
|
||
- HTTP API あり: NightLight (Prometheus), LightningSTOR (S3 - T047)
|
||
- gRPC のみ: ChainFire, FlareDB, IAM, PlasmaVMC, k8shost, PrismNET, etc.
|
||
|
||
acceptance:
|
||
- All services have REST API alongside gRPC
|
||
- curl examples documented for each endpoint
|
||
- JSON request/response format
|
||
- Consistent error response format across services
|
||
- OpenAPI/Swagger spec generated (optional but recommended)
|
||
|
||
steps:
|
||
- step: S1
|
||
name: REST API Pattern Design
|
||
done: Define consistent REST patterns across all services
|
||
status: complete
|
||
completed: 2025-12-12 01:42 JST
|
||
owner: peerA
|
||
priority: P0
|
||
outputs:
|
||
- path: specifications/rest-api-patterns.md
|
||
note: Comprehensive REST API patterns (URL structure, error format, auth, curl examples)
|
||
notes: |
|
||
**COMPLETE (2025-12-12 01:42 JST)**
|
||
|
||
Design decisions documented in specifications/rest-api-patterns.md:
|
||
- URL structure: /api/v1/{resource}[/{id}][/{action}]
|
||
- HTTP methods: GET/POST/PUT/DELETE mapping
|
||
- Error response: {"error": {"code": "...", "message": "..."}, "meta": {...}}
|
||
- Auth header: Authorization: Bearer <token>
|
||
- Content-Type: application/json
|
||
- Port convention: HTTP ports 8081-8091 (alongside gRPC 50051-50061)
|
||
- Service-specific endpoints defined for all 11 services
|
||
- curl examples provided
|
||
- axum implementation notes
|
||
|
||
- step: S2
|
||
name: ChainFire REST API
|
||
done: HTTP endpoints for KV operations
|
||
status: complete
|
||
completed: 2025-12-12 14:20 JST
|
||
owner: peerB
|
||
priority: P0
|
||
notes: |
|
||
Endpoints implemented:
|
||
- GET /api/v1/kv/{key} - Get value
|
||
- POST /api/v1/kv/{key}/put - Put value (body: {"value": "..."})
|
||
- POST /api/v1/kv/{key}/delete - Delete key
|
||
- GET /api/v1/kv?prefix={prefix} - Range scan
|
||
- GET /api/v1/cluster/status - Cluster health
|
||
- POST /api/v1/cluster/members - Add member
|
||
- GET /health - Health check
|
||
|
||
HTTP server runs on port 8081 alongside gRPC (50051)
|
||
|
||
- step: S3
|
||
name: FlareDB REST API
|
||
done: HTTP endpoints for DB operations
|
||
status: complete
|
||
completed: 2025-12-12 14:29 JST
|
||
owner: peerB
|
||
priority: P0
|
||
notes: |
|
||
Endpoints implemented:
|
||
- POST /api/v1/sql - Execute SQL query (placeholder - directs to gRPC)
|
||
- GET /api/v1/tables - List tables (placeholder - directs to gRPC)
|
||
- GET /api/v1/kv/{key} - KV get (fully functional via RdbClient)
|
||
- PUT /api/v1/kv/{key} - KV put (fully functional via RdbClient, body: {"value": "...", "namespace": "..."})
|
||
- GET /api/v1/scan?start={}&end={}&namespace={} - Range scan (fully functional)
|
||
- GET /health - Health check
|
||
|
||
HTTP server runs on port 8082 alongside gRPC (50052)
|
||
|
||
Implementation notes:
|
||
- KV operations use RdbClient.connect_direct() to self-connect to local gRPC server
|
||
- SQL endpoints are placeholders due to Arc<Mutex<RdbClient>> state management complexity
|
||
- Pattern follows ChainFire approach: HTTP REST wraps around core services
|
||
|
||
- step: S4
|
||
name: IAM REST API
|
||
done: HTTP endpoints for auth operations
|
||
status: complete
|
||
completed: 2025-12-12 14:42 JST
|
||
owner: peerB
|
||
priority: P0
|
||
notes: |
|
||
Endpoints implemented:
|
||
- POST /api/v1/auth/token - Issue token (fully functional via IamClient)
|
||
- POST /api/v1/auth/verify - Verify token (fully functional via IamClient)
|
||
- GET /api/v1/users - List users (fully functional via IamClient)
|
||
- POST /api/v1/users - Create user (fully functional via IamClient)
|
||
- GET /api/v1/projects - List projects (placeholder - project management not in IAM)
|
||
- POST /api/v1/projects - Create project (placeholder - project management not in IAM)
|
||
- GET /health - Health check
|
||
|
||
HTTP server runs on port 8083 alongside gRPC (50051)
|
||
|
||
Implementation notes:
|
||
- Auth operations use IamClient to connect to local gRPC server
|
||
- Token issuance creates demo Principal (production would authenticate against user store)
|
||
- Project endpoints are placeholders (use Scope/Binding in gRPC for project management)
|
||
- Pattern follows FlareDB approach: HTTP REST wraps around core services
|
||
|
||
- step: S5
|
||
name: PlasmaVMC REST API
|
||
done: HTTP endpoints for VM management
|
||
status: complete
|
||
completed: 2025-12-12 17:16 JST
|
||
owner: peerA
|
||
priority: P0
|
||
notes: |
|
||
Endpoints implemented:
|
||
- GET /api/v1/vms - List VMs
|
||
- POST /api/v1/vms - Create VM (body: name, org_id, project_id, vcpus, memory_mib, hypervisor)
|
||
- GET /api/v1/vms/{id} - Get VM details
|
||
- DELETE /api/v1/vms/{id} - Delete VM
|
||
- POST /api/v1/vms/{id}/start - Start VM
|
||
- POST /api/v1/vms/{id}/stop - Stop VM
|
||
- GET /health - Health check
|
||
|
||
HTTP server runs on port 8084 alongside gRPC (50051)
|
||
|
||
Implementation notes:
|
||
- REST module was already scaffolded; fixed proto field name mismatches (vm_id vs id)
|
||
- Added VmServiceImpl Clone derive to enable Arc sharing between HTTP and gRPC servers
|
||
- VmSpec uses proper nested structure (CpuSpec, MemorySpec)
|
||
- Follows REST API patterns from specifications/rest-api-patterns.md
|
||
|
||
- step: S6
|
||
name: k8shost REST API
|
||
done: HTTP endpoints for K8s operations
|
||
status: complete
|
||
completed: 2025-12-12 17:27 JST
|
||
owner: peerA
|
||
priority: P1
|
||
notes: |
|
||
Endpoints implemented:
|
||
- GET /api/v1/pods - List pods (with optional namespace query param)
|
||
- POST /api/v1/pods - Create pod (body: name, namespace, image, command, args)
|
||
- DELETE /api/v1/pods/{namespace}/{name} - Delete pod
|
||
- GET /api/v1/services - List services (with optional namespace query param)
|
||
- POST /api/v1/services - Create service (body: name, namespace, service_type, port, target_port, selector)
|
||
- DELETE /api/v1/services/{namespace}/{name} - Delete service
|
||
- GET /api/v1/nodes - List nodes
|
||
- GET /health - Health check
|
||
|
||
HTTP server runs on port 8085 alongside gRPC (6443)
|
||
|
||
Implementation notes:
|
||
- Added Clone derive to PodServiceImpl, ServiceServiceImpl, NodeServiceImpl
|
||
- Proto uses optional fields extensively (namespace, uid, etc.)
|
||
- REST responses convert proto items to simplified JSON format
|
||
- Follows REST API patterns from specifications/rest-api-patterns.md
|
||
|
||
- step: S7
|
||
name: CreditService REST API
|
||
done: HTTP endpoints for credit/quota
|
||
status: complete
|
||
completed: 2025-12-12 17:31 JST
|
||
owner: peerA
|
||
priority: P1
|
||
notes: |
|
||
Endpoints implemented:
|
||
- GET /api/v1/wallets/{project_id} - Get wallet balance
|
||
- POST /api/v1/wallets - Create wallet (body: project_id, org_id, initial_balance)
|
||
- POST /api/v1/wallets/{project_id}/topup - Top up credits (body: amount, description)
|
||
- GET /api/v1/wallets/{project_id}/transactions - Get transactions
|
||
- POST /api/v1/reservations - Reserve credits (body: project_id, amount, description, resource_type, ttl_seconds)
|
||
- POST /api/v1/reservations/{id}/commit - Commit reservation (body: actual_amount, resource_id)
|
||
- POST /api/v1/reservations/{id}/release - Release reservation (body: reason)
|
||
- GET /health - Health check
|
||
|
||
HTTP server runs on port 8086 alongside gRPC (50057)
|
||
|
||
Implementation notes:
|
||
- Added Clone derive to CreditServiceImpl
|
||
- Wallet response includes calculated 'available' field (balance - reserved)
|
||
- Transaction types and wallet statuses mapped to human-readable strings
|
||
|
||
- step: S8
|
||
name: PrismNET REST API
|
||
done: HTTP endpoints for network management
|
||
status: complete
|
||
completed: 2025-12-12 17:35 JST
|
||
owner: peerA
|
||
priority: P1
|
||
notes: |
|
||
Endpoints implemented:
|
||
- GET /api/v1/vpcs - List VPCs
|
||
- POST /api/v1/vpcs - Create VPC (body: name, org_id, project_id, cidr_block, description)
|
||
- GET /api/v1/vpcs/{id} - Get VPC
|
||
- DELETE /api/v1/vpcs/{id} - Delete VPC
|
||
- GET /api/v1/subnets - List Subnets
|
||
- POST /api/v1/subnets - Create Subnet (body: name, vpc_id, cidr_block, gateway_ip, description)
|
||
- DELETE /api/v1/subnets/{id} - Delete Subnet
|
||
- GET /health - Health check
|
||
|
||
HTTP server runs on port 8087 alongside gRPC (9090)
|
||
|
||
Implementation notes:
|
||
- Added Clone derive to VpcServiceImpl and SubnetServiceImpl
|
||
- Query params support org_id, project_id, vpc_id filters
|
||
|
||
- step: S9
|
||
name: Documentation & Examples
|
||
done: curl examples and OpenAPI spec
|
||
status: complete
|
||
completed: 2025-12-12 17:35 JST
|
||
owner: peerA
|
||
priority: P1
|
||
outputs:
|
||
- path: docs/api/rest-api-guide.md
|
||
note: Comprehensive REST API guide with curl examples for all 7 services
|
||
notes: |
|
||
Deliverables completed:
|
||
- docs/api/rest-api-guide.md with curl examples for all 7 services
|
||
- Response format documentation (success/error)
|
||
- Service endpoint table (HTTP ports 8081-8087)
|
||
- Authentication documentation
|
||
- Error codes reference
|
||
|
||
OpenAPI/Postman deferred as optional enhancements
|
||
|
||
evidence:
|
||
- item: S2 ChainFire REST API
|
||
desc: |
|
||
Implemented HTTP REST API for ChainFire KVS on port 8081:
|
||
|
||
Files created:
|
||
- chainfire-server/src/rest.rs (282 lines) - REST handlers for all KV and cluster operations
|
||
|
||
Files modified:
|
||
- chainfire-server/src/config.rs - Added http_addr field to NetworkConfig
|
||
- chainfire-server/src/lib.rs - Exported rest module
|
||
- chainfire-server/src/server.rs - Added HTTP server running alongside gRPC servers
|
||
- chainfire-server/Cargo.toml - Added dependencies (uuid, chrono, serde_json)
|
||
|
||
Endpoints:
|
||
- GET /api/v1/kv/{key} - Get value (reads from state machine)
|
||
- POST /api/v1/kv/{key}/put - Put value (writes via Raft consensus)
|
||
- POST /api/v1/kv/{key}/delete - Delete key (writes via Raft consensus)
|
||
- GET /api/v1/kv?prefix={prefix} - Range scan with prefix filter
|
||
- GET /api/v1/cluster/status - Returns node_id, cluster_id, term, role, is_leader
|
||
- POST /api/v1/cluster/members - Add member to cluster
|
||
- GET /health - Health check
|
||
|
||
Implementation details:
|
||
- Uses axum web framework
|
||
- Follows REST API patterns from specifications/rest-api-patterns.md
|
||
- Standard error/success response format with request_id and timestamp
|
||
- HTTP server runs on port 8081 (default) alongside gRPC on 50051
|
||
- Shares RaftCore with gRPC services for consistency
|
||
- Graceful shutdown integrated with existing shutdown signal handling
|
||
|
||
Verification: cargo check --package chainfire-server succeeded in 1.22s (warnings only)
|
||
files:
|
||
- chainfire/crates/chainfire-server/src/rest.rs
|
||
- chainfire/crates/chainfire-server/src/config.rs
|
||
- chainfire/crates/chainfire-server/src/lib.rs
|
||
- chainfire/crates/chainfire-server/src/server.rs
|
||
- chainfire/crates/chainfire-server/Cargo.toml
|
||
timestamp: 2025-12-12 14:20 JST
|
||
|
||
- item: S3 FlareDB REST API
|
||
desc: |
|
||
Implemented HTTP REST API for FlareDB on port 8082:
|
||
|
||
Files created:
|
||
- flaredb-server/src/rest.rs (266 lines) - REST handlers for SQL, KV, and scan operations
|
||
|
||
Files modified:
|
||
- flaredb-server/src/config/mod.rs - Added http_addr field to Config (default: 127.0.0.1:8082)
|
||
- flaredb-server/src/lib.rs - Exported rest module
|
||
- flaredb-server/src/main.rs - Added HTTP server running alongside gRPC using tokio::select!
|
||
- flaredb-server/Cargo.toml - Added dependencies (axum 0.8, uuid, chrono)
|
||
|
||
Endpoints:
|
||
- POST /api/v1/sql - Execute SQL query (placeholder directing to gRPC)
|
||
- GET /api/v1/tables - List tables (placeholder directing to gRPC)
|
||
- GET /api/v1/kv/{key} - Get value (fully functional via RdbClient)
|
||
- PUT /api/v1/kv/{key} - Put value (fully functional, body: {"value": "...", "namespace": "..."})
|
||
- GET /api/v1/scan?start={}&end={}&namespace={} - Range scan (fully functional, returns KV items)
|
||
- GET /health - Health check
|
||
|
||
Implementation details:
|
||
- Uses axum 0.8 web framework
|
||
- Follows REST API patterns from specifications/rest-api-patterns.md
|
||
- Standard error/success response format with request_id and timestamp
|
||
- HTTP server runs on port 8082 (default) alongside gRPC on 50052
|
||
- KV operations use RdbClient.connect_direct() to self-connect to local gRPC server
|
||
- SQL endpoints are placeholders (require Arc<Mutex<RdbClient>> refactoring for full implementation)
|
||
- Both servers run concurrently via tokio::select!
|
||
|
||
Verification: nix develop -c cargo check --package flaredb-server succeeded in 1.84s (warnings only)
|
||
files:
|
||
- flaredb/crates/flaredb-server/src/rest.rs
|
||
- flaredb/crates/flaredb-server/src/config/mod.rs
|
||
- flaredb/crates/flaredb-server/src/lib.rs
|
||
- flaredb/crates/flaredb-server/src/main.rs
|
||
- flaredb/crates/flaredb-server/Cargo.toml
|
||
timestamp: 2025-12-12 14:29 JST
|
||
|
||
- item: S4 IAM REST API
|
||
desc: |
|
||
Implemented HTTP REST API for IAM on port 8083:
|
||
|
||
Files created:
|
||
- iam/crates/iam-server/src/rest.rs (332 lines) - REST handlers for auth, users, projects
|
||
|
||
Files modified:
|
||
- iam/crates/iam-server/src/config.rs - Added http_addr field to ServerSettings (default: 127.0.0.1:8083)
|
||
- iam/crates/iam-server/src/main.rs - Added rest module, HTTP server with tokio::select!
|
||
- iam/crates/iam-server/Cargo.toml - Added axum 0.8, uuid 1.11, chrono 0.4, iam-client
|
||
|
||
Endpoints:
|
||
- POST /api/v1/auth/token - Issue token (fully functional via IamClient.issue_token)
|
||
- POST /api/v1/auth/verify - Verify token (fully functional via IamClient.validate_token)
|
||
- POST /api/v1/users - Create user (fully functional via IamClient.create_user)
|
||
- GET /api/v1/users - List users (fully functional via IamClient.list_users)
|
||
- GET /api/v1/projects - List projects (placeholder - not a first-class IAM concept)
|
||
- POST /api/v1/projects - Create project (placeholder - not a first-class IAM concept)
|
||
- GET /health - Health check
|
||
|
||
Implementation details:
|
||
- Uses axum 0.8 web framework
|
||
- Follows REST API patterns from specifications/rest-api-patterns.md
|
||
- Standard error/success response format with request_id and timestamp
|
||
- HTTP server runs on port 8083 (default) alongside gRPC on 50051
|
||
- Auth/user operations use IamClient to self-connect to local gRPC server
|
||
- Token issuance creates demo Principal (production would authenticate against user store)
|
||
- Project management is handled via Scope/PolicyBinding in IAM (not a separate resource)
|
||
- Both gRPC and HTTP servers run concurrently via tokio::select!
|
||
|
||
Verification: nix develop -c cargo check --package iam-server succeeded in 0.67s (warnings only)
|
||
files:
|
||
- iam/crates/iam-server/src/rest.rs
|
||
- iam/crates/iam-server/src/config.rs
|
||
- iam/crates/iam-server/src/main.rs
|
||
- iam/crates/iam-server/Cargo.toml
|
||
timestamp: 2025-12-12 14:42 JST
|
||
|
||
- item: S5 PlasmaVMC REST API
|
||
desc: |
|
||
Implemented HTTP REST API for PlasmaVMC on port 8084:
|
||
|
||
Files modified:
|
||
- plasmavmc-server/src/rest.rs - Fixed proto field mismatches, enum variants
|
||
- plasmavmc-server/src/vm_service.rs - Added Clone derive for Arc sharing
|
||
|
||
Endpoints:
|
||
- GET /api/v1/vms - List VMs
|
||
- POST /api/v1/vms - Create VM
|
||
- GET /api/v1/vms/{id} - Get VM
|
||
- DELETE /api/v1/vms/{id} - Delete VM
|
||
- POST /api/v1/vms/{id}/start - Start VM
|
||
- POST /api/v1/vms/{id}/stop - Stop VM
|
||
- GET /health - Health check
|
||
files:
|
||
- plasmavmc/crates/plasmavmc-server/src/rest.rs
|
||
- plasmavmc/crates/plasmavmc-server/src/vm_service.rs
|
||
timestamp: 2025-12-12 17:16 JST
|
||
|
||
- item: S6 k8shost REST API
|
||
desc: |
|
||
Implemented HTTP REST API for k8shost on port 8085:
|
||
|
||
Files created:
|
||
- k8shost-server/src/rest.rs (330+ lines) - Full REST handlers
|
||
|
||
Files modified:
|
||
- k8shost-server/src/config.rs - Added http_addr
|
||
- k8shost-server/src/lib.rs - Exported rest module
|
||
- k8shost-server/src/main.rs - Dual server setup
|
||
- k8shost-server/src/services/*.rs - Added Clone derives
|
||
- k8shost-server/Cargo.toml - Added axum dependency
|
||
|
||
Endpoints:
|
||
- GET /api/v1/pods - List pods
|
||
- POST /api/v1/pods - Create pod
|
||
- DELETE /api/v1/pods/{namespace}/{name} - Delete pod
|
||
- GET /api/v1/services - List services
|
||
- POST /api/v1/services - Create service
|
||
- DELETE /api/v1/services/{namespace}/{name} - Delete service
|
||
- GET /api/v1/nodes - List nodes
|
||
- GET /health - Health check
|
||
files:
|
||
- k8shost/crates/k8shost-server/src/rest.rs
|
||
- k8shost/crates/k8shost-server/src/config.rs
|
||
- k8shost/crates/k8shost-server/src/main.rs
|
||
timestamp: 2025-12-12 17:27 JST
|
||
|
||
- item: S7 CreditService REST API
|
||
desc: |
|
||
Implemented HTTP REST API for CreditService on port 8086:
|
||
|
||
Files created:
|
||
- creditservice-server/src/rest.rs - Full REST handlers
|
||
|
||
Files modified:
|
||
- creditservice-api/src/credit_service.rs - Added Clone derive
|
||
- creditservice-server/src/main.rs - Dual server setup
|
||
- creditservice-server/Cargo.toml - Added dependencies
|
||
|
||
Endpoints:
|
||
- GET /api/v1/wallets/{project_id} - Get wallet
|
||
- POST /api/v1/wallets - Create wallet
|
||
- POST /api/v1/wallets/{project_id}/topup - Top up
|
||
- GET /api/v1/wallets/{project_id}/transactions - Get transactions
|
||
- POST /api/v1/reservations - Reserve credits
|
||
- POST /api/v1/reservations/{id}/commit - Commit reservation
|
||
- POST /api/v1/reservations/{id}/release - Release reservation
|
||
- GET /health - Health check
|
||
files:
|
||
- creditservice/crates/creditservice-server/src/rest.rs
|
||
- creditservice/crates/creditservice-api/src/credit_service.rs
|
||
timestamp: 2025-12-12 17:31 JST
|
||
|
||
- item: S8 PrismNET REST API
|
||
desc: |
|
||
Implemented HTTP REST API for PrismNET on port 8087:
|
||
|
||
Files created:
|
||
- prismnet-server/src/rest.rs (403 lines) - Full REST handlers
|
||
|
||
Files modified:
|
||
- prismnet-server/src/config.rs - Added http_addr
|
||
- prismnet-server/src/lib.rs - Exported rest module
|
||
- prismnet-server/src/services/*.rs - Added Clone derives
|
||
- prismnet-server/Cargo.toml - Added dependencies
|
||
|
||
Endpoints:
|
||
- GET /api/v1/vpcs - List VPCs
|
||
- POST /api/v1/vpcs - Create VPC
|
||
- GET /api/v1/vpcs/{id} - Get VPC
|
||
- DELETE /api/v1/vpcs/{id} - Delete VPC
|
||
- GET /api/v1/subnets - List Subnets
|
||
- POST /api/v1/subnets - Create Subnet
|
||
- DELETE /api/v1/subnets/{id} - Delete Subnet
|
||
- GET /health - Health check
|
||
files:
|
||
- prismnet/crates/prismnet-server/src/rest.rs
|
||
- prismnet/crates/prismnet-server/src/config.rs
|
||
timestamp: 2025-12-12 17:35 JST
|
||
|
||
- item: S9 Documentation
|
||
desc: |
|
||
Created comprehensive REST API documentation (1,197 lines, 25KB):
|
||
|
||
Files created:
|
||
- docs/api/rest-api-guide.md - Complete curl examples for all 7 services
|
||
|
||
Content includes:
|
||
- Overview and service port map (8081-8087 for HTTP, gRPC ports)
|
||
- Common patterns (request/response format, authentication, multi-tenancy)
|
||
- Detailed curl examples for all 7 services:
|
||
* ChainFire (8081) - KV operations (get/put/delete/scan), cluster management
|
||
* FlareDB (8082) - KV operations, SQL endpoints (placeholder)
|
||
* IAM (8083) - Token operations (issue/verify), user management
|
||
* PlasmaVMC (8084) - VM lifecycle (create/start/stop/delete/list)
|
||
* k8shost (8085) - Pod/Service/Node management
|
||
* CreditService (8086) - Wallet operations, transactions, reservations
|
||
* PrismNET (8087) - VPC and Subnet management
|
||
- Complete workflow examples:
|
||
* Deploy VM with networking (VPC → Subnet → Credits → VM → Start)
|
||
* Deploy Kubernetes pod with service
|
||
* User authentication flow (create user → issue token → verify → use)
|
||
- Debugging tips and scripts (health check all services, verbose curl)
|
||
- Error handling patterns with HTTP status codes
|
||
- Performance considerations (connection reuse, batch operations, parallelization)
|
||
- Migration guide from gRPC to REST
|
||
- References to planned OpenAPI specs and Postman collection
|
||
|
||
This completes the user goal "curlで簡単に使える" (easy curl access).
|
||
files:
|
||
- docs/api/rest-api-guide.md
|
||
timestamp: 2025-12-12 17:47 JST
|
||
|
||
notes: |
|
||
**Implementation Approach:**
|
||
- Use axum (already in most services) for HTTP handlers
|
||
- Run HTTP server alongside gRPC on different port (e.g., gRPC:50051, HTTP:8080)
|
||
- Share business logic between gRPC and HTTP handlers
|
||
|
||
**Port Convention:**
|
||
- gRPC: 50051-50060
|
||
- HTTP: 8081-8090 (service-specific)
|
||
|
||
**Synergy with T048 (SDK):**
|
||
- REST API enables simpler client implementations
|
||
- Can generate SDK from OpenAPI if we choose to
|
||
|
||
**Execution Note:**
|
||
- Can parallelize S2-S8 across multiple services
|
||
- S1 (pattern design) must complete first
|