Backend Homework
このドキュメントについて事前課題の進め方確認する観点用語説明実装して欲しい仕様調整可能な候補日時リストをGetするAPI候補日を指定して確定(Post)するAPIデータストアに存在するデータをDumpする為のAPIデータストアに存在するデータを削除するためのAPI動作確認方法
このドキュメントについて
このドキュメントはSpir, Incの選考を希望していただけているエンジニアの皆様に実施をお願いしている、事前課題に関しての案内になります。
Spir, Incでは多くの事をDocumentを利用してコミュニケーションをとっているため、Documentに書かれた仕様を読み解きコードを実装することも日常的に取り組んでいます。
この事前課題ではそういったSpirの日常を擬似的に体験してもらうとともに、面接やレジュメでは見えてこない「コードを書く」という点にフォーカスを当ててディスカッションを行うことが目的となります。
面接だけではなく、事前課題の実施に関してはとてもハードルの高さを感じてしまうかもしれませんが、事前課題を元にSpirのエンジニアとディスカッションを行う事で、弊社は候補者様を、候補者様は弊社のメンバーを知る事に繋がりお互いにとって選考の充実度を高める事に繋がると考えています。
事前課題の進め方
- データストアの指定は無し。RDBMS, NoSQL, in-memoryなど
- 言語の指定は無し。1番力を発揮できる言語で挑戦してください
- 当ドキュメントの仕様を満たす実装を完成させてください。
- 弊社が用意したテストコードを利用して開発いただく為に、テスト用のPrivate Repositoryに招待します。そちらをforkした後開発を進めていただき、PRを出してください
- クラウドサービスなどは利用禁止とします
- ローカルで実行できる状態で提出してください
確認する観点
事前課題を確認する際にSpir側で確認したい観点
時間の兼ね合いもあるため、全てを必ず満たす必要は無いですが、意識できる範囲でOK
提出頂いたコードに関してのディスカッションや、コードに新しく機能を追加するとしたらなどコードはディスカッションを行う際に利用します
- 事前課題ということもありサイズはとても小さいものになるが、運用するサービスを開発するという視点で実装しているか
- Integrity, Obserberbilityなど
- 1人ではなく複数人で、そして未来に引き継ぐメンバーを意識した実装をしているか
- Maintainability, Readability, Testabilityなど
- 負荷の高い状態などをイメージした実装ができているか
- Scalabilityなど
用語説明
今回実装していただく仕様に関しての説明に進める前に、登場する用語に関して説明をさせていただきます。
- Slots - 候補(日時)
- Confirm - 確定する
- Confirm event from candidate.
- Account - アカウント
test1@example.com
などアドレス。値が何かは意識する必要はありません
実装して欲しい仕様
実装してもらうコードに関しての仕様
- 調整可能な候補日時リストをGetするAPI
- Get: /slots
- 候補日を指定して確定(Post)するAPI
- Post: /confirm
- データストアに存在するデータを削除するためのAPI(今回はDBを指定しないので、提供するテストコード側からデータを初期化するための目的)
- Post: /data/clean
調整可能な候補日時リストをGetするAPI
- Method
- Get
- Path
/slots
- Request
- Query Strings
accounts
test1@example.com,test2@example.com.....
startTime
2022/01/01 00:00
endTime
2022/01/01 00:00
- Response
- Body
JSON
- Description
- それぞれのQuery Stringsは今回は全て必須とします
- 10:00 ~ 20:00の間で調整可能な候補日時の開始日時を30分単位で返却する。詳しいResponse.bodyの構造は、後述
startTime
とendTime
は日付またぎ可能。`2022/01/01 10:00 ~ 2022/01/03 15:30` を指定した場合は、`2022/01/01 10:00 ~ 2022/01/01 20:00` の間の30分リストはもちろん、`2022/01/02 10:00 - 2022/01/02 20:00`と2022/01/03 10:00 ~ 2022/01/03 15:30
の間の30分もリストとして返却してくださいaccounts=test1@example.com,test2@example.com
の場合はAND
条件としてどちらのaccountでも調整可能な候補日時を返却する
候補日を指定して確定(Post)するAPI
- Method
- Post
- Path
/confirm
- Request
- Body
JSON
- Response
- Status
- 201: Created)
- データストアに予定の登録が成功した場合
- 409: Conflict
- 既に予定が入っていてデータ登録が失敗した場合
- Description
- 30min単位で予定を追加することができる
- 同じaccountの同じ時間には登録できない
account=test1@example.com, time=["2022/01/01 10:00", "2022/01/01 10:00"]
は登録できず409を返却する事test1@example.com,test2@examle.com
の時、`test1` は既に2022/01/01 10:00
が予定ありの場合は、`test1` にもtest2
にも登録はできず409
を返却する事
データストアに存在するデータをDumpする為のAPI
- Method
- Get
- Path
/data/dump
- Description
- 今回のテストではDBを指定していないため、テストコード側でコントロールする事ができずDBの状態を検証できない。そのため指定するインターフェースでデータを全て返却してもらう事が目的(テストの為のコード)
- DBに登録した全てのデータを出力
- Responseの中身は、Response.Bodyを参照
- レスポンス時に返却する日時は、DBに登録した予定の開始日時を返却してください。配列内の順番はここでは指定しません
- Response
- Body
JSON
データストアに存在するデータを削除するためのAPI
- Method
- Post
- Path
/data/clear
- Description
- データストア(in-Memoryの場合はMemory)の中身を空にする(テストの為のコード)
動作確認方法
実装して欲しい仕様 を満たしているか確認するためのテストコードや、継続的にテストを実行するためのGithub ActionsなどをPrivate Repositoryで提供しております。
こちらは事前課題に関して連絡するさいに合わせて共有させていただきます。