diff --git a/lib/eventos/export/icalendar.ex b/lib/eventos/export/icalendar.ex new file mode 100644 index 000000000..a492e382d --- /dev/null +++ b/lib/eventos/export/icalendar.ex @@ -0,0 +1,19 @@ +defmodule Eventos.Export.ICalendar do + @moduledoc """ + Export an event to iCalendar format + """ + + alias Eventos.Events.Event + + @spec export_event(%Event{}) :: String + def export_event(%Event{} = event) do + events = [%ICalendar.Event{ + summary: event.title, + dtstart: event.begins_on, + dtend: event.ends_on, + description: event.description + }] + %ICalendar{events: events} + |> ICalendar.to_ics() + end +end diff --git a/lib/eventos_web/controllers/event_controller.ex b/lib/eventos_web/controllers/event_controller.ex index a8bf177e7..a07130144 100644 --- a/lib/eventos_web/controllers/event_controller.ex +++ b/lib/eventos_web/controllers/event_controller.ex @@ -6,6 +6,7 @@ defmodule EventosWeb.EventController do alias Eventos.Events alias Eventos.Events.Event + alias Eventos.Export.ICalendar action_fallback EventosWeb.FallbackController @@ -28,6 +29,13 @@ defmodule EventosWeb.EventController do render(conn, "show.json", event: event) end + def export_to_ics(conn, %{"id" => id}) do + event = id + |> Events.get_event!() + |> ICalendar.export_event() + send_resp(conn, 200, event) + end + def update(conn, %{"id" => id, "event" => event_params}) do event = Events.get_event!(id) diff --git a/lib/eventos_web/router.ex b/lib/eventos_web/router.ex index 1760636c0..b0cd532da 100644 --- a/lib/eventos_web/router.ex +++ b/lib/eventos_web/router.ex @@ -44,6 +44,7 @@ defmodule EventosWeb.Router do resources "/users", UserController, except: [:new, :edit, :show] resources "/accounts", AccountController, except: [:new, :edit] resources "/events", EventController + get "/events/:id/ics", EventController, :export_to_ics resources "/categories", CategoryController resources "/tags", TagController resources "/event_accounts", EventAccountsController diff --git a/test/eventos_web/controllers/event_controller_test.exs b/test/eventos_web/controllers/event_controller_test.exs index 1a7250dda..72c1824d2 100644 --- a/test/eventos_web/controllers/event_controller_test.exs +++ b/test/eventos_web/controllers/event_controller_test.exs @@ -4,6 +4,7 @@ defmodule EventosWeb.EventControllerTest do alias Eventos.Events alias Eventos.Events.Event + alias Eventos.Export.ICalendar @create_attrs %{begins_on: "2010-04-17 14:00:00.000000Z", description: "some description", ends_on: "2010-04-17 14:00:00.000000Z", title: "some title"} @update_attrs %{begins_on: "2011-05-18 15:01:01.000000Z", description: "some updated description", ends_on: "2011-05-18 15:01:01.000000Z", title: "some updated title"} @@ -51,6 +52,17 @@ defmodule EventosWeb.EventControllerTest do end end + describe "export event" do + setup [:create_event] + + test "renders ics export of event", %{conn: conn, event: %Event{id: id} = event, user: user} do + conn = auth_conn(conn, user) + conn = get conn, event_path(conn, :export_to_ics, id) + exported_event = ICalendar.export_event(event) + assert exported_event == response(conn, 200) + end + end + describe "update event" do setup [:create_event]