Skip to content

Commit d45bd09

Browse files
committed
Improve user_game_report
1 parent 6f0737f commit d45bd09

File tree

6 files changed

+74
-38
lines changed

6 files changed

+74
-38
lines changed

services/app/apps/codebattle/lib/codebattle/user_game_report.ex

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,50 +7,55 @@ defmodule Codebattle.UserGameReport do
77

88
alias Codebattle.Game
99
alias Codebattle.Repo
10+
alias Codebattle.Tournament
1011
alias Codebattle.User
1112

1213
@derive {Jason.Encoder,
1314
only: [
15+
:comment,
16+
:game_id,
1417
:id,
15-
:reported_user_id,
16-
:reporter_id,
18+
:offender,
1719
:reason,
18-
:comment,
19-
:state
20+
:reporter,
21+
:state,
22+
:tournament_id
2023
]}
2124

2225
@type t :: %__MODULE__{}
2326

2427
@states ~w(pending processed)a
25-
@reasons ~w(bot_cheated bot_wrong_solution user_copypasted)a
28+
@reasons ~w(cheater wrong_solution copypaste)a
2629

2730
schema "user_game_reports" do
2831
field(:reason, Ecto.Enum, values: @reasons)
2932
field(:state, Ecto.Enum, values: @states, default: :pending)
3033
field(:comment, :string)
3134

3235
belongs_to(:game, Game)
36+
belongs_to(:tournament, Tournament)
3337
belongs_to(:reporter, User)
34-
belongs_to(:reported_user, User, foreign_key: :reported_user_id)
38+
belongs_to(:offender, User, foreign_key: :offender_id)
3539

3640
timestamps()
3741
end
3842

3943
def changeset(struct = %__MODULE__{}, params \\ %{}) do
4044
struct
4145
|> cast(params, [
46+
:comment,
4247
:game_id,
43-
:reporter_id,
44-
:reported_user_id,
48+
:offender_id,
4549
:reason,
46-
:comment
50+
:reporter_id,
51+
:tournament_id
4752
])
4853
|> validate_required([
54+
:comment,
4955
:game_id,
50-
:reporter_id,
51-
:reported_user_id,
56+
:offender_id,
5257
:reason,
53-
:comment
58+
:reporter_id
5459
])
5560
end
5661

@@ -63,6 +68,14 @@ defmodule Codebattle.UserGameReport do
6368
__MODULE__
6469
|> where([ugr], ugr.game_id == ^game_id)
6570
|> Repo.all()
71+
|> Repo.preload([:offender, :reporter])
72+
end
73+
74+
def list_by_tournament(tournament_id) do
75+
__MODULE__
76+
|> where([ugr], ugr.tournament_id == ^tournament_id)
77+
|> Repo.all()
78+
|> Repo.preload([:offender, :reporter])
6679
end
6780

6881
def create(params) do

services/app/apps/codebattle/lib/codebattle_web/channels/tournament_admin_channel.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ defmodule CodebattleWeb.TournamentAdminChannel do
77
alias Codebattle.Tournament
88
alias Codebattle.Tournament.Helpers
99
alias Codebattle.Tournament.TournamentResult
10+
alias Codebattle.UserGameReport
1011

1112
def join("tournament_admin:" <> tournament_id, _payload, socket) do
1213
current_user = socket.assigns.current_user
@@ -35,6 +36,13 @@ defmodule CodebattleWeb.TournamentAdminChannel do
3536
{:noreply, socket}
3637
end
3738

39+
def handle_in("tournament:ban:list_reports", _params, socket) do
40+
tournament_id = socket.assigns.tournament_info.id
41+
reports = UserGameReport.list_by_tournament(tournament_id)
42+
43+
{:reply, {:ok, %{reports: reports}}, socket}
44+
end
45+
3846
def handle_in("tournament:ban:player", %{"user_id" => user_id}, socket) do
3947
tournament_id = socket.assigns.tournament_info.id
4048

services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/user_game_report_controller.ex

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ defmodule CodebattleWeb.Api.V1.UserGameReportController do
55
alias Codebattle.UserGameReport
66

77
def create(conn, %{
8-
"id" => game_id,
9-
"user_id" => reported_user_id,
8+
"game_id" => game_id,
9+
"offender_id" => offender_id,
1010
"reason" => reason,
1111
"comment" => comment
1212
}) do
1313
reporter = conn.assigns.current_user
1414
game = Game.Context.get_game!(game_id)
1515

1616
is_reporter_player = Game.Helpers.player?(game, reporter.id)
17-
is_reported_user_player = Game.Helpers.player?(game, reported_user_id)
18-
is_reported_himself = reporter.id == reported_user_id
17+
is_offender_player = Game.Helpers.player?(game, offender_id)
18+
is_reported_himself = reporter.id == offender_id
1919

20-
case {is_reporter_player, is_reported_himself, is_reported_user_player} do
20+
case {is_reporter_player, is_reported_himself, is_offender_player} do
2121
{false, _, _} ->
2222
conn |> put_status(:forbidden) |> json(%{errors: ["not_a_player_of_game"]})
2323

@@ -27,13 +27,14 @@ defmodule CodebattleWeb.Api.V1.UserGameReportController do
2727
{_, _, false} ->
2828
conn
2929
|> put_status(:unprocessable_entity)
30-
|> json(%{errors: [:reported_user_not_a_player_of_game]})
30+
|> json(%{errors: [:offender_not_a_player_of_game]})
3131

