Skip to content

Commit 10bf64f

Browse files
committed
Add ui for events
1 parent e0ac8b7 commit 10bf64f

11 files changed

Lines changed: 844 additions & 119 deletions

File tree

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

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ defmodule Codebattle.Event do
66
import Ecto.Changeset
77
import Ecto.Query
88

9-
alias Codebattle.Event.Stage
109
alias Codebattle.Repo
10+
alias Runner.AtomizedMap
1111

1212
@type t :: %__MODULE__{}
1313

@@ -37,7 +37,31 @@ defmodule Codebattle.Event do
3737
field(:starts_at, :utc_datetime)
3838
field(:personal_tournament_id, :integer)
3939

40-
embeds_many(:stages, Stage, on_replace: :delete)
40+
embeds_many :stages, __MODULE__.Stage, on_replace: :delete, primary_key: false do
41+
@derive {Jason.Encoder,
42+
only: [
43+
:action_button_text,
44+
:confirmation_text,
45+
:dates,
46+
:name,
47+
:slug,
48+
:status,
49+
:tournament_id,
50+
:playing_type,
51+
:type
52+
]}
53+
54+
field(:action_button_text, :string)
55+
field(:confirmation_text, :string)
56+
field(:dates, :string)
57+
field(:name, :string)
58+
field(:slug, :string)
59+
field(:status, Ecto.Enum, values: [:pending, :passed, :active])
60+
field(:tournament_id, :integer)
61+
field(:playing_type, Ecto.Enum, values: [:single, :global])
62+
field(:tournament_meta, AtomizedMap)
63+
field(:type, Ecto.Enum, values: [:tournament, :entrance])
64+
end
4165

4266
timestamps()
4367
end
@@ -102,7 +126,7 @@ defmodule Codebattle.Event do
102126
def changeset(clan, attrs \\ %{}) do
103127
clan
104128
|> cast(attrs, [:slug, :type, :ticker_text, :title, :description, :creator_id, :starts_at])
105-
|> cast_embed(:stages, with: &Stage.changeset/2)
129+
|> cast_embed(:stages, with: &stage_changeset/2)
106130
|> validate_length(:slug, min: 2, max: 57)
107131
|> validate_length(:description, min: 3, max: 10_000)
108132
|> validate_length(:title, min: 3, max: 250)
@@ -111,4 +135,24 @@ defmodule Codebattle.Event do
111135
end
112136

113137
def types, do: @types
138+
139+
def stage_changeset(stage, params \\ %{}) do
140+
stage
141+
|> cast(params, [
142+
:action_button_text,
143+
:confirmation_text,
144+
:dates,
145+
:name,
146+
:slug,
147+
:status,
148+
:tournament_id,
149+
:tournament_meta,
150+
:playing_type,
151+
:type
152+
])
153+
|> validate_required([:slug, :name, :status, :type])
154+
|> validate_inclusion(:status, [:pending, :passed, :active])
155+
|> validate_inclusion(:type, [:tournament, :entrance])
156+
|> validate_inclusion(:playing_type, [:single, :global])
157+
end
114158
end

services/app/apps/codebattle/lib/codebattle/event/stage.ex

Lines changed: 0 additions & 58 deletions
This file was deleted.

services/app/apps/codebattle/lib/codebattle/event/user_event.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,14 @@ defmodule Codebattle.UserEvent do
158158
|> Repo.update!()
159159
end
160160

161+
@spec upsert_stages(t(), list(map())) :: {:ok, t()} | {:error, term()}
162+
def upsert_stages(user_event, stages_params) do
163+
# Update the user_event with the new stages directly
164+
user_event
165+
|> changeset(%{stages: stages_params})
166+
|> Repo.update()
167+
end
168+
161169
@spec changeset(t(), map()) :: Ecto.Changeset.t()
162170
def changeset(user_event, attrs \\ %{}) do
163171
user_event

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

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -153,14 +153,14 @@ defmodule Codebattle.User do
153153
@spec guest_id() :: integer()
154154
def guest_id, do: @guest_id
155155

