Giter VIP home page Giter VIP logo

ictsc-score-server's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ictsc-score-server's Issues

テストが少ない

Why

  • このアプリケーションの規模が小さい / そこまで複雑でないという認識をしていた
    • 実際にはそこそこエンドポイントがある
    • ドメインロジックが複雑なので、ひとつのエンドポイントに対しても考慮すべきことが多い
  • そもそもドキュメントが不足しており、 @kyontan 以外が全くコードの挙動を理解できていない
    • 困る (引き継げない)
    • エンドポイントに対するリクエスト / レスポンス をテストケースとして用意することで、ドキュメンテーションの役割も兼ねたい
      • ドメインや動かし方に関するドキュメントは #65

Tasks:

  • 必要な Factory を定義する
  • 必要な spec_helper 等を準備する
  • テストを書く
    • /api/answers
    • /api/attachments
    • /api/:commentables/:commentable_id/comments
    • /api/contests
    • /api/issues
    • /api/members
    • /api/notices
    • /api/notifications
    • /api/problems
    • /api/problem_groups
    • /api/scores
    • /api/scoreboard
    • /api/teams

UIのタスク

  • 新規作成
    • 問題
    • 問題グループ
    • メンバー
    • チーム
    • 問題補足
  • 編集
    • 問題
    • メンバー
    • 問題グループ
    • チーム
  • 削除
    • 問題
    • 問題グループ
    • 運営Issue
  • 機能
    • 質問ステータス表示
    • 質問種別絞込
    • スコアボードがNullな時の挙動確認
    • 得点版へのFirstBrad表示
    • 問題画面での、点数表示機能
    • 問題一覧画面での、問題ステータス
    • 解答不可時間
    • Adminで problems?with=answers-score を使わない(性能対策)
    • 時計
  • その他
    • 注意事項
    • 権限で表示ボタンを変える
    • ロゴ差し替え

[API] お知らせ機能の実装

大会全体に関するお知らせ等を保持するモデル, API の作成

Notice

持つ属性は以下の通り (DB)

id: integer
title: string
text: string
pinned: boolean
created_at: datetime
updated_at: datetime

エンティティの埋め込み制御パラメータを追加

GET 時のエンティティの埋め込みについて、現状ではパラメータ無しで一定のエンティティが埋め込まれているが、with パラメータを付けることで制御できるようにする

また、 with パラメータが無い場合は、ICTSC6 と同様に何も埋め込まないようにする

  • 複数ついているもの: カンマ区切り
  • ネストするパラメータは - で繋ぐ
  • 例:
    • GET /api/answers?with=comments,score
    • GET /api/session?with=member,member-team

ICTSC8 ルール対応

  • 問題は複数の問題グループに属することがある
  • 問題グループに付加される幾つかの属性, UIの変更
  • ファーストブラッドボーナスの廃止

解答に対するコメントを1つのみにする

現在、解答 (answers) には複数のコメント (comments) を付加することができ、それらをまとめて1つの解答として送信することができる。
しかし、有用性に掛けることやUI上分かりづらい, 実際に使われなかった等の事柄を勘案した上で、解答に対するコメントは1つのみとし、即座に採点待ち状態になるようにする。

Noticesを削除できない

