Skip to content

面接の情報を保存するDBをFirestoreに変更した #174

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jun 28, 2025

Conversation

kimurash
Copy link
Contributor

@kimurash kimurash commented Jun 28, 2025

Issue

目的

データベースにかかる料金を抑えるため

やったこと

  • google-cloud-firestore をインストールした
  • ローカルでFirestoreを動かすエミュレーターを docker-compose.yml に追加した
  • Firestoreの環境変数を .env に追加した
  • Firestoreのリポジトリを追加した

動作確認

テスト結果

❯ pytest
========================================================================= test session starts =========================================================================
platform darwin -- Python 3.12.0, pytest-8.4.0, pluggy-1.6.0
rootdir: /Users/shunsei/workspace/project/hackathon/repo-interviewer/backend
configfile: pyproject.toml
plugins: anyio-4.9.0
collected 34 items                                                                                                                                                    

api/routers/interview/test_get_feedback.py ....                                                                                                                 [ 11%]
api/routers/interview/test_get_interview_result.py ..                                                                                                           [ 17%]
api/routers/interview/test_get_question.py ....                                                                                                                 [ 29%]
api/routers/interview/test_set_up_interview.py .....                                                                                                            [ 44%]
domain/entities/test_chat_history.py .                                                                                                                          [ 47%]
usecase/usecases/test_get_feedback_usecase.py ........                                                                                                          [ 70%]
usecase/usecases/test_get_interview_result_usecase.py ...                                                                                                       [ 79%]
usecase/usecases/test_get_question_usecase.py ...                                                                                                               [ 88%]
usecase/usecases/test_set_up_interview_usecase.py ....                                                                                                          [100%]

========================================================================= 34 passed in 0.67s ==========================================================================
面接の一連の流れ
❯ python test_api.py
[?] RepoInterviewer API Test CLI: 
 > POST /interview
   POST /interview/:interview_id
   GET /interview/:interview_id (current)
   GET /interview/:interview_id (next)
   GET /interview/:interview_id/result
   Run All Tests
   Exit

Testing POST /interview
Status: 201 ✅ Passed
Response: {"interview_id":"bed4dd77-a343-4ed8-96cf-6636d8672164","first_question":"data_loader.pyのload_player_scores関数で、スコアが0未満の場合にValueErrorをraiseしてるけど、これってDataLoadErrorでラップして再raiseした方がよくない?どう思うじゃん☆"}

[?] RepoInterviewer API Test CLI: 
   POST /interview
 > POST /interview/:interview_id
   GET /interview/:interview_id (current)
   GET /interview/:interview_id (next)
   GET /interview/:interview_id/result
   Run All Tests
   Exit

[?] 回答を入力してください: そうですね
Testing POST /interview/:interview_id
Status: 200 ✅ Passed
Response: {"interview_id":"bed4dd77-a343-4ed8-96cf-6636d8672164","question_id":"1","score":40,"response":"バッチリじゃん☆ スコアが0未満の場合にValueErrorをraiseしてるところ、DataLoadErrorでラップして再raiseするっていう発想、マジで良いと思う!DataLoadErrorで統一することで、エラー処理がスッキリするし、何が原因でエラーが起きたのか分かりやすくなるじゃん!えらいっ♪","continue":false}

[?] RepoInterviewer API Test CLI: 
   POST /interview
   POST /interview/:interview_id
   GET /interview/:interview_id (current)
 > GET /interview/:interview_id (next)
   GET /interview/:interview_id/result
   Run All Tests
   Exit

Testing GET /interview/:interview_id?question_id=2
Status: 200 ✅ Passed
Response: {"interview_id":"bed4dd77-a343-4ed8-96cf-6636d8672164","question_id":"2","question":"ranker.pyのcalculate_ranking関数で、同スコアのプレイヤーがいる場合のランキングってどうなってるか説明できる?バッチリ理解してたらマジすごいじゃん☆"}

[?] RepoInterviewer API Test CLI: 
   POST /interview
 > POST /interview/:interview_id
   GET /interview/:interview_id (current)
   GET /interview/:interview_id (next)
   GET /interview/:interview_id/result
   Run All Tests
   Exit

