- 直近の案件で実装したコードの一部を抜粋するような形でサンプルリポジトリを作りました
- 誰かがRustでWebAPIを開発する時の何かの参考になれば良いなと思って作りました
- こう直したらどう?とか、これってどういうこと?みたいな質問があれば気軽にご連絡ください!
- .exampleをコピーして、
.envと.env.testを作成してください - docker-compose.ymlを参考に、.env.testのDATABASE_URLは変更してください
以下のコマンドでDockerコンテナが起動します
docker-compose up -d同時にAPIサーバーも起動するようになっているので、test.httpを使ってリクエストを送ることもできます
./scripts db:dev:migration run./scripts db:dev:seed./scripts test:all./scripts db:test:migration run
./scripts db:test:seed
./scripts test:integration以下の考え方を参考にしています
一部うまく実装できていない部分があったりしますが、本番用のプロジェクトから一部だけ引っぱり出したりした都合上、そこはお許し...
- モジュラモノリス
- DDD
- オニオンアーキテクチャ
- 各モジュールは外部にpresentationレイヤーのみを公開します
- presentationレイヤーでは、ドメイン知識などが現れないシグネチャを定義し、モジュ ール内の情報漏洩を防ぎます
- 各モジュールのmod.rsファイルで、presentationレイヤーのみを公開するように設定が可能です
- dieselで使用するマイグレーションファイルが入っています
- アプリケーションのソースコードが入っています
- アプリケーションのエントリーポイントが入っています
- シードデータを投入する際に実行します
- APIサーバーを起動する際に実行します
- 各モジュールを定義していきます
- 全てのモジュールで共有して使うような処理を定義します
- dieselに関連する処理を定義します
- taskモジュールのソースコードが入っています
- ドメイン層の処理を定義します
- インフラ層の処理を定義します
- プレゼンテーション層の処理を定義します
- ユースケース層の処理を定義します
- taskと同じなので省略します
- HTTPエンドポイントと紐づけるシナリオを定義します
- マイクロサービスの文脈で登場するSagaパターンのオーケストレーターのような使い方を想定しています
- 今回のサンプルリポジトリでは、実装できていませんが、DBのトランザクション管理をしても問題ありません
- 現在の実装だと、presentation層の関数に、
&mutではないconnを渡す必要がありますが、dieselでトランザクションを管理しようとすると、必ず&mutなconnを渡す必要が生まれてしまいます - ここの制御が現時点ではうまくできていません
- 現在の実装だと、presentation層の関数に、
- モジュール宣言を行っています
- ルーティングを定義しています
- dieselが自動生成するスキーマファイルです
- 自分で修正することはありません
- 統合テストを書きます
- 統合テストと単体テストを分けて動かすために、
Cargo.tomlに 統合テスト用のfeaturesを定義しています - 統合テストのモジュールには必ず
#[cfg(feature = "integration")]をつける必要があります - これを書かないと、単体テストのときに統合テストも動いてしまいます