Skip to content

Commit 68d5237

Browse files
committed
Add last_user_game to public_tournaments
1 parent f9ee691 commit 68d5237

5 files changed

Lines changed: 73 additions & 36 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ defmodule Codebattle.Task do
134134
generator_lang: Map.get(params, :generator_lang, "js"),
135135
input_signature: params.input_signature,
136136
level: params.level,
137-
time_to_solve_sec: params.time_to_solve_sec,
137+
time_to_solve_sec: Map.get(params, :time_to_solve_sec, nil),
138138
origin: params.origin,
139139
output_signature: params.output_signature,
140140
solution: Map.get(params, :solution, ""),

services/app/apps/codebattle/lib/codebattle/tournament/context.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ defmodule Codebattle.Tournament.Context do
1515

1616
@states_from_restore ["waiting_participants"]
1717

18+
def get_user_latest_game_id(tournament, user_id) do
19+
player = Tournament.Players.get_player(tournament, user_id)
20+
21+
if player and player.matches_ids != [] do
22+
match_id = Enum.max(player.matches_ids)
23+
tournament |> Tournament.Matches.get_match(match_id) |> Map.get(:game_id)
24+
end
25+
end
26+
1827
@spec get_tournament_info(tournament_id()) :: Tournament.t() | map()
1928
def get_tournament_info(tournament_id) do
2029
case Tournament.Server.get_tournament_info(tournament_id) do

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ defmodule Codebattle.User do
22
@moduledoc """
33
Represents authenticatable user
44
"""
5-
65
use Ecto.Schema
76

87
import Ecto.Changeset
@@ -12,6 +11,10 @@ defmodule Codebattle.User do
1211
alias Codebattle.Repo
1312
alias Codebattle.User.SoundSettings
1413

14+
defimpl FunWithFlags.Actor, for: Codebattle.User do
15+
def id(%{name: name}), do: "user:#{name}"
16+
end
17+
1518
@type t :: %__MODULE__{}
1619
@type raw_id :: String.t() | integer()
1720

services/app/apps/codebattle/lib/codebattle_web/controllers/public_event_controller.ex

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,48 @@ defmodule CodebattleWeb.PublicEventController do
99

1010
require Logger
1111

12-
plug(CodebattleWeb.Plugs.RequireAuth when action in [:show, :create_action])
12+
plug(CodebattleWeb.Plugs.RequireAuth when action in [:show, :stage])
1313

1414
def show(conn, %{"slug" => slug}) do
15-
user = conn.assigns.current_user
16-
event = Event.get_by_slug!(slug)
17-
user_event = UserEvent.get_by_user_id_and_event_id(user.id, event.id)
18-
19-
conn = put_meta_tags(conn, Application.get_all_env(:phoenix_meta_tags))
20-
21-
conn
22-
|> assign(:ticker_text, event.ticker_text)
23-
|> assign(:show_header, true)
24-
|> put_gon(
25-
event: %{
26-
event: event,
27-
user_event: user_event
28-
}
29-
)
30-
|> render("show.html", layout: {CodebattleWeb.LayoutView, :external})
15+
if FunWithFlags.enabled?(:event, for_actor: conn.assigns.current_user) do
16+
user = conn.assigns.current_user
17+
event = Event.get_by_slug!(slug)
18+
user_event = UserEvent.get_by_user_id_and_event_id(user.id, event.id)
19+
20+
conn = put_meta_tags(conn, Application.get_all_env(:phoenix_meta_tags))
21+
22+
conn
23+
|> assign(:ticker_text, event.ticker_text)
24+
|> assign(:show_header, true)
25+
|> put_gon(
26+
event: %{
27+
event: event,
28+
user_event: user_event
29+
}
30+
)
31+
|> render("show.html", layout: {CodebattleWeb.LayoutView, :external})
32+
else
33+
redirect(conn, to: Routes.root_path(conn, :index))
34+
end
3135
end
3236

3337
def stage(conn, %{"slug" => slug, "stage_slug" => stage_slug}) do
34-
user = conn.assigns.current_user
35-
36-
case Event.Context.start_stage_for_user(user, slug, stage_slug) do
37-
{:ok, %Tournament{} = tournament} ->
38-
redirect(conn, to: Routes.tournament_path(conn, :show, tournament.id))
39-
40-
{:error, error} ->
41-
Logger.error("Error starting stage: #{inspect(error)}")
42-
43-
conn
44-
|> put_flash(:error, error)
45-
|> redirect(to: Routes.public_event_path(conn, :show, slug))
38+
if FunWithFlags.enabled?(:event, for_actor: conn.assigns.current_user) do
39+
user = conn.assigns.current_user
40+
41+
case Event.Context.start_stage_for_user(user, slug, stage_slug) do
42+
{:ok, %Tournament{} = tournament} ->
43+
redirect(conn, to: Routes.tournament_path(conn, :show, tournament.id))
44+
45+
{:error, error} ->
46+
Logger.error("Error starting stage: #{inspect(error)}")
47+
48+
conn
49+
|> put_flash(:error, error)
50+
|> redirect(to: Routes.public_event_path(conn, :show, slug))
51+
end
52+
else
53+
redirect(conn, to: Routes.root_path(conn, :index))
4654
end
4755
end
4856
end

services/app/apps/codebattle/lib/codebattle_web/controllers/tournament_controller.ex

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ defmodule CodebattleWeb.TournamentController do
44
import PhoenixGon.Controller
55

66
alias Codebattle.Tournament
7+
alias Codebattle.User
8+
9+
plug(CodebattleWeb.Plugs.RequireAuth when action in [:index, :show])
710

811
def index(conn, _params) do
912
current_user = conn.assigns[:current_user]
@@ -18,6 +21,25 @@ defmodule CodebattleWeb.TournamentController do
1821
tournament = Tournament.Context.get!(params["id"])
1922

2023
if Tournament.Helpers.can_access?(tournament, current_user, params) do
24+
handle_tournament_for_user(conn, tournament, current_user)
25+
else
26+
conn
27+
|> put_status(:not_found)
28+
|> put_view(CodebattleWeb.ErrorView)
29+
|> render("404.html", %{msg: gettext("Tournament not found")})
30+
end
31+
end
32+
33+
defp handle_tournament_for_user(conn, tournament, current_user) do
34+
if FunWithFlags.enabled?(:tournament_redirect_to_latest_game) and !User.admin?(current_user) do
35+
latest_game_id = Tournament.Context.get_user_latest_game_id(tournament, current_user.id)
36+
37+
if latest_game_id do
38+
redirect(conn, to: Routes.game_url(conn, :show, latest_game_id))
39+
else
40+
redirect(conn, to: Routes.tournament_url(conn, :show, tournament.id))
41+
end
42+
else
2143
conn
2244
|> put_view(CodebattleWeb.TournamentView)
2345
|> put_meta_tags(%{
@@ -29,11 +51,6 @@ defmodule CodebattleWeb.TournamentController do
2951
|> put_gon(tournament_id: params["id"])
3052
|> put_gon(event_id: tournament.event_id)
3153
|> render("show.html")
32-
else
33-
conn
34-
|> put_status(:not_found)
35-
|> put_view(CodebattleWeb.ErrorView)
36-
|> render("404.html", %{msg: gettext("Tournament not found")})
3754
end
3855
end
3956
end

0 commit comments

Comments
 (0)