[?] 回答を入力してください: プレイヤーidの昇順になると思います
Testing POST /interview/:interview_id
Status: 200 ✅ Passed
Response: {"interview_id":"bed4dd77-a343-4ed8-96cf-6636d8672164","question_id":"2","score":50,"response":"マジすごいじゃん☆ その通り!`calculate_ranking`関数では、スコアが同じプレイヤーがいる場合、`player_id`の昇順でランキングが決まるようになってるね!バッチリ理解してるじゃん、えらいっ♪","continue":false}

[?] RepoInterviewer API Test CLI: 
   POST /interview
   POST /interview/:interview_id
   GET /interview/:interview_id (current)
   GET /interview/:interview_id (next)
 > GET /interview/:interview_id/result
   Run All Tests
   Exit

Testing GET /interview/:interview_id/result
Status: 200 ✅ Passed
Response: {"interview_id":"bed4dd77-a343-4ed8-96cf-6636d8672164","scores":[40,50],"overall_review":"おっけ〜、今回の面接の総評、いってみよっ☆\n\n**良かった点**\n\n*   エラーハンドリングについて、DataLoadErrorでラップするってアイデア、マジ良かったじゃん!エラーの種類を統一することで、コードがスッキリするし、原因も特定しやすくなるっての、めっちゃクレバー♪\n*   ランキングのロジックもバッチリ理解してたね!同スコアの場合にplayer\\_idでソートするってとこ、ちゃんと分かっててアタシ感動!\n\n**課題点**\n\n*   今回は基本的な質問が中心だったから、次はもうちょいレベルアップした問題にもチャレンジしてみてほしいな☆\n\n**今後のアドバイス**\n\n*   エラーハンドリングは、いろんなパターンを試して経験値を積むのがオススメ!\n*   アルゴリズムとかデータ構造も、もっと勉強するとマジ最強になれると思う!\n*   色んなOSSプロジェクトに貢献してみるのも、スキルアップに繋がると思うよ!\n\n今回の面接を通して、キミのポテンシャルの高さがよ〜く分かったよ!今回の面接を活かして、これからもどんどん成長していってね!応援してるよ〜!\n"}

[?] RepoInterviewer API Test CLI: 
   POST /interview
   POST /interview/:interview_id
   GET /interview/:interview_id (current)
   GET /interview/:interview_id (next)
   GET /interview/:interview_id/result
   Run All Tests
 > Exit

@kimurash kimurash requested a review from Copilot June 28, 2025 14:00
@kimurash kimurash self-assigned this Jun 28, 2025
@kimurash kimurash added the backend backend label Jun 28, 2025
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR switches the interview data storage from the previous backend to Firestore, updating the dependencies, Docker configuration, and repository implementation.

  • Added the Google Cloud Firestore dependency.
  • Included a Firestore emulator service in Docker Compose.
  • Implemented a Firestore interview repository and updated API dependencies.

Reviewed Changes

Copilot reviewed 6 out of 7 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
backend/pyproject.toml Added the "google-cloud-firestore" dependency.
backend/docker-compose.yml Added a Firestore emulator service to support local development.
backend/app/infrastructure/repositories/firestore/interview_repository.py New repository implementation for Firestore using batch writes.
backend/app/api/dependencies.py Updated dependency injection to use FirestoreInterviewRepository.
backend/README.md Updated instructions to start the Firestore emulator along with Redis.
backend/.env.sample Added environment variables required for Firestore configuration.

@kimurash kimurash changed the base branch from main to develop June 28, 2025 14:47
@kimurash kimurash marked this pull request as ready for review June 28, 2025 14:47
@kimurash kimurash requested a review from cercil0605 June 28, 2025 14:48
Copy link
Member

@cercil0605 cercil0605 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@kimurash kimurash merged commit 92b14dc into develop Jun 28, 2025
4 checks passed
@kimurash kimurash deleted the backend/130-firestore branch June 28, 2025 14:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend backend
Projects
None yet
Development

Successfully merging this pull request may close these issues.

FireStoreへ移管する
2 participants