diff --git a/services/app/apps/codebattle/lib/codebattle/task.ex b/services/app/apps/codebattle/lib/codebattle/task.ex index 8b8975358..ffc68aa51 100644 --- a/services/app/apps/codebattle/lib/codebattle/task.ex +++ b/services/app/apps/codebattle/lib/codebattle/task.ex @@ -195,11 +195,19 @@ defmodule Codebattle.Task do !result end - @spec get_task_by_tags_for_user(User.t(), list(String.t())) :: t() | nil - def get_task_by_tags_for_user(user, tags) do - __MODULE__ + @spec get_task_by_tags_for_user(User.t(), list(String.t()), String.t() | nil) :: t() | nil + def get_task_by_tags_for_user(user, tags, level \\ nil) do + query = __MODULE__ |> filter_visibility(user) |> where([t], fragment("? @> ?", t.tags, ^tags)) + + query = if level do + query |> where([t], t.level == ^level) + else + query + end + + query |> order_by(fragment("RANDOM()")) |> limit(1) |> Repo.one() diff --git a/services/app/apps/codebattle/lib/codebattle_web/channels/lobby_channel.ex b/services/app/apps/codebattle/lib/codebattle_web/channels/lobby_channel.ex index 933b26f1d..c6df23bf8 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/channels/lobby_channel.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/channels/lobby_channel.ex @@ -124,7 +124,8 @@ defmodule CodebattleWeb.LobbyChannel do end defp maybe_add_task(params, %{"task_tags" => task_tags}, user) when length(task_tags) > 0 do - case Codebattle.Task.get_task_by_tags_for_user(user, task_tags) do + level = Map.get(params, :level) + case Codebattle.Task.get_task_by_tags_for_user(user, task_tags, level) do nil -> params task -> Map.put(params, :task, task) end