D, [2017-02-21T15:27:19.138834 #18877] DEBUG -- :   Notice Load (0.6ms)  SELECT  "notices".* FROM "notices" WHERE "notices"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
D, [2017-02-21T15:27:19.141516 #18877] DEBUG -- :   Member Exists (0.3ms)  SELECT  1 AS one FROM "members" WHERE "members"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
D, [2017-02-21T15:27:19.142276 #18877] DEBUG -- :   Member Load (0.1ms)  SELECT  "members".* FROM "members" WHERE "members"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
D, [2017-02-21T15:27:19.143241 #18877] DEBUG -- :   Role Load (0.1ms)  SELECT "roles".* FROM "roles" WHERE "roles"."id" = 2
2017-02-21 15:27:19 - NameError - undefined local variable or method `user' for #<Notice:0x007fe59c5401f8>:
        /home/kamijin/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activemodel-5.0.1/lib/active_model/attribute_methods.rb:433:in `method_missing'
        /mnt/c/Users/kamijin/Documents/git/ictsc-score-server/db/model.rb:629:in `allowed?'
        /mnt/c/Users/kamijin/Documents/git/ictsc-score-server/controllers/notice.rb:21:in `block in <class:NoticeRoutes>'
        /home/kamijin/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `call'

問題グループの編集ができない

現状では管理ユーザは新規グループを追加できるが、登録済みのグループが編集できない。
グループの説明やボーナスの点数変更などができないのは問題では?

[API] 採点依頼機能の実装

MarkingRequest モデルを追加, 1 Answer : 0 or 1 MarkingRequest

POST /api/answers/:id/marking_request で採点依頼を出すようにする

質問一覧のソート

問題詳細ページにおいて、UX向上のために質問を状態ごとにソートしたい

  • 質問の状態順 (上から、未解決の問題, 対応中の問題, 解決済みの問題)
    • 状態の中では新しい順に

PUT Method doesn't work to almost all endpoints

PUT Request for endpoints needs parameter *_id doesn't work properly.

For example:

  • /api/answers has fields: member_id and team_id
    • these are relations to Member and Team in Answer class
  • /api/answers requires fields member and team but these parameters are filtered
    • only fields member_id and team_id are passed through attribute_values_of_class
[1] pry(#<AnswerRoutes>)> params
=> {"problem_id"=>"10", "team_id"=>"1", "splat"=>[], "captures"=>["5005"], "id"=>"5005"}
[2] pry(#<AnswerRoutes>)> attribute_names_of_class(Answer)
=> [:problem_id, :team_id]
[3] pry(#<AnswerRoutes>)> attribute_values_of_class(Answer)
=> {:problem_id=>"10", :team_id=>"1"}
[4] pry(#<AnswerRoutes>)> Answer.required_fields
=> [:problem, :team]
[5] pry(#<AnswerRoutes>)> satisfied_required_fields?(Answer)
=> false

N+1 対応

フロントエンドの実装上、API そのものを N+1 のように叩くことが避けられていなかったので対処する

対処法: /problems/issues などのエンドポイントに関連するエンティティを埋め込む

引き継ぎ

  • 最低限、 @kyontan 不在でも運用ができるようにする
  • コードを書く人間の引き継ぎ
    • UI
    • API

できるといいですね……

管理者が解答の送信を試行できる

得点と解答ページ経由で問題ページへ移動した際に、解答欄が表示される。
実際に送信することはできないが、送信を試行することができるため非表示にする。

通知機能

現状では /api/notification をたたくことで幾つかの通知は得られるが、これではポーリングによるフロントエンド実装しかできない。
結果として、ユーザ数x(1/更新頻度)/sec のリクエストが飛ぶことになるため、望ましくない。

理想としては、SSEやWebSocket を使用して通知を行うようにするべき

コンフィグを環境変数で渡すようにする

現状では、 config/contest.yml に設定を書いている。
そのため、コンテナで動かす場合やテストの際にファイルを上書きする必要がある。

これを環境変数で渡すようにすることで、容易にパラメータの変更が行えるようにする。

ログイン時に一部パラメータがセットされない

ログイン画面でUI側のパラメータが正常に設定されないために、ログイン後に不必要な項目が表示されている場合がある(一般ユーザでログインした場合に、解答一覧のリンクが表示される等)。

ファーストブラッド対応

  • score にファーストブラッドの属性を付加する
  • /api/scoreboard にファーストブラッドを反映した点数を返す

スコアボード: 順位飛びに対応

GET /api/scoreboard

自チームの1つ上の順位のチームが複数あるとき、自チーム順位とそれらのチームの順位は2以上開くため、それに対応する。

問題グループごとに完答ボーナスを実装する

  • 完答ボーナスは固定値でよいため、 contest.yml にて定義するようにする
  • ProblemGroup に属した問題へすべて基準点を越す解答をした場合に対象のボーナスを与える
  • ボーナス点は、その問題グループ内の問題全ての基準点を越すことになる最初の問題に与えられる
  • 他チームには影響を及ぼさない

ICTSC7 のルール変更に対応

  • 会社の概念
    • API
    • フロントエンド
  • 採点結果の公開遅延
    • API
    • フロントエンド
  • スコアボード
    • API
    • フロントエンド

未ログイン時の /api/notifications が500

D, [2017-02-22T15:49:15.387459 #21746] DEBUG -- :   Comment Load (0.3ms)  SELECT "comments".* FROM "comments" WHERE "comments"."commentable_type" = ? ORDER BY "comments"."updated_at" ASC  [["commentable_type", "Problem"]]
2017-02-22 15:49:15 - NoMethodError - undefined method `team_id' for nil:NilClass:
        /mnt/c/Users/kamijin/Documents/git/ictsc-score-server/controllers/notification.rb:66:in `block in <class:NotificationRoutes>'

設定のAPI化

各種設定(仕様)をAPIで変更できるようにする

  • スコアボード #133
  • 問題の公開設定 #136
  • UI #134 cliからやればよさそう
  • 設定をDBに保存する #135

[API] 添付ファイル機能の実装

問題 / 質問等のコメント等に対して画像等のファイルを添付できるようにする

/comments/:id/attachments
/problems/:id/attachments```

競技時間終了後の対応

競技時間終了後には、採点依頼のあるなしにかかわらず、一切のスコアを表示できなくする

満点以上の点数を解答へ与えることができる

現状では、それぞれの問題で満点が決まっているにもかかわらず、満点以上の点数をつけることができる。
そのため、採点者側のミスで満点以上の点を与えてしまう可能性がある。

なので、uiとapiの両方(またはどちらか)で満点以上の点数をつけられないよう、チェックを追加する必要がある。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.