Sequence Diagram
sequenceDiagram
participant Client as クライアント<br/>(API経由)
participant Remix as Remix Server<br/>(Cloudflare Pages)
participant Loader as api+/blog.ts loader
participant APIClient as API Client<br/>(@portfolio/api)
participant API as API Server<br/>(Hono)
participant Container as DIContainer
participant UseCase as GetPostsUseCase
participant Repository as PostRepository
participant DB as D1 Database
Client->>Remix: GET /api/blog
Remix->>Loader: loader実行
Loader->>Loader: API URL取得<br/>(VITE_API_URL)
Loader->>APIClient: createApiClient(apiUrl)
Loader->>APIClient: api.posts.listPosts()
APIClient->>API: GET /api/posts
API->>Container: DIContainer作成(DB)
Container->>UseCase: getGetPostsUseCase()
API->>UseCase: execute()
UseCase->>Repository: findAll()
Repository->>DB: SELECT * FROM posts
DB-->>Repository: posts[]
Repository-->>UseCase: Post[]
UseCase-->>API: Post[]
API-->>APIClient: 200 Post[]
APIClient-->>Loader: response.data
alt postsが空の場合
Loader-->>Remix: 404 Response
Remix-->>Client: 404 JSON
else 正常な場合
Loader-->>Remix: Post[]
Remix-->>Client: 200 JSON Post[]
end