Backend Homework

このドキュメントについて

このドキュメントは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

  • 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の構造は、後述
    • startTimeendTime は日付またぎ可能。`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で提供しております。
こちらは事前課題に関して連絡するさいに合わせて共有させていただきます。