From bf8a1197e44153e107a99bb363c575e8aef982a8 Mon Sep 17 00:00:00 2001 From: Dmitry Popov Date: Fri, 10 Jan 2025 23:18:09 +0100 Subject: [PATCH] feat(Map): Ability to store/view audit logs up to 3 months --- lib/wanderer_app/map/map_audit.ex | 75 +++++++++++-------- .../live/maps/map_audit_live.ex | 55 ++++++++++---- .../live/maps/map_audit_live.html.heex | 28 ++++++- 3 files changed, 108 insertions(+), 50 deletions(-) diff --git a/lib/wanderer_app/map/map_audit.ex b/lib/wanderer_app/map/map_audit.ex index 4ce8d5e8..302d3995 100644 --- a/lib/wanderer_app/map/map_audit.ex +++ b/lib/wanderer_app/map/map_audit.ex @@ -9,20 +9,38 @@ defmodule WandererApp.Map.Audit do @logger Application.compile_env(:wanderer_app, :logger) @week_seconds :timer.hours(24 * 7) + @month_seconds @week_seconds * 4 + @audit_expired_seconds @month_seconds * 3 + + def track_map_subscription_event(event_type, metadata) do + case event_type do + "subscription.created" -> + track_map_event(event_type, metadata) + + "subscription.updated" -> + track_map_event(event_type, metadata) + + "subscription.deleted" -> + track_map_event(event_type, metadata) + + _ -> + {:ok, nil} + end + end def archive() do - @logger.info("Start map audit arhiving...") + Logger.info("Start map audit arhiving...") WandererApp.Api.UserActivity - |> Ash.Query.filter(inserted_at: [less_than: _get_expired_at()]) + |> Ash.Query.filter(inserted_at: [less_than: get_expired_at()]) |> Ash.bulk_destroy!(:archive, %{}, batch_size: 100) - @logger.info(fn -> "Audit arhived" end) + Logger.info(fn -> "Audit arhived" end) :ok end def get_activity_page(map_id, page, per_page, period, activity) do - {from, to} = period |> _get_period() + {from, to} = period |> get_period() query = WandererApp.Api.UserActivity @@ -84,52 +102,43 @@ defmodule WandererApp.Map.Audit do def track_map_event(_event_type, _metadata), do: {:ok, nil} - defp _get_period("1H") do + defp get_period("1H") do now = DateTime.utc_now() start_date = now |> DateTime.add(-1 * 3600, :second) {start_date, now} end - defp _get_period("1D") do + defp get_period("1D") do now = DateTime.utc_now() start_date = now |> DateTime.add(-24 * 3600, :second) {start_date, now} end - defp _get_period("1W") do + defp get_period("1W") do now = DateTime.utc_now() start_date = now |> DateTime.add(-24 * 3600 * 7, :second) {start_date, now} end - # defp _get_period("1M") do - # now = DateTime.utc_now() - # start_date = now |> DateTime.add(-24 * 3600 * 31, :second) - # {start_date, now} - # end - - # defp _get_period("ALL") do - # now = DateTime.utc_now() - - # start_date = %{ - # now - # | year: 2000, - # month: 1, - # day: 1, - # hour: 00, - # minute: 00, - # second: 00, - # microsecond: {0, 0} - # } - - # {start_date, now} - # end - - defp _get_period(_) do + defp get_period("1M") do now = DateTime.utc_now() - start_date = now |> DateTime.add(-1 * 3600, :second) + start_date = now |> DateTime.add(-24 * 3600 * 31, :second) {start_date, now} end - defp _get_expired_at(), do: DateTime.utc_now() |> DateTime.add(-@week_seconds, :second) + defp get_period("2M") do + now = DateTime.utc_now() + start_date = now |> DateTime.add(-24 * 3600 * 31 * 2, :second) + {start_date, now} + end + + defp get_period("3M") do + now = DateTime.utc_now() + start_date = now |> DateTime.add(-24 * 3600 * 31 * 3, :second) + {start_date, now} + end + + defp get_period(_), do: get_period("1H") + + defp get_expired_at(), do: DateTime.utc_now() |> DateTime.add(-@audit_expired_seconds, :second) end diff --git a/lib/wanderer_app_web/live/maps/map_audit_live.ex b/lib/wanderer_app_web/live/maps/map_audit_live.ex index abba2a3c..033bb30b 100755 --- a/lib/wanderer_app_web/live/maps/map_audit_live.ex +++ b/lib/wanderer_app_web/live/maps/map_audit_live.ex @@ -5,6 +5,8 @@ defmodule WandererAppWeb.MapAuditLive do alias WandererAppWeb.UserActivity + @active_subscription_periods ["2M", "3M"] + def mount( %{"slug" => map_slug, "period" => period, "activity" => activity} = _params, _session, @@ -38,6 +40,7 @@ defmodule WandererAppWeb.MapAuditLive do map_id: map_id, map_name: map_name, map_slug: map_slug, + map_subscription_active: WandererApp.Map.is_subscription_active?(map_id), activity: activity, can_undo_types: [:systems_removed], period: period || "1H", @@ -117,23 +120,26 @@ defmodule WandererAppWeb.MapAuditLive do end end - def handle_event("undo", %{"event-data" => event_data, "event-type" => "systems_removed"}, %{assigns: %{map_id: map_id, current_user: current_user}} = socket) do + def handle_event( + "undo", + %{"event-data" => event_data, "event-type" => "systems_removed"}, + %{assigns: %{map_id: map_id, current_user: current_user}} = socket + ) do {:ok, %{"solar_system_ids" => solar_system_ids}} = Jason.decode(event_data) solar_system_ids - |> Enum.each(fn solar_system_id -> - WandererApp.Map.Server.add_system( - map_id, - %{ - solar_system_id: solar_system_id, - coordinates: nil, - use_old_coordinates: true - }, - current_user.id, - nil - ) - end) - + |> Enum.each(fn solar_system_id -> + WandererApp.Map.Server.add_system( + map_id, + %{ + solar_system_id: solar_system_id, + coordinates: nil, + use_old_coordinates: true + }, + current_user.id, + nil + ) + end) {:noreply, socket |> put_flash(:info, "Systems restored!")} end @@ -171,9 +177,18 @@ defmodule WandererAppWeb.MapAuditLive do end defp load_activity(socket, new_page) when new_page >= 1 do - %{activity: activity, per_page: per_page, page: cur_page, map_id: map_id, period: period} = + %{ + activity: activity, + per_page: per_page, + page: cur_page, + map_id: map_id, + map_subscription_active: map_subscription_active, + period: period + } = socket.assigns + period = get_valid_period(period, map_subscription_active) + with {:ok, page} <- WandererApp.Map.Audit.get_activity_page(map_id, new_page, per_page, period, activity) do {activity, at, limit} = @@ -199,4 +214,14 @@ defmodule WandererAppWeb.MapAuditLive do _ -> socket end end + + defp get_valid_period(period, true), do: period + + defp get_valid_period(period, _map_subscription_active) do + if period in @active_subscription_periods do + "1H" + else + period + end + end end diff --git a/lib/wanderer_app_web/live/maps/map_audit_live.html.heex b/lib/wanderer_app_web/live/maps/map_audit_live.html.heex index bba1b6f8..176354de 100644 --- a/lib/wanderer_app_web/live/maps/map_audit_live.html.heex +++ b/lib/wanderer_app_web/live/maps/map_audit_live.html.heex @@ -65,7 +65,8 @@ > WEEK - <%!-- + + + <%!--