從 edge-ai-platform POC 轉為正式產品的雲端後端,含以下整合階段:
- Phase 0:雛形骨架 — `cmd/api-server` (REST :3721) + `cmd/remote-proxy`
(tunnel :3800 / internal :3801) 雙 binary 共用 internal/,沿用 POC 的
WebSocket+yamux tunnel 協定但解耦 relay 與 API
- Phase 0.6:OIDC BFF 接 Innovedus Member Center
- internal/oidc package(coreos/go-oidc + PKCE S256 + state + nonce)
- internal/usersession package(HMAC-SHA256 cookie + RotateSessionID
防 session fixation, OWASP ASVS V3.2.1)
- 4 個 OIDC handler(/api/auth/login|callback|me|logout)+ AuthMiddleware
- 完全拔除 StaticAuthProvider,OIDC 是唯一認證路徑
- 9 個 ADR(含 ADR-010 BFF / ADR-011 取代 static auth /
ADR-012 pending session shared cookie / ADR-013 PKCE-only public client)
- Phase 0.7:A1 改造 + security audit 修復
- OIDC ClientSecret 變選填,支援 stage MC 的 public PKCE-only client
(AuthStyleInParams 強制 token endpoint 不送 client_secret)
- 預留 ServiceClient* 欄位給未來 client_credentials grant
- 移除 13+ 處 resolveUserID(uc, StaticUserID) fallback 改 strict mode
(Audit C1:multi-tenant 隔離破口)
- Pairing exchange MarkUsed 失敗 abort + revoke session token(Audit M3)
- 新增 all_endpoints_require_auth_test 整合測試(51 endpoint × 401)
驗證:go test -race -count=3 ./... 17 packages 全綠 / go vet 0 warning
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
46 lines
1.3 KiB
Go
46 lines
1.3 KiB
Go
package converter
|
||
|
||
import (
|
||
"context"
|
||
"io"
|
||
)
|
||
|
||
// StubClient 是 Phase 0 的 converter Client stub。
|
||
//
|
||
// 所有方法回 ErrNotImplemented,用於讓 DI 流程能編譯運行,
|
||
// 但前端若真的呼叫到 converter API,會收到 501 / 明確錯誤訊息。
|
||
//
|
||
// 未來若需要假資料讓前端 UI 流程走通(PRD §8.5 建議),
|
||
// 可擴充為 FakeClient(產 fake job_id、模擬 queued → processing → completed)。
|
||
type StubClient struct{}
|
||
|
||
// NewStubClient 建立一個 StubClient 實例。
|
||
func NewStubClient() *StubClient {
|
||
return &StubClient{}
|
||
}
|
||
|
||
// SubmitConvert 回 ErrNotImplemented。
|
||
func (s *StubClient) SubmitConvert(ctx context.Context, req *ConvertRequest) (string, error) {
|
||
return "", ErrNotImplemented
|
||
}
|
||
|
||
// GetJob 回 ErrNotImplemented。
|
||
func (s *StubClient) GetJob(ctx context.Context, jobID string) (*Job, error) {
|
||
return nil, ErrNotImplemented
|
||
}
|
||
|
||
// ListJobs 回 ErrNotImplemented。
|
||
func (s *StubClient) ListJobs(ctx context.Context, userID string) ([]*Job, error) {
|
||
return nil, ErrNotImplemented
|
||
}
|
||
|
||
// DownloadResult 回 ErrNotImplemented。
|
||
func (s *StubClient) DownloadResult(ctx context.Context, jobID string) (io.ReadCloser, error) {
|
||
return nil, ErrNotImplemented
|
||
}
|
||
|
||
// CancelJob 回 ErrNotImplemented。
|
||
func (s *StubClient) CancelJob(ctx context.Context, jobID string) error {
|
||
return ErrNotImplemented
|
||
}
|