Skip to content
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

【serverside_challenge_2 : sasaki】プランごとの電気料金を返すAPIの実装 #59

Open
wants to merge 25 commits into
base: master
Choose a base branch
from

Conversation

tkm0on
Copy link

@tkm0on tkm0on commented May 10, 2024

概要

契約アンペア数(A)と1ヶ月の使用量(kWh)をリクエストすることで、
プランごとの電気料金を返すAPIを実装する。

課題については以下のリンクを元に実装を行う。
https://github.com/tkm-ssk/coding-challenge/blob/master/serverside_challenge_2/README.md

前提条件

電気料金は以下の計算で算出する。
電気料金 = ①基本料金 + ②従量料金

仕様

エンドポイント: GET /api/electricity_rate_simulations

  • リクエスト

    クエリパラメータ 説明 必須 制約
    amperage 契約アンペア数 (A) 10, 15, 20, 30, 40, 50, 60 の整数
    usage_kwh 使用量 (kWh) 0以上の整数
    • サンプル
       curl "http://localhost:3000/api/electricity_rate_simulations?amperage=10&usage_kwh=100"
      
  • レスポンス

    [
      {
         'provider_name' => 'example_provider_name',
         'plan_name' => 'example_plan_name',
         'total_amount' => 3000,
         'error_message' => nil
      }
    ]
    
    • type: array
    • Errorレスポンスについて
      • パラメータ不足・空: 「400 Bad Request」を返却する
      • 不正なパラメータ: 「422 Unprocessable Entity」を返却する
    • error_messageキーについて
      • 指定可能な契約アンペア数を指定したが、プランに指定した契約アンペア数がないとき、エラーではないと判断しプロバイダー名とプラン名は返し、料金はnilを返す。またエラーメッセージの理由を返す。
      • サンプル
        {
          'provider_name' => 'example_provider_name',
          'plan_name' => 'example_plan_name',
          'total_amount' => nil,
          'error_message' => 'アンペア数に対応する基本料金が見つからないため料金を計算できません'
        }
        
        

初期データ

料金データをDBで管理できるように対応した。
以下seedコマンドよりデータの投入ができるようにした。

  • 投入
rails db:seed
  • リセット
rails db:migrate:reset

フロントエンド

  • Next.jsを利用してフロントエンド部分を実装した。
  • ディレクトリ構成を大きく変更したくなかったため、serverside_challenge_2配下にfrontendディレクトリを作成した
  • 環境にはdockerを使用しており、DBの作成とマイグレーション、初期データを入れておくことが前提条件となる
    docker compose up
    docker compose run --rm web rails db:create db:migrate
    docker compose run --rm web rails db:seed
    
  • URL
    • docker comopse up後に以下URLにアクセスすることで画面確認ができる
      http://localhost:3001/
      

その他

  • ActiveModelのnumericality: { only_integer: true}
  • Rspecを利用したテストコードを実装した
  • Rubocopを利用した
    • 全ファイルを対象とすると差分が多くなるため、今回の実装に関連する部分を主に対象とし、それ以外はTODOリストに残した
  • フロントエンドにはNext.jsを利用した

@tkm0on
Copy link
Author

tkm0on commented May 13, 2024

@masayuki0812 @RyuyaIshibashi @cassy1003 @kenji7157 @daicki @ysk91 @plute
質問失礼いたします。ご相談よろしいでしょうか。

1. リクエスト可能な契約アンペア数(A)がないプランの場合、どのようなレスポンスを返すのが良いか相談させてください

要件として契約アンペア数を10 / 15 / 20 / 30 / 40 / 50 / 60の中から指定できることとなっていますが、例えば「東京ガス / ずっとも電気1」のように10 / 15 / 20の契約アンペア数がないプランに対して契約アンペア数10を指定したときのレスポンスです。

エラーではないと判断し現状はプロバイダー名とプラン名は返し、料金はnilとしてみました。またエラーメッセージとして理由も返すようにしております。

{ 'provider_name' => '東京ガス', 'plan_name' => 'ずっとも電気1', 'price' => nil, 'error_message' => 'アンペア数に対応する基本料金が見つからないため料金を計算できません' }

レスポンスのイメージとして問題ないかの確認となります。

2. 電気料金の小数点以下の取り扱いについて

以下、参考リンクよりび合計金額の単位は1円とし端数は切り捨てております。
小数点以下の取り扱いとして問題ないでしょうか。

参考リンク

@kenji7157
Copy link
Member

kenji7157 commented May 14, 2024

@masayuki0812 @RyuyaIshibashi @cassy1003 @kenji7157 @daicki @ysk91 @plute 質問失礼いたします。ご相談よろしいでしょうか。

1. リクエスト可能な契約アンペア数(A)がないプランの場合、どのようなレスポンスを返すのが良いか相談させてください

要件として契約アンペア数を10 / 15 / 20 / 30 / 40 / 50 / 60の中から指定できることとなっていますが、例えば「東京ガス / ずっとも電気1」のように10 / 15 / 20の契約アンペア数がないプランに対して契約アンペア数10を指定したときのレスポンスです。

エラーではないと判断し現状はプロバイダー名とプラン名は返し、料金はnilとしてみました。またエラーメッセージとして理由も返すようにしております。

{ 'provider_name' => '東京ガス', 'plan_name' => 'ずっとも電気1', 'price' => nil, 'error_message' => 'アンペア数に対応する基本料金が見つからないため料金を計算できません' }

レスポンスのイメージとして問題ないかの確認となります。

2. 電気料金の小数点以下の取り扱いについて

以下、参考リンクよりび合計金額の単位は1円とし端数は切り捨てております。 小数点以下の取り扱いとして問題ないでしょうか。

参考リンク

@tkm-ssk
ご質問ありがとうございます!2点とも問題ありません。
引き続きよろしくお願いいたします。

@tkm0on
Copy link
Author

tkm0on commented May 14, 2024

@tkm-ssk ご質問ありがとうございます!2点とも問題ありません。 引き続きよろしくお願いいたします。

@kenji7157
ご確認ありがとうございます。承知いたしました。
引き続き作業を進めさせていただきます。

@tkm0on tkm0on marked this pull request as ready for review May 23, 2024 11:04
@tkm0on
Copy link
Author

tkm0on commented May 23, 2024

課題の提出とさせていただきます。レビューよろしくお願いいたします。

@kenji7157
Copy link
Member

お忙しい中、チャレンジに取り組んでいただきありがとうございます!確認させていただきます。

Copy link

@th5o th5o left a comment

Choose a reason for hiding this comment

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

@tkm-ssk
チャレンジへの対応ありがとうございます!
ロジックも見やすくテストされた良いコードだと思いました。
気になった点をコメントさせて頂きましたので、ご確認頂ければと思います。

Copy link
Member

@kenji7157 kenji7157 left a comment

Choose a reason for hiding this comment

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

チャレンジ提出ありがとうございます。

バックエンド・フロントエンド共に読みやすくレビューしやすかったです!

3点コメントさせていただきました。
可能な範囲でご確認いただければと思います。

serverside_challenge_2/frontend/src/app/page.tsx Outdated Show resolved Hide resolved
serverside_challenge_2/frontend/src/app/page.tsx Outdated Show resolved Hide resolved
@tkm0on tkm0on requested review from th5o and kenji7157 May 27, 2024 14:22
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.

3 participants