From 255c8fda67f3cf2f17ab4102b39ccd8d58d38834 Mon Sep 17 00:00:00 2001
From: setop <setop@zoocoop.com>
Date: Fri, 6 Dec 2024 12:49:08 +0100
Subject: [PATCH] fix(back): event.ends_on can be nil

---
 lib/mobilizon/events/events.ex                | 23 +++++++++++++++----
 test/web/controllers/feed_controller_test.exs |  5 ++--
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/lib/mobilizon/events/events.ex b/lib/mobilizon/events/events.ex
index 0b48fb02a..f741354c3 100644
--- a/lib/mobilizon/events/events.ex
+++ b/lib/mobilizon/events/events.ex
@@ -374,7 +374,7 @@ defmodule Mobilizon.Events do
           atom,
           boolean,
           boolean | nil,
-          string | nil,
+          String.t() | nil,
           float | nil
         ) :: Page.t(Event.t())
   def list_events(
@@ -2029,11 +2029,20 @@ defmodule Mobilizon.Events do
   defp event_filter_ends_on(query, nil, nil), do: query
 
   defp event_filter_ends_on(query, %DateTime{} = after_datetime, nil) do
-    where(query, [e], e.ends_on > ^after_datetime)
+    where(
+      query,
+      [e],
+      (is_nil(e.ends_on) and e.begins_on >= ^after_datetime) or
+        e.ends_on >= ^after_datetime
+    )
   end
 
   defp event_filter_ends_on(query, nil, %DateTime{} = before_datetime) do
-    where(query, [e], e.ends_on < ^before_datetime)
+    where(
+      query,
+      [e],
+      (is_nil(e.ends_on) and e.begins_on <= ^before_datetime) or e.ends_on <= ^before_datetime
+    )
   end
 
   defp event_filter_ends_on(
@@ -2042,8 +2051,8 @@ defmodule Mobilizon.Events do
          %DateTime{} = before_datetime
        ) do
     query
-    |> where([e], e.ends_on < ^before_datetime)
-    |> where([e], e.ends_on > ^after_datetime)
+    |> event_filter_ends_on(after_datetime, nil)
+    |> event_filter_ends_on(nil, before_datetime)
   end
 
   defp event_order_by(query, order_by, direction)
@@ -2145,6 +2154,10 @@ defmodule Mobilizon.Events do
   # Handling the case where Repo.XXXX() return nil
   def with_virtual_fields(nil), do: nil
 
+  # if envent has no end date, it can not be a long events
+  def with_virtual_fields(%Event{} = event) when is_nil(event.ends_on),
+    do: %{event | long_event: false}
+
   # Handling the case where there is an event
   # Using Repo.one(), for example
   def with_virtual_fields(%Event{} = event) do
diff --git a/test/web/controllers/feed_controller_test.exs b/test/web/controllers/feed_controller_test.exs
index 0cf3155d6..b37cdafcf 100644
--- a/test/web/controllers/feed_controller_test.exs
+++ b/test/web/controllers/feed_controller_test.exs
@@ -115,11 +115,12 @@ defmodule Mobilizon.Web.FeedControllerTest do
           begins_on: DateTime.add(DateTime.utc_now(), 4, :day)
         )
 
-      event3 =
+      event_in_the_past =
         insert(:event,
           organizer_actor: actor,
           attributed_to: group,
           title: "Event Three",
+          ends_on: DateTime.add(DateTime.utc_now(), -3, :day),
           begins_on: DateTime.add(DateTime.utc_now(), -2, :day)
         )
 
@@ -135,7 +136,7 @@ defmodule Mobilizon.Web.FeedControllerTest do
 
       Enum.each(entries, fn entry ->
         assert entry.summary in [event1.title, event2.title]
-        refute entry.summary == event3.title
+        refute entry.summary == event_in_the_past.title
       end)
 
       assert entry1.categories == [tag1.title]