Skip to content

app-bff-api と admin-bff-api を統合 - #46

Open
kantacky wants to merge 5 commits into
mainfrom
feat/integrate-bff-apis
Open

app-bff-api と admin-bff-api を統合#46
kantacky wants to merge 5 commits into
mainfrom
feat/integrate-bff-apis

Conversation

@kantacky

@kantacky kantacky commented Aug 1, 2026

Copy link
Copy Markdown
Member

変更点

fun-dotto/app-bff-apifun-dotto/admin-bff-api の 2 リポジトリを、本リポジトリのモジュラーモノリス規約に沿って統合しました。

配置

統合元 統合先
app-bff-api/internal/* internal/modules/app/{domain,external,handler,middleware,repository,service}
admin-bff-api/internal/* internal/modules/admin/{handler,middleware}
両者の internal/infrastructure/clients.go internal/shared/apiclient/clients.go
cmd/server/main.go cmd/app-api/main.go / cmd/admin-api/main.go

OpenAPI 仕様

  • 仕様の原本は api/openapi/{app,admin}/openapi.yaml に既に存在するものをそのまま利用し、複製は作っていません。
  • cmd/admin-api は統合元と同じく実行時に相対パスで仕様を読み、リクエストバリデータと Firebase 認証を構築します。runtime image への同梱は、cmd/migratemigrations/ を読むのと同じ方式で Dockerfile に追加しました。
  • cmd/app-api は統合元でもリクエストバリデータを使っていないため、導入していません(挙動維持)。

生成コードの扱い

統合元が持っていた generated/external/*_api再生成せず廃止しました。両 BFF の外部 spec は本リポジトリの api/openapi/{academic,announcement,funch,user}/openapi.yaml と一致(funch のみ引用符スタイル差のみ)で、既存の gen/* が 4 サービスとも client: true で生成済みだったため、import エイリアスのみで解決しています。gen/{app,admin} も既存のものを利用しています。

その他

  • 外部 API クライアントの初期化を internal/shared/apiclient に集約(統合元 2 つでほぼ同一の実装が重複していたため)。google.golang.org/api を直接依存へ昇格。
  • サーバ起動を internal/shared/server.Run に統一。
  • Dockerfile のビルド対象、.github/actions/set-envDEPLOY_TARGETSmise.tomlbuild / 起動タスクに app-apiadmin-api を追加。
  • mise.tomlbuild から漏れていた announcement-api / user-api も追加(Dockerfile 側には元からあり、CI の mise run build が検証できていなかったため)。

移植の忠実性

internal/ 配下は統合元のコピーで、ロジックの変更はありません。統合元と 1 ファイルずつ比較した結果は次の通りです。

ファイル数 完全一致 import 行のみ差分 それ以外の差分
app 67 14 47 6
admin 23 2 21 0

app の「それ以外の差分」6 件はすべて gofmt による整形結果です。統合元に gofmt 未適用の箇所が残っていたためで、内訳は構造体フィールドのアラインメント調整が 4 件(external/room_change_model.gohandler/room_change.gorepository/announcement_mock.gorepository/funch_mock.go)、ファイル末尾の余分な空行削除が 2 件(service/academic.goservice/academic_test.go)です。

意図的に手を入れたのは以下の 3 点だけです。

  1. import パスの一括書き換え
  2. internal/infrastructure/clients.gointernal/shared/apiclient へ集約する際の書き直し(URL 取得を requireURL に切り出し、初期化順を整理)
  3. cmd/*/main.go の起動処理(router.Runinternal/shared/server.Run)と、admin の仕様読み込みパス

確認内容

  • go build ./... / go vet ./... / go test ./... がすべて通過(統合元の既存テストを含む)。
  • gofmt 差分なし。

