choco0809 / stup

MIT License
1 stars 0 forks source link

リソース設計をする #16

Closed choco0809 closed 1 year ago

choco0809 commented 2 years ago
1回目 | method | path | description | | ------ | ----- | --------------------------------- | | GET | / | ログイン前、ログイン後のTOPページ | | POST | /auth/:provider/callback | OAuthを用いてログインする | | DELETE | /log_out | ログアウトする | | GET | /api/study_time_records/:id | 対象ユーザーの全学習記録を取得する | | POST | /api/study_time_records/:id | 学習記録を登録する | | PATH | /api/study_time_records/:id | 対象の学習記録を更新する | | DELETE | /api/study_time_records/:id | 対象の学習記録を削除する |
2回目 | method | path | description | | ------ | ----- | --------------------------------- | | GET | / | ログイン前、ログイン後のTOPページ | | POST | /auth/:provider/callback | Oauthログイン処理、ユーザー作成処理 | | DELETE | /log_out | ログアウト処理 | | GET | /api/study-time-records/:year | 年間の学習記録を取得する処理 | | GET | /api/study-time-records/:year/:month | 月間の学習記録を取得する処理 | | POST | /api/study-time-records | 学習記録を登録する処理 | | PATCH | /api/study-time-records/:id | 学習記録を更新する処理 | | DELETE | /api/study-time-records/:id | 学習記録を削除する処理 |
3回目 | method | path | description | | ------ | ----- | --------------------------------- | | GET | / | ログイン前、ログイン後のTOPページ | | POST | /auth/:provider/callback | Oauthログイン処理、ユーザー作成処理 | | DELETE | /log_out | ログアウト処理 | | GET | /api/study_time_records?year=yyyy | 年間の学習記録を取得する処理 | | GET | /api/study_time_records?year=yyyy&month=mm | 月間の学習記録を取得する処理 | | POST | /api/study_time_records | 学習記録を登録する処理 | | PATCH | /api/study_time_records/:id | 学習記録を更新する処理 | | DELETE | /api/study_time_records/:id | 学習記録を削除する処理 |

リソース設計

method path description
GET / ログイン前、ログイン後のTOPページ
POST /auth/:provider/callback Oauthログイン処理、ユーザー作成処理
DELETE /log_out ログアウト処理
GET /api/study_time_records?year=yyyy 年間の学習記録を取得する処理
GET /api/study_time_records?year=yyyy&month=mm 月間の学習記録を取得する処理
POST /api/study_time_records Web画面から学習記録を登録する処理
PATCH /api/study_time_records/:id Web画面から学習記録を更新する処理
DELETE /api/study_time_records/:id Web画面から学習記録を削除する処理
POST /api/discord/study_time_record DiscordBotから学習記録を登録(開始)する処理
PATCH /api/discord/study_time_record DiscordBotから学習記録を登録(終了)する処理

補足

  1. ログイン前、ログイン後のTOPページのURIが同じになっていますがbootcampと同様にview側でcurrent_userである場合はログイン後のTOPページを、current_userでない場合はログイン前のTOPページをrenderしようと考えています。 プロトタイプでの該当コード

  2. /api/study-time-records/:ididにはstudy_time_recordsのidが入る想定です。

  3. /api/discord_study_time_recordsはresourceで定義するため、:idは不要と考えています。  DiscordBotから終了時間(ended_at)を更新する場合、常にlastメソッドで取得したレコードを更新するためです。

cafedomancer commented 1 year ago
choco0809 commented 1 year ago

@cafedomancer

[質問] Web ページは React や Vue のようなライブラリを用いて作成するんでしょうか?

今回はVue + Railsの環境でWebページを作成しようと考えています。

  1. アカウント登録ページの URL が見当たらないようです

ペーパープロトタイプではDiscordでのログイン以外にメールアドレスにてユーザー登録できるよう考えていましたが、メイン機能がDiscord Botを使用して学習時間を記録するため、DiscordによるOAuth認証のみでユーザー登録をしようと考えています。 ※ ペーパープロトタイプの方も修正しておきます🙏

ログインページの URL が見当たらないようです

Discordでのログインのみ想定しているため、ログインページは作成しない想定です。 ※ ペーパープロトタイプを修正しておきます🙏

