From d005b82130554d69284fb22e106a00ce3531a91c Mon Sep 17 00:00:00 2001 From: Titonatos Date: Mon, 24 Feb 2025 13:23:24 +0300 Subject: [PATCH 1/2] Fix bug #2083 Filtering by tags doesn't work --- services/app/apps/codebattle/lib/codebattle/task.ex | 5 +++-- .../codebattle/lib/codebattle_web/channels/lobby_channel.ex | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/services/app/apps/codebattle/lib/codebattle/task.ex b/services/app/apps/codebattle/lib/codebattle/task.ex index 8b8975358..995f7a271 100644 --- a/services/app/apps/codebattle/lib/codebattle/task.ex +++ b/services/app/apps/codebattle/lib/codebattle/task.ex @@ -195,10 +195,11 @@ 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 + @spec get_task_by_tags_for_user(User.t(), list(String.t()), String.t()) :: t() | nil + def get_task_by_tags_for_user(user, tags, level) do __MODULE__ |> filter_visibility(user) + |> where([t], t.level == ^level) |> where([t], fragment("? @> ?", t.tags, ^tags)) |> order_by(fragment("RANDOM()")) |> limit(1) 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 From ab480858d7378ab617c0d8fd757429c397800a47 Mon Sep 17 00:00:00 2001 From: Titonatos Date: Wed, 26 Feb 2025 13:20:44 +0300 Subject: [PATCH 2/2] Update fix #2083 --- .../app/apps/codebattle/lib/codebattle/task.ex | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/services/app/apps/codebattle/lib/codebattle/task.ex b/services/app/apps/codebattle/lib/codebattle/task.ex index 995f7a271..ffc68aa51 100644 --- a/services/app/apps/codebattle/lib/codebattle/task.ex +++ b/services/app/apps/codebattle/lib/codebattle/task.ex @@ -195,12 +195,19 @@ defmodule Codebattle.Task do !result end - @spec get_task_by_tags_for_user(User.t(), list(String.t()), String.t()) :: t() | nil - def get_task_by_tags_for_user(user, tags, level) 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], t.level == ^level) |> 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()