AtCoder-NoviSteps / AtCoderNoviSteps

【非公式】 AtCoder 上の問題について、取組み状況を記録していくサイトです。各問題が細かく難易度付けされており、必要な知識を段階的に習得できます。
https://atcoder-novisteps.vercel.app/
MIT License
32 stars 8 forks source link

DBにデータを保存できるようにしましょう #6

Open KATO-Hiro opened 1 year ago

KATO-Hiro commented 1 year ago

TODO

既存のテンプレート・プロジェクト

KATO-Hiro commented 1 year ago
KATO-Hiro commented 1 year ago

Supabase公式のサンプル https://github.com/supabase/supabase/tree/master/examples/user-management/sveltekit-user-management https://github.com/supabase/supabase/tree/master/examples/todo-list/sveltejs-todo-list

Supabaseの初期設定の例 https://note.com/shift_tech/n/n5191b5f19c9b

prettyhappycatty commented 9 months ago
スクリーンショット 2023-12-11 0 26 38

problems/{task_id}で保存するのは、TaskAnswerテーブルの認識で合っていますか? TaskAnswerテーブルに、atcoderのsubmission_idをつけるのはいかがでしょうか?提出のURL(https://atcoder.jp/contests/abc332/submissions/48364294 )の一番最後の数字です。 これを持っていれば、AtCoderの提出URLも作れるし(task_idと合わせ技)、 インポート機能も、ユーザIDをもとに、TaskAnswerテーブルにデータを入れればいいので、実装しやすいように思います。

KATO-Hiro commented 9 months ago

@prettyhappycatty

problems/{task_id}で保存するのは、TaskAnswerテーブルの認識で合っていますか? はい!その通りです。

TaskAnswerテーブルに、atcoderのsubmission_idをつけるのはいかがでしょうか?提出のURL (https://atcoder.jp/contests/abc332/submissions/48364294 )の一番最後の数字です。 これを持っていれば、AtCoderの提出URLも作れるし(task_idと合わせ技)、 インポート機能も、ユーザIDをもとに、TaskAnswerテーブルにデータを入れればいいので、実装しやすいように思います。

とてもよさそうですね!!!

SubmissionStatusが独立したテーブルになっているのは、解答状況の種類と配色をアプリ全て実装しようと考えていた頃の名残です。

先日ご提案いただいたようにユーザスクリプトで解答状況の種類と配色をカスタマイズする方針が実現できそうであれば、submission_statusおよびatcoderのsubmission_idともにTaskAnswerテーブルにあったほうがシンプルでよさそうと思っています。

念のため確認ですが、提出idはどれか一つの解答と紐づけるという理解でいいのでしょうか? 複数の解答を残したい場合は、TaskEditiorial?テーブルのように別テーブルにしたほうがいいのかもしれないとも考えています。

prettyhappycatty commented 9 months ago

@KATO-Hiro

念のため確認ですが、提出idはどれか一つの解答と紐づけるという理解でいいのでしょうか?

はい。そのイメージです。 つまり、TaskAnswerは、userId、taskIdに対して複数存在するのがいいのではと思います。 理由としては以下の通りです。 ・いろんな方針で解いたものを管理できる ・インポートした時に複数あったばあいにどれをインポートしていいかわからないが複数登録できれば判定不要で全部突っ込める。(インポート時の重複チェックにsubmission_idも使える) (もし、現状の仕様のように1つだけがいいなら、複数見つかった場合は最新だけAnswerに登録する・すでにAnswarが登録されていれば登録しない、という実現方法になるかなあ。)

複数登録を実現するには、/problemsの画面や、/problems/[task_id]の画面にも影響がありそうかなあと思います。 ・/problemsで表示されるデフォルトのステータス(TLA/WA・・・)を複数Answerのどれを表示するか?(最新の提出?) ・提出個数のサマリ(AC 1件・解説AC2件・WA1件・TLE3件、、、など)を表示するかどうか ・submissionIdを必須にするか?必須にできるか?(AtCoder本体に提出なしに管理したいことある?) ・/problems/[task_id]の画面で複数Answerの管理をする必要が出てきます。例えば左側20%くらいに一覧、選択すると右側に現在の表示で入力用のペインが出るようなイメージをしています。

先日ご提案いただいたようにユーザスクリプトで解答状況の種類と配色をカスタマイズする方針が実現できそう

この件ですが、userテーブルにicon_folder_urlを用意して、画像フォルダのURLを入れるのがユーザスクリプトより簡単そうに思います。(デフォルトは、https://raw.githubusercontent.com/AtCoder-NoviSteps/AtCoderNoviSteps/main/static/ns.png でいいような。) 個人的に作りたければ、pngのセットを作って、static/までのURLを入れられるようにするとページレンダリング時にできるので、ユーザスクリプトで更新タイミングを気にするより簡単かなあと思います。

prettyhappycatty commented 9 months ago

image

prettyhappycatty commented 9 months ago

(複数サブミッションつけられるとデータ容量やばいかしら、、、)

KATO-Hiro commented 9 months ago

(複数サブミッションつけられるとデータ容量やばいかしら、、、)

けんちょんさんと要相談だと思いますが、1問あたりの提出数の上限を設定 + 一定の条件を満たしたら削除するのはいかがでしょうか? (本質的な解決にはもう少し工夫が必要そうです)

KATO-Hiro commented 9 months ago

@KATO-Hiro

念のため確認ですが、提出idはどれか一つの解答と紐づけるという理解でいいのでしょうか?

はい。そのイメージです。 つまり、TaskAnswerは、userId、taskIdに対して複数存在するのがいいのではと思います。 理由としては以下の通りです。 ・いろんな方針で解いたものを管理できる ・インポートした時に複数あったばあいにどれをインポートしていいかわからないが複数登録できれば判定不要で全部突っ込める。(インポート時の重複チェックにsubmission_idも使える) (もし、現状の仕様のように1つだけがいいなら、複数見つかった場合は最新だけAnswerに登録する・すでにAnswarが登録されていれば登録しない、という実現方法になるかなあ。)

複数登録を実現するには、/problemsの画面や、/problems/[task_id]の画面にも影響がありそうかなあと思います。 ・/problemsで表示されるデフォルトのステータス(TLA/WA・・・)を複数Answerのどれを表示するか?(最新の提出?) ・提出個数のサマリ(AC 1件・解説AC2件・WA1件・TLE3件、、、など)を表示するかどうか ・submissionIdを必須にするか?必須にできるか?(AtCoder本体に提出なしに管理したいことある?) ・/problems/[task_id]の画面で複数Answerの管理をする必要が出てきます。例えば左側20%くらいに一覧、選択すると右側に現在の表示で入力用のペインが出るようなイメージをしています。

先日ご提案いただいたようにユーザスクリプトで解答状況の種類と配色をカスタマイズする方針が実現できそう

この件ですが、userテーブルにicon_folder_urlを用意して、画像フォルダのURLを入れるのがユーザスクリプトより簡単そうに思います。(デフォルトは、https://raw.githubusercontent.com/AtCoder-NoviSteps/AtCoderNoviSteps/main/static/ns.png でいいような。) 個人的に作りたければ、pngのセットを作って、static/までのURLを入れられるようにするとページレンダリング時にできるので、ユーザスクリプトで更新タイミングを気にするより簡単かなあと思います。

多面的な視点から仕様の不確定要素を考えていただき、ありがとうございます。

ユーザの便利さ ≒ 開発側の大変さみたいな部分はあると思いますので、スケジュール・予算などを踏まえて、ベターな方法にできるといいと思っています。

userテーブルにicon_folder_urlを用意して、画像フォルダのURLを入れるのがユーザスクリプトより簡単そうに思います

更新のタイミングが難しいのですね。承知いたしました。

プロフィール画像を表示できるようにする意味でも、専用のフォルダを用意したほうが良さそうですね。

prettyhappycatty commented 9 months ago

@KATO-Hiro とりえあず、一通りの機能をという意味では、1対1でいいのかな。 answerテーブル作成と、submissionIdを属性として追加(1対1)で作ってみますね! status?(AC, WA, など、、、)も、submission_statusを外だしにしない場合はanswerテーブルに追加ですよね。 メモも置けた方がいいですよね。(個人的な希望)

保存の前に、コメントアウトされているユーザ情報を取得するのも一緒に優先して実装した方が良さそうな気がします。 (保存にユーザidが必要、、、)

prettyhappycatty commented 9 months ago

321

TaskAnswerの作成と保存について、新しいissueを作りました。

KATO-Hiro commented 9 months ago

@prettyhappycatty

@KATO-Hiro とりえあず、一通りの機能をという意味では、1対1でいいのかな。 answerテーブル作成と、submissionIdを属性として追加(1対1)で作ってみますね! status?(AC, WA, など、、、)も、submission_statusを外だしにしない場合はanswerテーブルに追加ですよね。 メモも置けた方がいいですよね。(個人的な希望)

保存の前に、コメントアウトされているユーザ情報を取得するのも一緒に優先して実装した方が良さそうな気がします。 (保存にユーザidが必要、、、)

Issueの作成ありがとうございます!!!

prettyhappycatty commented 9 months ago

@KATO-Hiro SubmissionStatus相当のテーブルも必要と思います! テーブルの属性は以下で作ってみています。 AnswersからはStatusidで参照しようと思います。

id label_name AC,NoSub、、、など。 image_path 画像のファイル名、ac.pngなど

詳しくは分割した方に書きます!