3232
{_, _, true} ->
3333
case UserGameReport.create(%{
3434
game_id: game.id,
3535
reporter_id: reporter.id,
36-
reported_user_id: reported_user_id,
36+
tournament_id: game.tournament_id,
37+
offender_id: offender_id,
3738
reason: reason,
3839
comment: comment
3940
}) do

services/app/apps/codebattle/lib/codebattle_web/router.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ defmodule CodebattleWeb.Router do
134134
get("/:user_id/activity", ActivityController, :show)
135135

136136
scope("/games") do
137-
resources("/:id/user_game_reports", UserGameReportController, only: [:create])
137+
resources("/:game_id/user_game_reports", UserGameReportController, only: [:create])
138138
end
139139
end
140140
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmodule Codebattle.Repo.Migrations.AddBotReports do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:user_game_reports) do
6+
add :tournament_id, :integer
7+
add :offender_id, :integer
8+
remove :reported_user_id
9+
end
10+
11+
create index(:user_game_reports, [:tournament_id])
12+
create index(:user_game_reports, [:game_id])
13+
end
14+
end

services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/user_game_report_controller_test.exs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ defmodule CodebattleWeb.Api.V1.UserGameReportControllerTest do
1818
{:ok, game} = Game.Context.create_game(game_params)
1919

2020
params = %{
21-
"user_id" => bot.id,
22-
"reason" => "bot_cheated",
21+
"offender_id" => bot.id,
22+
"reason" => "cheater",
2323
"comment" => "Bot is cheating"
2424
}
2525

@@ -33,22 +33,22 @@ defmodule CodebattleWeb.Api.V1.UserGameReportControllerTest do
3333
"user_game_report" => %{
3434
"id" => user_game_report_id,
3535
"reporter_id" => reporter_id,
36-
"reported_user_id" => reported_user_id,
36+
"offender_id" => offender_id,
3737
"state" => "pending",
38-
"reason" => "bot_cheated",
38+
"reason" => "cheater",
3939
"comment" => "Bot is cheating"
4040
}
4141
} = response
4242

4343
assert reporter_id == user.id
44-
assert reported_user_id == bot.id
44+
assert offender_id == bot.id
4545

4646
user_game_report =
47-
UserGameReport.get!(user_game_report_id) |> Repo.preload([:reporter, :reported_user])
47+
UserGameReport.get!(user_game_report_id) |> Repo.preload([:reporter, :offender])
4848

4949
assert user_game_report.state == :pending
5050
assert user_game_report.reporter.id == user.id
51-
assert user_game_report.reported_user.id == bot.id
51+
assert user_game_report.offender.id == bot.id
5252
end
5353

5454
test "player cannot report himself", %{conn: conn} do
@@ -62,9 +62,9 @@ defmodule CodebattleWeb.Api.V1.UserGameReportControllerTest do
6262
{:ok, game} = Game.Context.create_game(game_params)
6363

6464
params = %{
65-
"user_id" => user.id,
66-
"reason" => "cheating",
67-
"comment" => "Bot is cheating"
65+
"offender_id" => user.id,
66+
"reason" => "copypaste",
67+
"comment" => "User are cheating"
6868
}
6969

7070
response =
@@ -88,8 +88,8 @@ defmodule CodebattleWeb.Api.V1.UserGameReportControllerTest do
8888
{:ok, game} = Game.Context.create_game(game_params)
8989

9090
params = %{
91-
"user_id" => other_user.id,
92-
"reason" => "cheating",
91+
"offender_id" => other_user.id,
92+
"reason" => "cheater",
9393
"comment" => "Bot is cheating"
9494
}
9595

@@ -99,7 +99,7 @@ defmodule CodebattleWeb.Api.V1.UserGameReportControllerTest do
9999
|> post(Routes.api_v1_user_game_report_path(conn, :create, game.id), params)
100100
|> json_response(422)
101101

102-
assert %{"errors" => ["reported_user_not_a_player_of_game"]} = response
102+
assert %{"errors" => ["offender_not_a_player_of_game"]} = response
103103
end
104104

105105
test "player which is not game player cannot report player of the game", %{conn: conn} do
@@ -114,8 +114,8 @@ defmodule CodebattleWeb.Api.V1.UserGameReportControllerTest do
114114
{:ok, game} = Game.Context.create_game(game_params)
115115

116116
params = %{
117-
"user_id" => user.id,
118-
"reason" => "cheating",
117+
"offender_id" => user.id,
118+
"reason" => "cheater",
119119
"comment" => "Bot is cheating"
120120
}
121121

@@ -139,8 +139,8 @@ defmodule CodebattleWeb.Api.V1.UserGameReportControllerTest do
139139
{:ok, game} = Game.Context.create_game(game_params)
140140

141141
params = %{
142-
"user_id" => bot.id,
143-
"reason" => "bot_cheated"
142+
"offender_id" => bot.id,
143+
"reason" => "wrong_solution"
144144
}
145145

146146
response =
@@ -163,7 +163,7 @@ defmodule CodebattleWeb.Api.V1.UserGameReportControllerTest do
163163
{:ok, game} = Game.Context.create_game(game_params)
164164

165165
params = %{
166-
"user_id" => bot.id,
166+
"offender_id" => bot.id,
167167
"reason" => "not_existed_reason",
168168
"comment" => "Some comment"
169169
}

0 commit comments

Comments
 (0)