From b3c542231b120868f9355a99f8bd7d46025d4c87 Mon Sep 17 00:00:00 2001 From: Christian Maddox Date: Mon, 16 Dec 2024 13:55:47 -0500 Subject: [PATCH] feat: Upload shuttle definition (#1053) * Added upload feature for shuttle definitions. * Added some file validation. * Added tests. * Fixed happy path test. * Refactors to help with clarity. * Close processes at a more reliable time. * Refactored out xlsx specific functions into separate module. * Improved indexing of stop_ids and validation. * Update map on upload. --- lib/arrow/shuttles/definition_upload.ex | 85 ++++++++++++++++ .../live/shuttle_live/shuttle_live.ex | 89 ++++++++++++++++- .../shuttle_live/shuttle_view_live.html.heex | 1 + mix.exs | 3 +- mix.lock | 2 + .../live/shuttle_live/shuttle_live_test.exs | 92 ++++++++++++++++++ .../fixtures/xlsx/invalid_missing_data.xlsx | Bin 0 -> 18154 bytes .../xlsx/invalid_missing_headers.xlsx | Bin 0 -> 18131 bytes .../fixtures/xlsx/invalid_missing_tab.xlsx | Bin 0 -> 18242 bytes test/support/fixtures/xlsx/valid.xlsx | Bin 0 -> 18147 bytes 10 files changed, 270 insertions(+), 2 deletions(-) create mode 100644 lib/arrow/shuttles/definition_upload.ex create mode 100644 test/support/fixtures/xlsx/invalid_missing_data.xlsx create mode 100644 test/support/fixtures/xlsx/invalid_missing_headers.xlsx create mode 100644 test/support/fixtures/xlsx/invalid_missing_tab.xlsx create mode 100644 test/support/fixtures/xlsx/valid.xlsx diff --git a/lib/arrow/shuttles/definition_upload.ex b/lib/arrow/shuttles/definition_upload.ex new file mode 100644 index 00000000..2991284f --- /dev/null +++ b/lib/arrow/shuttles/definition_upload.ex @@ -0,0 +1,85 @@ +defmodule Arrow.Shuttles.DefinitionUpload do + @moduledoc "functions for extracting shuttle defintions from xlsx uploads" + alias Arrow.Shuttles.Stop + + @doc """ + Parses a shuttle definition xlsx worksheet and returns a list of two stop_id lists + """ + @spec extract_stop_ids_from_upload(%{path: String.t()}) :: + {:ok, {list(Stop.id()), list(Stop.id())} | {:error, [String.t(), ...]}} + def extract_stop_ids_from_upload(%{path: xlsx_path}) do + with tids when is_list(tids) <- Xlsxir.multi_extract(xlsx_path), + {:ok, + %{ + "Direction 0 STOPS" => direction_0_tab_tid, + "Direction 1 STOPS" => direction_1_tab_tid + }} <- get_xlsx_tab_tids(tids), + {:ok, direction_0_stop_ids} <- parse_direction_tab(direction_0_tab_tid), + {:ok, direction_1_stop_ids} <- parse_direction_tab(direction_1_tab_tid) do + {:ok, {direction_0_stop_ids, direction_1_stop_ids}} + else + {:error, error} -> {:ok, {:error, [error]}} + {:errors, errors} -> {:ok, {:error, errors}} + end + end + + defp get_xlsx_tab_tids(tab_tids) do + tab_map = + tab_tids + |> Enum.map(fn {:ok, tid} -> + name = Xlsxir.get_info(tid, :name) + + if name in ["Direction 0 STOPS", "Direction 1 STOPS"] do + {name, tid} + else + Xlsxir.close(tid) + nil + end + end) + |> Enum.reject(&is_nil/1) + |> Map.new() + + case {tab_map["Direction 0 STOPS"], tab_map["Direction 1 STOPS"]} do + {nil, nil} -> {:error, "Missing tabs for both directions"} + {nil, _} -> {:error, "Missing Direction 0 STOPS tab"} + {_, nil} -> {:error, "Missing Direction 1 STOPS tab"} + _ -> {:ok, tab_map} + end + end + + def parse_direction_tab(table_id) do + tab_data = + table_id + |> Xlsxir.get_list() + # Cells that have been touched but are empty can return nil + |> Enum.reject(fn list -> Enum.all?(list, &is_nil/1) end) + |> tap(fn _ -> Xlsxir.close(table_id) end) + + parse_stop_ids(tab_data) + end + + defp parse_stop_ids([headers | _] = data) do + if stop_id_col_index = Enum.find_index(headers, &(&1 === "Stop ID")) do + stop_ids = data |> Enum.drop(1) |> Enum.map(&Enum.at(&1, stop_id_col_index)) + + errors = + stop_ids + |> Enum.with_index(1) + |> Enum.reduce([], fn {stop_id, i}, acc -> + append_if( + acc, + is_nil(stop_id) or not is_integer(stop_id), + "Missing/invalid stop ID on row #{i + 1}" + ) + end) + + if Enum.empty?(errors), do: {:ok, stop_ids}, else: {:errors, errors} + else + {:errors, ["Unable to parse Stop ID column"]} + end + end + + defp append_if(list, condition, item) do + if condition, do: [item | list], else: list + end +end diff --git a/lib/arrow_web/live/shuttle_live/shuttle_live.ex b/lib/arrow_web/live/shuttle_live/shuttle_live.ex index 752a854f..0abf2c2d 100644 --- a/lib/arrow_web/live/shuttle_live/shuttle_live.ex +++ b/lib/arrow_web/live/shuttle_live/shuttle_live.ex @@ -3,7 +3,7 @@ defmodule ArrowWeb.ShuttleViewLive do import Phoenix.HTML.Form alias Arrow.Shuttles - alias Arrow.Shuttles.{Route, RouteStop, Shape, Shuttle} + alias Arrow.Shuttles.{DefinitionUpload, Route, RouteStop, Shape, Shuttle} alias ArrowWeb.ShapeView embed_templates "shuttle_live/*" @@ -18,6 +18,7 @@ defmodule ArrowWeb.ShuttleViewLive do attr :shapes, :list, required: true attr :map_props, :map, required: false, default: %{} attr :errors, :map, required: false, default: %{route_stops: %{}} + attr :uploads, :any def shuttle_form(assigns) do ~H""" @@ -64,6 +65,18 @@ defmodule ArrowWeb.ShuttleViewLive do /> +
+
+ <.link_button + class="btn-primary" + phx-click={JS.dispatch("click", to: "##{@uploads.definition.ref}")} + target="_blank" + > + <.live_file_input upload={@uploads.definition} class="hidden" /> + Upload Shuttle Definition XLSX + +
+
<%= live_react_component("Components.ShapeStopViewMap", @map_props, id: "shuttle-view-map") %>

define route

@@ -337,6 +350,11 @@ defmodule ArrowWeb.ShuttleViewLive do |> assign(:shapes, shapes) |> assign(:map_props, %{layers: routes_to_layers(shuttle.routes)}) |> assign(:errors, %{route_stops: %{}}) + |> allow_upload(:definition, + accept: ~w(.xlsx), + progress: &handle_progress/3, + auto_upload: true + ) {:ok, socket} end @@ -362,6 +380,11 @@ defmodule ArrowWeb.ShuttleViewLive do |> assign(:shapes, shapes) |> assign(:map_props, %{layers: routes_to_layers(shuttle.routes)}) |> assign(:errors, %{route_stops: %{}}) + |> allow_upload(:definition, + accept: ~w(.xlsx), + progress: &handle_progress/3, + auto_upload: true + ) {:ok, socket} end @@ -522,6 +545,32 @@ defmodule ArrowWeb.ShuttleViewLive do } end + defp update_route_changeset_with_uploaded_stops(route_changeset, stop_ids, direction_id) do + if Ecto.Changeset.get_field(route_changeset, :direction_id) == direction_id do + new_route_stops = + stop_ids + |> Enum.with_index() + |> Enum.map(fn {stop_id, i} -> + Arrow.Shuttles.RouteStop.changeset( + %Arrow.Shuttles.RouteStop{}, + %{ + direction_id: direction_id, + stop_sequence: i, + display_stop_id: Integer.to_string(stop_id) + } + ) + end) + + Ecto.Changeset.put_assoc( + route_changeset, + :route_stops, + new_route_stops + ) + else + route_changeset + end + end + @spec get_stop_travel_times(list({:ok, any()})) :: {:ok, list(number())} | {:error, any()} defp get_stop_travel_times(stop_coordinates) do @@ -630,4 +679,42 @@ defmodule ArrowWeb.ShuttleViewLive do {:noreply, socket |> assign(form: form) |> update_map(change)} end + + defp handle_progress(:definition, entry, socket) do + socket = clear_flash(socket) + + if entry.done? do + case consume_uploaded_entry(socket, entry, &DefinitionUpload.extract_stop_ids_from_upload/1) do + {:error, errors} -> + {:noreply, put_flash(socket, :errors, {"Failed to upload definition:", errors})} + + stop_ids -> + socket = populate_stop_ids(socket, stop_ids) + + {:noreply, socket} + end + else + {:noreply, socket} + end + end + + defp populate_stop_ids(socket, stop_ids) do + changeset = socket.assigns.form.source + existing_routes = Ecto.Changeset.get_assoc(changeset, :routes) + + new_routes = + Enum.map(existing_routes, fn route_changeset -> + direction_id = Ecto.Changeset.get_field(route_changeset, :direction_id) + + update_route_changeset_with_uploaded_stops( + route_changeset, + elem(stop_ids, direction_id |> Atom.to_string() |> String.to_integer()), + direction_id + ) + end) + + changeset = Ecto.Changeset.put_assoc(changeset, :routes, new_routes) + + socket |> assign(:form, to_form(changeset)) |> update_map(changeset) + end end diff --git a/lib/arrow_web/live/shuttle_live/shuttle_view_live.html.heex b/lib/arrow_web/live/shuttle_live/shuttle_view_live.html.heex index af2458b4..936b50d3 100644 --- a/lib/arrow_web/live/shuttle_live/shuttle_view_live.html.heex +++ b/lib/arrow_web/live/shuttle_live/shuttle_view_live.html.heex @@ -10,6 +10,7 @@ shapes={@shapes} map_props={@map_props} errors={@errors} + uploads={@uploads} /> <.back navigate={~p"/shuttles"}>Back to shuttles diff --git a/mix.exs b/mix.exs index f903a231..91be2cf0 100644 --- a/mix.exs +++ b/mix.exs @@ -96,7 +96,8 @@ defmodule Arrow.MixProject do compile: false, depth: 1}, {:sax_map, "~> 1.2"}, - {:unzip, "~> 0.12.0"} + {:unzip, "~> 0.12.0"}, + {:xlsxir, "~> 1.6"} ] end diff --git a/mix.lock b/mix.lock index 19e290f2..1ab175ee 100644 --- a/mix.lock +++ b/mix.lock @@ -14,6 +14,7 @@ "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.8.2", "79350a53246ac5ec27326d208496aebceb77fa82a91744f66a9154560f0759d3", [:mix], [{:ecto_sql, "~> 3.7", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "> 0.16.0 and < 0.20.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1 or ~> 4.0.0", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "6149c1c4a5ba6602a76cb09ee7a269eb60dab9694a1dbbb797f032555212de75"}, "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, + "erlsom": {:hex, :erlsom, "1.5.1", "c8fe2babd33ff0846403f6522328b8ab676f896b793634cfe7ef181c05316c03", [:rebar3], [], "hexpm", "7965485494c5844dd127656ac40f141aadfa174839ec1be1074e7edf5b4239eb"}, "esbuild": {:hex, :esbuild, "0.8.2", "5f379dfa383ef482b738e7771daf238b2d1cfb0222bef9d3b20d4c8f06c7a7ac", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "558a8a08ed78eb820efbfda1de196569d8bfa9b51e8371a1934fbb31345feda7"}, "ex_aws": {:hex, :ex_aws, "2.5.6", "6f642e0f82eff10a9b470044f084b81a791cf15b393d647ea5f3e65da2794e3d", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8 or ~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:mime, "~> 1.2 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:req, "~> 0.3", [hex: :req, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c69eec59e31fdd89d0beeb1d97e16518dd1b23ad95b3d5c9f1dcfec23d97f960"}, "ex_aws_rds": {:hex, :ex_aws_rds, "2.0.2", "38dd8e83d57cf4b7286c4f6f5c978f700c40c207ffcdd6ca5d738e5eba933f9a", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}], "hexpm", "9e5b5cc168077874cbd0d29ba65d01caf1877e705fb5cecacf0667dd19bfa75c"}, @@ -81,4 +82,5 @@ "web_driver_client": {:hex, :web_driver_client, "0.2.0", "63b76cd9eb3b0716ec5467a0f8bead73d3d9612e63f7560d21357f03ad86e31a", [:mix], [{:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:tesla, "~> 1.3", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm", "83cc6092bc3e74926d1c8455f0ce927d5d1d36707b74d9a65e38c084aab0350f"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, "websock_adapter": {:hex, :websock_adapter, "0.5.7", "65fa74042530064ef0570b75b43f5c49bb8b235d6515671b3d250022cb8a1f9e", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "d0f478ee64deddfec64b800673fd6e0c8888b079d9f3444dd96d2a98383bdbd1"}, + "xlsxir": {:hex, :xlsxir, "1.6.4", "d1e69439cbd9edc1190950f9f883ac364e1f31641e0395ccdb27761791b169a3", [:mix], [{:erlsom, "~> 1.5", [hex: :erlsom, repo: "hexpm", optional: false]}], "hexpm", "38e91f65eb8a4c8dea07d941c8b7e21baf8c8d4938232395c9ffd19d2eb071f2"}, } diff --git a/test/arrow_web/live/shuttle_live/shuttle_live_test.exs b/test/arrow_web/live/shuttle_live/shuttle_live_test.exs index 1564203d..a7977bdb 100644 --- a/test/arrow_web/live/shuttle_live/shuttle_live_test.exs +++ b/test/arrow_web/live/shuttle_live/shuttle_live_test.exs @@ -401,6 +401,98 @@ defmodule ArrowWeb.ShuttleLiveTest do end end + describe "upload definition" do + @tag :authenticated_admin + test "sets route_stops using uploaded stop IDs", %{conn: conn} do + {:ok, new_live, _html} = live(conn, ~p"/shuttles/new") + + definition = + file_input(new_live, "#shuttle-form", :definition, [ + %{ + name: "valid.xlsx", + content: File.read!("test/support/fixtures/xlsx/valid.xlsx") + } + ]) + + direction_0_stop_sequence = ~w(9328 5327 5271) + direction_1_stop_sequence = ~w(5271 5072 9328) + html = render_upload(definition, "valid.xlsx") + + direction_0_stop_rows = Floki.find(html, "#stops-dir-0 > .row") + direction_1_stop_rows = Floki.find(html, "#stops-dir-1 > .row") + + for {stop_id, index} <- Enum.with_index(direction_0_stop_sequence) do + assert [^stop_id] = + Floki.attribute( + direction_0_stop_rows, + "[data-stop_sequence=#{index}] > div.form-group > input[type=text]", + "value" + ) + end + + for {stop_id, index} <- Enum.with_index(direction_1_stop_sequence) do + assert [^stop_id] = + Floki.attribute( + direction_1_stop_rows, + "[data-stop_sequence=#{index}] > div.form-group > input[type=text]", + "value" + ) + end + end + + @tag :authenticated_admin + test "displays error for missing/invalid tabs", %{conn: conn} do + {:ok, new_live, _html} = live(conn, ~p"/shuttles/new") + + definition = + file_input(new_live, "#shuttle-form", :definition, [ + %{ + name: "invalid_missing_tab.xlsx", + content: File.read!("test/support/fixtures/xlsx/invalid_missing_tab.xlsx") + } + ]) + + page = render_upload(definition, "invalid_missing_tab.xlsx") + assert page =~ "Failed to upload definition:" + assert page =~ "Missing Direction 0 STOPS tab" + end + + @tag :authenticated_admin + test "displays error for missing/invalid data", %{conn: conn} do + {:ok, new_live, _html} = live(conn, ~p"/shuttles/new") + + definition = + file_input(new_live, "#shuttle-form", :definition, [ + %{ + name: "invalid_missing_data.xlsx", + content: File.read!("test/support/fixtures/xlsx/invalid_missing_data.xlsx") + } + ]) + + page = render_upload(definition, "invalid_missing_data.xlsx") + assert page =~ "Failed to upload definition:" + assert page =~ "Missing/invalid stop ID on row 3" + end + + @tag :authenticated_admin + + test "displays error for missing headers", %{conn: conn} do + {:ok, new_live, _html} = live(conn, ~p"/shuttles/new") + + definition = + file_input(new_live, "#shuttle-form", :definition, [ + %{ + name: "invalid_missing_headers.xlsx", + content: File.read!("test/support/fixtures/xlsx/invalid_missing_headers.xlsx") + } + ]) + + page = render_upload(definition, "invalid_missing_headers.xlsx") + assert page =~ "Failed to upload definition:" + assert page =~ "Unable to parse Stop ID column" + end + end + defp create_shuttle_with_stops(_) do shuttle = shuttle_fixture(%{}, true) %{shuttle: shuttle} diff --git a/test/support/fixtures/xlsx/invalid_missing_data.xlsx b/test/support/fixtures/xlsx/invalid_missing_data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..db0d14e6a6f7153f5960690ddb9f998bc1bb6b10 GIT binary patch literal 18154 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 DsK}Z( literal 0 HcmV?d00001 diff --git a/test/support/fixtures/xlsx/valid.xlsx b/test/support/fixtures/xlsx/valid.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..170408513b08baa458914d8ad7a0acc4c41064ba GIT binary patch literal 18147 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 T005|OUmxFE*<=L%`0f7y;k#Mm literal 0 HcmV?d00001