156-
@spec get!(raw_id()) :: t() | no_return()
157-
def get!(user_id) do
158-
Repo.get!(__MODULE__, user_id)
156+
@spec get!(raw_id(), preload :: term()) :: t() | no_return()
157+
def get!(user_id, preload \\ []) do
158+
Repo.get!(__MODULE__, user_id, preload: preload)
159159
end
160160

161-
@spec get(raw_id()) :: t() | nil
162-
def get(user_id) do
163-
get!(user_id)
161+
@spec get(raw_id(), preload :: term()) :: t() | nil
162+
def get(user_id, preload \\ []) do
163+
get!(user_id, preload)
164164
rescue
165165
_e -> nil
166166
end
@@ -197,6 +197,13 @@ defmodule Codebattle.User do
197197
|> Repo.update()
198198
end
199199

200+
def delete_auth_token(user_id) do
201+
user_id
202+
|> get!()
203+
|> changeset(%{auth_token: nil})
204+
|> Repo.update()
205+
end
206+
200207
def update_subscription_type(user_id, type) do
201208
user_id
202209
|> get!()
@@ -253,14 +260,6 @@ defmodule Codebattle.User do
253260
def find_or_create_by_clan(changeset, clan_name, user_id) do
254261
case Clan.find_or_create_by_clan(clan_name, user_id) do
255262
{:ok, clan} ->
256-
# TODO: drop me in 3 weeks. Sorry for the mess
257-
clan =
258-
if clan.id in [379, 4373] do
259-
Clan.get!(4375)
260-
else
261-
clan
262-
end
263-
264263
change(changeset, %{clan: clan.name, clan_id: clan.id})
265264

266265
{:error, reason} ->

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ defmodule CodebattleWeb.EventController do
2727
user = conn.assigns.current_user
2828
params = Map.put(event_params, "user_id", user.id)
2929

30+
# Handle stages JSON if present
31+
params = process_stages_json(params)
32+
3033
case Codebattle.Event.create(params) do
3134
{:ok, event} ->
3235
conn
@@ -41,6 +44,9 @@ defmodule CodebattleWeb.EventController do
4144
def update(conn, %{"id" => id, "event" => event_params}) do
4245
event = Event.get!(id)
4346

47+
# Handle stages JSON if present
48+
event_params = process_stages_json(event_params)
49+
4450
case Codebattle.Event.update(
4551
event,
4652
Map.put(event_params, "creator_id", conn.assigns.current_user.id)
@@ -71,4 +77,27 @@ defmodule CodebattleWeb.EventController do
7177
|> put_flash(:info, gettext("Event deleted!"))
7278
|> redirect(to: Routes.event_path(conn, :index))
7379
end
80+
81+
# Process stages JSON data from form
82+
defp process_stages_json(%{"stages_json" => stages_json} = params) when is_binary(stages_json) and stages_json != "" do
83+
with {:ok, stages_data} <- Jason.decode(stages_json),
84+
true <- is_list(stages_data) do
85+
stages =
86+
Enum.map(stages_data, fn stage ->
87+
# Ensure required fields are present
88+
Map.new(stage, fn {k, v} -> {String.to_atom(k), v} end)
89+
end)
90+
91+
# Replace stages_json with stages
92+
params
93+
|> Map.delete("stages_json")
94+
|> Map.put("stages", stages)
95+
else
96+
_ ->
97+
# Invalid format - not a list or invalid JSON
98+
params
99+
end
100+
end
101+
102+
defp process_stages_json(params), do: params
74103
end

services/app/apps/codebattle/lib/codebattle_web/live/admin/user_view.ex renamed to services/app/apps/codebattle/lib/codebattle_web/live/admin/user_index_view.ex

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,14 @@ defmodule CodebattleWeb.Live.Admin.User.IndexView do
9090
<tr>
9191
<td><%= index %></td>
9292
<td><%= user.id %></td>
93-
<td><%= user.name %></td>
93+
<td>
94+
<a
95+
href={Routes.admin_user_show_view_path(@socket, :show, user.id)}
96+
class="text-primary"
97+
>
98+
<%= user.name %>
99+
</a>
100+
</td>
94101
<td><%= user.clan && String.slice(user.clan, 0, 20) %></td>
95102
<td>
96103
<%= CodebattleWeb.Router.Helpers.auth_url(CodebattleWeb.Endpoint, :token,

0 commit comments

Comments
 (0)