[質問] OAuth を用いないログインの場合はどこにリクエストが送信されますか?

Discordでのログインのみ想定しています。

ログアウトは GET ではなく POST や DELETE のような HTTP メソッドを使いましょう

ログアウトはDELETEメソッドに修正しました。

[質問] calendars というリソースに対応するテーブルは ER 図を見るところではないようですが /api/calendars/:id の :id には何の値が入りますか?

/api/calendar/1.jsonのように、ログイン中のユーザーのidに一致する学習記録がjsonで取得できます。 よくよく考えたら、calendarと全く関係がないため、ここは/api/study_time_records/1.jsonに変更しました。

[質問] 今月の学習時間を選択したときはどこにリクエストが飛びますか? [質問] 今年の学習時間を選択したときはどこにリクエストが飛びますか?  [質問] 対象のセルをダブルクリックしたときはどこにリクエストが飛びますか?

ここはカレンダーに表示されている学習時間を選択したときという認識であっていますでしょうか? /api/study_time_records/1.jsonにリクエストした際の全学習記録をvuexで管理し、それぞれの日付、今月、今年が選択した際にvuex内のデータを加工しようと考えているため、別途リクエストを飛ばす予定はありません。

Web ページから学習記録を追加する場合のリクエストの送信先が見当たらないようです

失礼しました🙇🙇🙇 追加しましたのでご確認お願いします。

学習記録の更新は 更新 なので PUT または PATCH を使うべきです

PATHに修正しました。

/api/study_time_record/:id のリソース名が複数形になっていないようです

複数形に修正しました。

cafedomancer commented 1 year ago

/api/calendar/1.jsonのように、ログイン中のユーザーのidに一致する学習記録がjsonで取得できます。 よくよく考えたら、calendarと全く関係がないため、ここは/api/study_time_records/1.jsonに変更しました。

/api/study_time_records/1.json1 とは何の数字ですか? study_time_recordsid なのであれば RESTful な URL として正しいのですが、そうでないなら正しくないので RESTful な URL になるように修正が必要です。

ここはカレンダーに表示されている学習時間を選択したときという認識であっていますでしょうか? /api/study_time_records/1.jsonにリクエストした際の全学習記録をvuexで管理し、それぞれの日付、今月、今年が選択した際にvuex内のデータを加工しようと考えているため、別途リクエストを飛ばす予定はありません。

はいそうです。学習記録のデータがたくさんある場合にその実装でパフォーマンス上の問題が発生する可能性はありませんか? 1 ユーザーあたり最大どのくらいの学習記録が作成されるのかを考えてみてください。

失礼しました🙇🙇🙇 追加しましたのでご確認お願いします。

RESTful な URL として正しくないです (id が何であるかという問題もありますが) 。これまで作成した Rails アプリなどを参考に URL を見直してみてください。


追加の質問です。学習記録はどこから削除できますか?

choco0809 commented 1 year ago

@cafedomancer

/api/study_time_records/1.json の 1 とは何の数字ですか? study_time_records の id なのであれば RESTful な URL として正しいのですが、そうでないなら正しくないので RESTful な URL になるように修正が必要です。

user_idになります。見直してみると、/api/study_time_records/1.jsonは相応しくないなと思いました。 また、アンダーバーをURLに使うのも相応しくなかったため、修正しました。

はいそうです。学習記録のデータがたくさんある場合にその実装でパフォーマンス上の問題が発生する可能性はありませんか? 1 ユーザーあたり最大どのくらいの学習記録が作成されるのかを考えてみてください。

パフォーマンスまで考慮できていませんでした🙏 年間、月間とでURLを分けました。

追加の質問です。学習記録はどこから削除できますか?

今のところ、学習記録はWEBページからのみ削除することを想定しています。 カレンダーの日付をクリックすると、その日の学習時間を一覧として表示し、その中に削除ボタンがあるイメージです。 削除ボタンが押されたときに、/api/study_time_records/:idを叩いてあげたらよいかな~と思っています。

cafedomancer commented 1 year ago

user_idになります。見直してみると、/api/study_time_records/1.jsonは相応しくないなと思いました。 また、アンダーバーをURLに使うのも相応しくなかったため、修正しました。

アンダーバーを使うのが相応しくないというのは何を根拠にそう判断していますか? 一般的な Rails アプリケーションのパスはアンダーバー区切り (snake_case) だと思うのですが...。