マージ前に別途必要な対応

  • .env.example: ACADEMIC_API_URL / ANNOUNCEMENT_API_URL / FUNCH_API_URL / USER_API_URL の追記が必要です(作業環境の制約でこの PR には含めていません)。
  • Cloud Run の環境変数: 統合元の deploy.yml は上記 4 つを env_vars でデプロイ時に投入していましたが、本リポジトリの cd.yml は既存サービスも含め env を管理していないため、その方針に合わせて追加していません。app-api / admin-api のサービス側に 4 つの URL を設定する必要があります。
  • 統合元リポジトリ固有のファイル(way submodule、Taskfile.ymlAGENTS.md / CLAUDE.md.serena 等)は取り込んでいません。

🤖 Generated with Claude Code

kantacky and others added 4 commits August 1, 2026 18:27
app / admin の BFF は academic・announcement・funch・user の各 Cloud Run
Service を ID トークン付き HTTP で呼び出す。統合元の 2 リポジトリはこの
初期化処理をほぼ同一の内容で個別に持っていたため、internal/shared/apiclient
として 1 つに集約する。

生成済みクライアントは gen/<service> に既に存在するため新規生成は行わず、
そこから import する。google.golang.org/api を直接依存へ昇格した。
このコミットでは基盤の追加のみで、利用側の配線は行わない。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
fun-dotto/app-bff-api のアプリケーションコードを
internal/modules/app 配下へ、エントリポイントを cmd/app-api へ移設する。

統合元の generated/external/*_api は再生成せず廃止した。統合元が持っていた
外部 spec は本リポジトリの api/openapi/<service>/openapi.yaml と一致しており、
gen/<service> が既に client 付きで生成済みのため、import エイリアスのみで
解決できる。外部クライアントの初期化は internal/shared/apiclient を使う。

サーバ起動は他モジュールと揃えて internal/shared/server.Run に統一した。
リクエストバリデータは統合元でも使っていないため導入していない。
api/openapi/app と gen/app は既存のものをそのまま利用する。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
fun-dotto/admin-bff-api のアプリケーションコードを
internal/modules/admin 配下へ、エントリポイントを cmd/admin-api へ移設する。

app モジュールと同様に generated/external/*_api は廃止し、gen/<service> の
生成済みクライアントと internal/shared/apiclient を使う形へ配線し直した。

統合元は OpenAPI 仕様を実行時に openapi/openapi.yaml から読んでいたが、
distroless イメージには仕様ファイルが同梱されないため、他モジュールと同じく
openapispec パッケージで go:embed する方式へ変更した。
サーバ起動も internal/shared/server.Run に統一している。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Dockerfile のビルド対象、CD の DEPLOY_TARGETS、mise の build / 起動タスクへ
app-api と admin-api を追加する。両者は末尾が -api のため Cloud Run Service
として分類される。

あわせて mise の build タスクから漏れていた announcement-api と user-api も
追加した。Dockerfile 側には元からあり、CI の mise run build がこの 2 つを
検証できていなかったため。

generate:openapi には、openapispec/ へ go:embed する仕様の複製を毎回
コピーし直すステップを追加し、元仕様との乖離を防ぐ。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@kantacky kantacky self-assigned this Aug 1, 2026
OpenAPI 仕様の原本は api/openapi/admin/openapi.yaml に既に存在するため、
go:embed 用に internal/modules/admin/openapispec/ へ複製する必要はない。
複製と、それを同期するための generate:openapi のコピー手順を削除した。

仕様は統合元と同じく実行時に相対パスで読む。runtime image への同梱は
cmd/migrate が migrations/ を読むのと同じ方式で Dockerfile に追加している。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying fun-dotto-server-docs with  Cloudflare Pages  Cloudflare Pages

Latest commit: a62e7d6
Status: ✅  Deploy successful!
Preview URL: https://8fbdfd39.fun-dotto-server-docs.pages.dev
Branch Preview URL: https://feat-integrate-bff-apis.fun-dotto-server-docs.pages.dev

View logs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant