Skip to content

traPtitech/game3-back

Folders and files

NameName
Last commit message
Last commit date
Feb 10, 2024
Feb 3, 2024
Dec 12, 2024
Feb 3, 2024
Feb 1, 2024
Dec 12, 2024
Dec 25, 2023
Dec 25, 2023
Dec 25, 2023
Dec 25, 2023
Feb 10, 2024
Dec 15, 2024
Feb 9, 2024
Feb 9, 2024
Feb 1, 2024

Repository files navigation

game3 logo

game3-back

Game³のバックエンドです。

フロントエンド: https://github.com/traPtitech/game3-front

GoのフレームワークEchoを使用して作成しています。

ドキュメント

開発環境の実行

  • DockerDocker Compose(ver2.22以上)が必要です。
  • docker compose watchでアプリが起動し、以下にアクセスできます。
  • 認証部分を動かすためには.envファイルで環境変数を定義する必要があります。
    • https://ns.trap.jp/apps/0765eb937f27fdc377eec1/settings/envVars を参考に、
    • DISCORD_CLIENT_ID=NeoShowcaseと同じ
      DISCORD_CLIENT_SECRET=NeoShowcaseと同じ
      DISCORD_CLIENT_REDIRECT_URI="http://localhost:8080/api/auth/callback"
      DISCORD_SERVER_ID=NeoShowcaseと同じ
      DISCORD_BOT_TOKEN=NeoShowcaseと同じ
      DISCORD_NORMAL_PARTICIPANT_ROLE_ID=NeoShowcaseと同じ
      DISCORD_EXHIBITOR_PARTICIPANT_ROLE_ID=NeoShowcaseと同じ
      
      .envに記載すると正常に全てが動作します。

構成

TL;DR: 大体main.gointernal/handler(ルーティング)→internal/repository(DBの操作)

  • https://github.com/ras0q/go-backend-template をベースに作成。
  • main.go: エントリーポイント
    • 依存ライブラリの初期化など最低限の処理のみを書く
    • ルーティングの設定は./internal/handler/handler.goに書く
    • 肥大化しそうなら./internal/infrastructure/{pkgname}を作って外部ライブラリの初期化処理を書くのもアリ
  • internal/: アプリ本体の主実装
    • Tips: Goの仕様でinternalパッケージは他プロジェクトから参照できない (https://go.dev/doc/go1.4#internalpackages)
    • api/: 外部APIのラッパー
      • 外部サービス(例:Discord API)へのリクエストを抽象化したメソッドを提供します。
    • `domain/``: ドメインモデル
      • アプリケーションのビジネスロジックをカプセル化したドメインオブジェクトを定義します。
      • 今回は、ほとんどoapi-codegenが生成したmodelを使っているので、出番は少しだけ。
    • handler/: ルーティング
      • 飛んできたリクエストを裁いてレスポンスを生成する
      • DBアクセスはrepository/で実装したメソッドを呼び出す
      • Tips: リクエストのバリデーションがしたい場合は↓のどちらかを使うと良い
    • migration/: DBマイグレーション
      • DBのスキーマを定義する
      • Tips: マイグレーションツールはpressly/gooseを使っている
        • 例: cd internal/migration && goose mysql "root:pass@tcp(172.26.0.2)/app?parseTime=true" status
      • 初期化スキーマは1_schema.sqlに記述し、運用開始後のスキーマ定義変更等は2_add_user_age.sqlのように連番を振って記述する
        • Tips: Goでは1.16からembedパッケージを使ってバイナリにファイルを文字列として埋め込むことができる
    • repository/: DBアクセス
      • DBへのアクセス処理
        • 引数のバリデーションはhandler/に任せる
    • pkg/: 汎用パッケージ
      • 複数パッケージから使いまわせるようにする
      • 例: pkg/config/: アプリ・DBの設定
      • Tips: 外部にパッケージを公開したい場合はinternal/の外に出しても良い
      • 定数やenumや使いまわす関数をここで定義している。
  • openapi/: oapi-codegenがopenapi.yamlから生成したモデルとサーバー
    • https://github.com/deepmap/oapi-codegen を用いて、OpenAPIの定義からGoのコードを生成している。以下のコードで生成できる。
    • cd docs
      oapi-codegen --config=models.cfg.yaml openapi.yaml
      oapi-codegen --config=server.cfg.yaml openapi.yaml
      
  • integration/: 結合テスト
    • 現状テストを書いていないので、使っていない。//TODO
    • internal/の実装から実際にデータが取得できるかテストする
    • DBの立ち上げにはory/dockertestを使っている
    • 短期開発段階では時間があれば書く程度で良い
    • Tips: 外部サービス(traQ, Twitterなど)へのアクセスが発生する場合はgolang/mockなどを使ってモック(テスト用処理)を作ると良い

長期開発に向けた改善点

  • 単体テスト・結合テストのカバレッジを上げる
    • カバレッジの可視化にはCodecov(traPだと主流)やCoverallsが便利
  • ログの出力を整備する
    • ロギングライブラリは好みに合ったものを使うと良い

TODO

  • テストを書く
  • DBの中に保存している画像を、オブジェクトストレージに移行する。