パフォーマンスまで考慮できていませんでした🙏 年間、月間とでURLを分けました。

segment に含めるのでもよいですが /api/study_time_records?year=2022 のようにquery string にしておいたほうが作りやすくなるかなと思います。これだと study_time_records というリソースの index アクションに紐付けられ、そのうちの year2022 であるもののような作りにできるので。

今のところ、学習記録はWEBページからのみ削除することを想定しています。 カレンダーの日付をクリックすると、その日の学習時間を一覧として表示し、その中に削除ボタンがあるイメージです。 削除ボタンが押されたときに、/api/study_time_records/:idを叩いてあげたらよいかな~と思っています。

よいと思います 👌


PATH | /api/study-time-records/:id | 学習記録を更新する処理

PATH ではなく PATCH です。

choco0809 commented 1 year ago

@cafedomancer

アンダーバーを使うのが相応しくないというのは何を根拠にそう判断していますか? 一般的な Rails アプリケーションのパスはアンダーバー区切り (snake_case) だと思うのですが...。

過去のプラクティスに遡り、下記のページを見ていた時に下線は表示が難しいとの記述があり、なるほどたしかになと思いハイフンに変更しました。((4)アンダースコア(_)は、URIに使用しない)) https://meetup-jp.toast.com/931

segment に含めるのでもよいですが /api/study_time_records?year=2022 のようにquery string にしておいたほうが作りやすくなるかなと思います。これだと study_time_records というリソースの index アクションに紐付けられ、そのうちの year が 2022 であるもののような作りにできるので。

試してみたところ、たしかにquery stringの方が汎用性が高く便利でした💪

PATH ではなく PATCH です。

修正しました。(PATHを無意識で入力していました...)

cafedomancer commented 1 year ago

過去のプラクティスに遡り、下記のページを見ていた時に下線は表示が難しいとの記述があり、なるほどたしかになと思いハイフンに変更しました。((4)アンダースコア(_)は、URIに使用しない)) https://meetup-jp.toast.com/931

(プラクティスに載っているという事実に対して、個人的な意見になってしまうかもしれませんが) 記事の内容の参考が Wikipedia しか示されていないため、この記事が信頼に足る内容であるとの判断ができませんでした。事実として、世の中のアプリケーションの REST API では kebab-case, snake_case, camelCase が混在しています。kebab-case を用いてもよいですが、先にも書いたとおり Rails アプリケーションの一般的なルーティングではないため、ルーティングの設定が若干面倒になります。この情報を踏まえてどの case を使用するか改めて考えてみてください。ただし snake_case を強要しているわけではないので自身の判断に基づいて kebab-case を選択してもらっても OK です 🙆

choco0809 commented 1 year ago

@cafedomancer

(プラクティスに載っているという事実に対して、個人的な意見になってしまうかもしれませんが) 記事の内容の参考が Wikipedia しか示されていないため、この記事が信頼に足る内容であるとの判断ができませんでした。事実として、世の中のアプリケーションの REST API では kebab-case, snake_case, camelCase が混在しています。kebab-case を用いてもよいですが、先にも書いたとおり Rails アプリケーションの一般的なルーティングではないため、ルーティングの設定が若干面倒になります。この情報を踏まえてどの case を使用するか改めて考えてみてください。ただし snake_case を強要しているわけではないので自身の判断に基づいて kebab-case を選択してもらっても OK です 🙆

たしかに参考がwikipediaでした。 参考元までしっかりと確認できていませんでした🙏(自分の確認不足でした) 今回、Railsを使用するのでレールに則った方が良いと思い修正しました。

cafedomancer commented 1 year ago

確認しました! OK です 👌 (PATCH が PATH のままのようだったので直しておいてください)

choco0809 commented 1 year ago

@cafedomancer

2回目に提出したほうを修正していました😓

choco0809 commented 1 year ago

@cafedomancer DiscordとWeb(Vue.js)でレスポンスが異なるため、リソースを追加いたしましたので、ご確認おねがいします🙏

cafedomancer commented 1 year ago
choco0809 commented 1 year ago

@cafedomancer namespaceを区切るように修正しましたのでご確認お願いします🙇‍♂️

cafedomancer commented 1 year ago

OK そうです 👌