mirror of
https://github.com/wanderer-industries/wanderer
synced 2025-12-12 02:35:42 +00:00
feat(Audit): Add 'ACL added/removed' map audit events
This commit is contained in:
@@ -55,18 +55,33 @@ defmodule WandererApp.Maps do
|
|||||||
|
|
||||||
def get_available_maps(current_user) do
|
def get_available_maps(current_user) do
|
||||||
case WandererApp.Api.Map.available(%{}, actor: current_user) do
|
case WandererApp.Api.Map.available(%{}, actor: current_user) do
|
||||||
{:ok, maps} -> {:ok, maps |> _filter_blocked_maps(current_user)}
|
{:ok, maps} -> {:ok, maps |> filter_blocked_maps(current_user)}
|
||||||
_ -> {:ok, []}
|
_ -> {:ok, []}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_tracked_map_characters(map_id, current_user) do
|
||||||
|
case WandererApp.MapCharacterSettingsRepo.get_tracked_by_map_filtered(
|
||||||
|
map_id,
|
||||||
|
current_user.characters |> Enum.map(& &1.id)
|
||||||
|
) do
|
||||||
|
{:ok, settings} ->
|
||||||
|
{:ok,
|
||||||
|
settings
|
||||||
|
|> Enum.map(fn s -> s |> Ash.load!(:character) |> Map.get(:character) end)}
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
{:ok, []}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def load_characters(map, character_settings, user_id) do
|
def load_characters(map, character_settings, user_id) do
|
||||||
{:ok, user_characters} =
|
{:ok, user_characters} =
|
||||||
WandererApp.Api.Character.active_by_user(%{user_id: user_id})
|
WandererApp.Api.Character.active_by_user(%{user_id: user_id})
|
||||||
|
|
||||||
characters =
|
characters =
|
||||||
map
|
map
|
||||||
|> _get_map_available_characters(user_characters)
|
|> get_map_available_characters(user_characters)
|
||||||
|> Enum.map(fn c ->
|
|> Enum.map(fn c ->
|
||||||
map_character(c, character_settings |> Enum.find(&(&1.character_id == c.id)))
|
map_character(c, character_settings |> Enum.find(&(&1.character_id == c.id)))
|
||||||
end)
|
end)
|
||||||
@@ -146,7 +161,7 @@ defmodule WandererApp.Maps do
|
|||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp _get_map_available_characters(map, user_characters) do
|
defp get_map_available_characters(map, user_characters) do
|
||||||
{:ok,
|
{:ok,
|
||||||
%{
|
%{
|
||||||
map_acl_owner_ids: map_acl_owner_ids,
|
map_acl_owner_ids: map_acl_owner_ids,
|
||||||
@@ -164,7 +179,7 @@ defmodule WandererApp.Maps do
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp _filter_blocked_maps(maps, current_user) do
|
defp filter_blocked_maps(maps, current_user) do
|
||||||
user_character_ids = current_user.characters |> Enum.map(& &1.id)
|
user_character_ids = current_user.characters |> Enum.map(& &1.id)
|
||||||
user_character_eve_ids = current_user.characters |> Enum.map(& &1.eve_id)
|
user_character_eve_ids = current_user.characters |> Enum.map(& &1.eve_id)
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ defmodule WandererAppWeb.UserActivity do
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="text-sm text-[var(--color-gray-4)] w-[15%]">
|
<p class="text-sm text-[var(--color-gray-4)] w-[15%]">
|
||||||
<%= _get_event_name(@activity.event_type) %>
|
<%= get_event_name(@activity.event_type) %>
|
||||||
</p>
|
</p>
|
||||||
<.activity_event event_type={@activity.event_type} event_data={@activity.event_data} />
|
<.activity_event event_type={@activity.event_type} event_data={@activity.event_data} />
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ defmodule WandererAppWeb.UserActivity do
|
|||||||
<div class="w-[40%]">
|
<div class="w-[40%]">
|
||||||
<div class="flex items-center gap-1">
|
<div class="flex items-center gap-1">
|
||||||
<h6 class="text-base leading-[150%] font-semibold dark:text-white">
|
<h6 class="text-base leading-[150%] font-semibold dark:text-white">
|
||||||
<%= _get_event_data(@event_type, Jason.decode!(@event_data) |> Map.drop(["character_id"])) %>
|
<%= get_event_data(@event_type, Jason.decode!(@event_data) |> Map.drop(["character_id"])) %>
|
||||||
</h6>
|
</h6>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -129,27 +129,33 @@ defmodule WandererAppWeb.UserActivity do
|
|||||||
{:noreply, socket}
|
{:noreply, socket}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp _get_event_name(:hub_added), do: "Hub Added"
|
defp get_event_name(:hub_added), do: "Hub Added"
|
||||||
defp _get_event_name(:hub_removed), do: "Hub Removed"
|
defp get_event_name(:hub_removed), do: "Hub Removed"
|
||||||
defp _get_event_name(:map_connection_added), do: "Connection Added"
|
defp get_event_name(:map_connection_added), do: "Connection Added"
|
||||||
defp _get_event_name(:map_connection_updated), do: "Connection Updated"
|
defp get_event_name(:map_connection_updated), do: "Connection Updated"
|
||||||
defp _get_event_name(:map_connection_removed), do: "Connection Removed"
|
defp get_event_name(:map_connection_removed), do: "Connection Removed"
|
||||||
defp _get_event_name(:map_acl_added), do: "Acl Added"
|
defp get_event_name(:map_acl_added), do: "Acl Added"
|
||||||
defp _get_event_name(:map_acl_removed), do: "Acl Removed"
|
defp get_event_name(:map_acl_removed), do: "Acl Removed"
|
||||||
defp _get_event_name(:system_added), do: "System Added"
|
defp get_event_name(:system_added), do: "System Added"
|
||||||
defp _get_event_name(:system_updated), do: "System Updated"
|
defp get_event_name(:system_updated), do: "System Updated"
|
||||||
defp _get_event_name(:systems_removed), do: "System(s) Removed"
|
defp get_event_name(:systems_removed), do: "System(s) Removed"
|
||||||
defp _get_event_name(name), do: name
|
defp get_event_name(name), do: name
|
||||||
|
|
||||||
# defp _get_event_data(:hub_added, data), do: Jason.encode!(data)
|
defp get_event_data(:map_acl_added, %{"acl_id" => acl_id}) do
|
||||||
# defp _get_event_data(:hub_removed, data), do: data
|
{:ok, acl} = WandererApp.AccessListRepo.get(acl_id)
|
||||||
|
"#{acl.name}"
|
||||||
|
end
|
||||||
|
|
||||||
# defp _get_event_data(:map_acl_added, data), do: data
|
defp get_event_data(:map_acl_removed, %{"acl_id" => acl_id}) do
|
||||||
# defp _get_event_data(:map_acl_removed, data), do: data
|
{:ok, acl} = WandererApp.AccessListRepo.get(acl_id)
|
||||||
# defp _get_event_data(:system_added, data), do: data
|
"#{acl.name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# defp get_event_data(:map_acl_removed, data), do: data
|
||||||
|
# defp get_event_data(:system_added, data), do: data
|
||||||
#
|
#
|
||||||
|
|
||||||
defp _get_event_data(:system_updated, %{
|
defp get_event_data(:system_updated, %{
|
||||||
"key" => "labels",
|
"key" => "labels",
|
||||||
"solar_system_id" => solar_system_id,
|
"solar_system_id" => solar_system_id,
|
||||||
"value" => value
|
"value" => value
|
||||||
@@ -166,22 +172,22 @@ defmodule WandererAppWeb.UserActivity do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp _get_event_data(:system_added, %{
|
defp get_event_data(:system_added, %{
|
||||||
"solar_system_id" => solar_system_id
|
"solar_system_id" => solar_system_id
|
||||||
}),
|
}),
|
||||||
do: _get_system_name(solar_system_id)
|
do: _get_system_name(solar_system_id)
|
||||||
|
|
||||||
defp _get_event_data(:hub_added, %{
|
defp get_event_data(:hub_added, %{
|
||||||
"solar_system_id" => solar_system_id
|
"solar_system_id" => solar_system_id
|
||||||
}),
|
}),
|
||||||
do: _get_system_name(solar_system_id)
|
do: _get_system_name(solar_system_id)
|
||||||
|
|
||||||
defp _get_event_data(:hub_removed, %{
|
defp get_event_data(:hub_removed, %{
|
||||||
"solar_system_id" => solar_system_id
|
"solar_system_id" => solar_system_id
|
||||||
}),
|
}),
|
||||||
do: _get_system_name(solar_system_id)
|
do: _get_system_name(solar_system_id)
|
||||||
|
|
||||||
defp _get_event_data(:system_updated, %{
|
defp get_event_data(:system_updated, %{
|
||||||
"key" => key,
|
"key" => key,
|
||||||
"solar_system_id" => solar_system_id,
|
"solar_system_id" => solar_system_id,
|
||||||
"value" => value
|
"value" => value
|
||||||
@@ -190,7 +196,7 @@ defmodule WandererAppWeb.UserActivity do
|
|||||||
"#{system_name} #{key} - #{inspect(value)}"
|
"#{system_name} #{key} - #{inspect(value)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
defp _get_event_data(:systems_removed, %{
|
defp get_event_data(:systems_removed, %{
|
||||||
"solar_system_ids" => solar_system_ids
|
"solar_system_ids" => solar_system_ids
|
||||||
}),
|
}),
|
||||||
do:
|
do:
|
||||||
@@ -198,7 +204,7 @@ defmodule WandererAppWeb.UserActivity do
|
|||||||
|> Enum.map(&_get_system_name/1)
|
|> Enum.map(&_get_system_name/1)
|
||||||
|> Enum.join(", ")
|
|> Enum.join(", ")
|
||||||
|
|
||||||
defp _get_event_data(:map_connection_added, %{
|
defp get_event_data(:map_connection_added, %{
|
||||||
"solar_system_source_id" => solar_system_source_id,
|
"solar_system_source_id" => solar_system_source_id,
|
||||||
"solar_system_target_id" => solar_system_target_id
|
"solar_system_target_id" => solar_system_target_id
|
||||||
}) do
|
}) do
|
||||||
@@ -207,7 +213,7 @@ defmodule WandererAppWeb.UserActivity do
|
|||||||
"[#{source_system_name}:#{target_system_name}]"
|
"[#{source_system_name}:#{target_system_name}]"
|
||||||
end
|
end
|
||||||
|
|
||||||
defp _get_event_data(:map_connection_removed, %{
|
defp get_event_data(:map_connection_removed, %{
|
||||||
"solar_system_source_id" => solar_system_source_id,
|
"solar_system_source_id" => solar_system_source_id,
|
||||||
"solar_system_target_id" => solar_system_target_id
|
"solar_system_target_id" => solar_system_target_id
|
||||||
}) do
|
}) do
|
||||||
@@ -216,7 +222,7 @@ defmodule WandererAppWeb.UserActivity do
|
|||||||
"[#{source_system_name}:#{target_system_name}]"
|
"[#{source_system_name}:#{target_system_name}]"
|
||||||
end
|
end
|
||||||
|
|
||||||
defp _get_event_data(:map_connection_updated, %{
|
defp get_event_data(:map_connection_updated, %{
|
||||||
"key" => key,
|
"key" => key,
|
||||||
"solar_system_source_id" => solar_system_source_id,
|
"solar_system_source_id" => solar_system_source_id,
|
||||||
"solar_system_target_id" => solar_system_target_id,
|
"solar_system_target_id" => solar_system_target_id,
|
||||||
@@ -227,7 +233,7 @@ defmodule WandererAppWeb.UserActivity do
|
|||||||
"[#{source_system_name}:#{target_system_name}] #{key} - #{inspect(value)}"
|
"[#{source_system_name}:#{target_system_name}] #{key} - #{inspect(value)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
defp _get_event_data(_name, data), do: Jason.encode!(data)
|
defp get_event_data(_name, data), do: Jason.encode!(data)
|
||||||
|
|
||||||
defp _get_system_name(solar_system_id) do
|
defp _get_system_name(solar_system_id) do
|
||||||
case WandererApp.CachedInfo.get_system_static_info(solar_system_id) do
|
case WandererApp.CachedInfo.get_system_static_info(solar_system_id) do
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ defmodule WandererAppWeb.MapCharactersEventHandler do
|
|||||||
|
|
||||||
%{result: characters} = socket.assigns.characters
|
%{result: characters} = socket.assigns.characters
|
||||||
|
|
||||||
{:ok, map_characters} = get_tracked_map_characters(map_id, current_user)
|
{:ok, map_characters} = WandererApp.Maps.get_tracked_map_characters(map_id, current_user)
|
||||||
|
|
||||||
user_character_eve_ids = map_characters |> Enum.map(& &1.eve_id)
|
user_character_eve_ids = map_characters |> Enum.map(& &1.eve_id)
|
||||||
|
|
||||||
@@ -204,7 +204,7 @@ defmodule WandererAppWeb.MapCharactersEventHandler do
|
|||||||
{:ok, all_settings} = WandererApp.MapCharacterSettingsRepo.get_all_by_map(map_id)
|
{:ok, all_settings} = WandererApp.MapCharacterSettingsRepo.get_all_by_map(map_id)
|
||||||
|
|
||||||
# Find and filter user's characters
|
# Find and filter user's characters
|
||||||
{:ok, user_characters} = get_tracked_map_characters(map_id, current_user)
|
{:ok, user_characters} = WandererApp.Maps.get_tracked_map_characters(map_id, current_user)
|
||||||
user_char_ids = Enum.map(user_characters, & &1.id)
|
user_char_ids = Enum.map(user_characters, & &1.id)
|
||||||
|
|
||||||
my_settings =
|
my_settings =
|
||||||
@@ -251,7 +251,7 @@ defmodule WandererAppWeb.MapCharactersEventHandler do
|
|||||||
# re-fetch or re-map to confirm final results in UI
|
# re-fetch or re-map to confirm final results in UI
|
||||||
%{result: characters} = socket.assigns.characters
|
%{result: characters} = socket.assigns.characters
|
||||||
|
|
||||||
{:ok, tracked_characters} = get_tracked_map_characters(map_id, current_user)
|
{:ok, tracked_characters} = WandererApp.Maps.get_tracked_map_characters(map_id, current_user)
|
||||||
user_eve_ids = Enum.map(tracked_characters, & &1.eve_id)
|
user_eve_ids = Enum.map(tracked_characters, & &1.eve_id)
|
||||||
|
|
||||||
{:ok, final_settings} = WandererApp.MapCharacterSettingsRepo.get_all_by_map(map_id)
|
{:ok, final_settings} = WandererApp.MapCharacterSettingsRepo.get_all_by_map(map_id)
|
||||||
@@ -316,21 +316,6 @@ defmodule WandererAppWeb.MapCharactersEventHandler do
|
|||||||
def has_tracked_characters?([]), do: false
|
def has_tracked_characters?([]), do: false
|
||||||
def has_tracked_characters?(_user_characters), do: true
|
def has_tracked_characters?(_user_characters), do: true
|
||||||
|
|
||||||
def get_tracked_map_characters(map_id, current_user) do
|
|
||||||
case WandererApp.MapCharacterSettingsRepo.get_tracked_by_map_filtered(
|
|
||||||
map_id,
|
|
||||||
current_user.characters |> Enum.map(& &1.id)
|
|
||||||
) do
|
|
||||||
{:ok, settings} ->
|
|
||||||
{:ok,
|
|
||||||
settings
|
|
||||||
|> Enum.map(fn s -> s |> Ash.load!(:character) |> Map.get(:character) end)}
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
{:ok, []}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def map_ui_character(character),
|
def map_ui_character(character),
|
||||||
do:
|
do:
|
||||||
character
|
character
|
||||||
|
|||||||
@@ -119,10 +119,9 @@ defmodule WandererAppWeb.MapCoreEventHandler do
|
|||||||
),
|
),
|
||||||
do: socket
|
do: socket
|
||||||
|
|
||||||
def handle_server_event(%{event: :structures_updated, payload: _solar_system_id}, socket) do
|
def handle_server_event(%{event: :structures_updated, payload: _solar_system_id}, socket) do
|
||||||
socket
|
socket
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def handle_server_event(event, socket) do
|
def handle_server_event(event, socket) do
|
||||||
Logger.warning(fn -> "unhandled map core event: #{inspect(event)} #{inspect(socket)} " end)
|
Logger.warning(fn -> "unhandled map core event: #{inspect(event)} #{inspect(socket)} " end)
|
||||||
@@ -337,7 +336,7 @@ defmodule WandererAppWeb.MapCoreEventHandler do
|
|||||||
with {:ok, _} <- current_user |> WandererApp.Api.User.update_last_map(%{last_map_id: map_id}),
|
with {:ok, _} <- current_user |> WandererApp.Api.User.update_last_map(%{last_map_id: map_id}),
|
||||||
{:ok, map_user_settings} <- WandererApp.MapUserSettingsRepo.get(map_id, current_user.id),
|
{:ok, map_user_settings} <- WandererApp.MapUserSettingsRepo.get(map_id, current_user.id),
|
||||||
{:ok, tracked_map_characters} <-
|
{:ok, tracked_map_characters} <-
|
||||||
MapCharactersEventHandler.get_tracked_map_characters(map_id, current_user),
|
WandererApp.Maps.get_tracked_map_characters(map_id, current_user),
|
||||||
{:ok, characters_limit} <- map_id |> WandererApp.Map.get_characters_limit(),
|
{:ok, characters_limit} <- map_id |> WandererApp.Map.get_characters_limit(),
|
||||||
{:ok, present_character_ids} <-
|
{:ok, present_character_ids} <-
|
||||||
WandererApp.Cache.lookup("map_#{map_id}:presence_character_ids", []),
|
WandererApp.Cache.lookup("map_#{map_id}:presence_character_ids", []),
|
||||||
@@ -543,21 +542,6 @@ defmodule WandererAppWeb.MapCoreEventHandler do
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp get_tracked_map_characters(map_id, current_user) do
|
|
||||||
case WandererApp.MapCharacterSettingsRepo.get_tracked_by_map_filtered(
|
|
||||||
map_id,
|
|
||||||
current_user.characters |> Enum.map(& &1.id)
|
|
||||||
) do
|
|
||||||
{:ok, settings} ->
|
|
||||||
{:ok,
|
|
||||||
settings
|
|
||||||
|> Enum.map(fn s -> s |> Ash.load!(:character) |> Map.get(:character) end)}
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
{:ok, []}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
defp filter_map_characters(
|
defp filter_map_characters(
|
||||||
characters,
|
characters,
|
||||||
user_character_eve_ids,
|
user_character_eve_ids,
|
||||||
|
|||||||
@@ -1,20 +1,3 @@
|
|||||||
<main
|
|
||||||
id="map-events-list"
|
|
||||||
class="pt-20 w-full h-full col-span-2 lg:col-span-1 p-4 pl-20 pb-20 overflow-auto"
|
|
||||||
>
|
|
||||||
<div class="flex flex-col gap-4 w-full">
|
|
||||||
<.live_component
|
|
||||||
module={UserActivity}
|
|
||||||
id="user-activity"
|
|
||||||
notify_to={self()}
|
|
||||||
can_undo_types={@can_undo_types}
|
|
||||||
stream={@streams.activity}
|
|
||||||
page={@page}
|
|
||||||
end_of_stream?={@end_of_stream?}
|
|
||||||
event_name="activity_event"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
<nav class="fixed top-0 z-100 px-6 pl-20 flex items-center justify-between w-full h-12 pointer-events-auto border-b border-stone-800 bg-opacity-70 bg-neutral-900">
|
<nav class="fixed top-0 z-100 px-6 pl-20 flex items-center justify-between w-full h-12 pointer-events-auto border-b border-stone-800 bg-opacity-70 bg-neutral-900">
|
||||||
<span className="w-full font-medium text-sm">
|
<span className="w-full font-medium text-sm">
|
||||||
<.link navigate={~p"/#{@map_slug}"} class="text-neutral-100">
|
<.link navigate={~p"/#{@map_slug}"} class="text-neutral-100">
|
||||||
@@ -113,3 +96,20 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
<main
|
||||||
|
id="map-events-list"
|
||||||
|
class="pt-20 w-full h-full col-span-2 lg:col-span-1 p-4 pl-20 pb-20 overflow-auto"
|
||||||
|
>
|
||||||
|
<div class="flex flex-col gap-4 w-full">
|
||||||
|
<.live_component
|
||||||
|
module={UserActivity}
|
||||||
|
id="user-activity"
|
||||||
|
notify_to={self()}
|
||||||
|
can_undo_types={@can_undo_types}
|
||||||
|
stream={@streams.activity}
|
||||||
|
page={@page}
|
||||||
|
end_of_stream?={@end_of_stream?}
|
||||||
|
event_name="activity_event"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|||||||
@@ -636,6 +636,33 @@ defmodule WandererAppWeb.MapsLive do
|
|||||||
{:map_acl_updated, added_acls, removed_acls}
|
{:map_acl_updated, added_acls, removed_acls}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
{:ok, tracked_characters} =
|
||||||
|
WandererApp.Maps.get_tracked_map_characters(map.id, current_user)
|
||||||
|
|
||||||
|
first_tracked_character_id = Enum.map(tracked_characters, & &1.id) |> List.first()
|
||||||
|
|
||||||
|
added_acls
|
||||||
|
|> Enum.each(fn acl_id ->
|
||||||
|
{:ok, _} =
|
||||||
|
WandererApp.User.ActivityTracker.track_map_event(:map_acl_added, %{
|
||||||
|
character_id: first_tracked_character_id,
|
||||||
|
user_id: current_user.id,
|
||||||
|
map_id: map.id,
|
||||||
|
acl_id: acl_id
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
|
||||||
|
removed_acls
|
||||||
|
|> Enum.each(fn acl_id ->
|
||||||
|
{:ok, _} =
|
||||||
|
WandererApp.User.ActivityTracker.track_map_event(:map_acl_removed, %{
|
||||||
|
character_id: first_tracked_character_id,
|
||||||
|
user_id: current_user.id,
|
||||||
|
map_id: map.id,
|
||||||
|
acl_id: acl_id
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
|
||||||
{:noreply,
|
{:noreply,
|
||||||
socket
|
socket
|
||||||
|> assign_async(:maps, fn ->
|
|> assign_async(:maps, fn ->
|
||||||
|
|||||||
Reference in New Issue
Block a user