diff --git a/apps/csv2sql/lib/csv2sql/config/loader.ex b/apps/csv2sql/lib/csv2sql/config/loader.ex index 4c76a4f..08b0a07 100644 --- a/apps/csv2sql/lib/csv2sql/config/loader.ex +++ b/apps/csv2sql/lib/csv2sql/config/loader.ex @@ -107,12 +107,16 @@ defmodule Csv2sql.Config.Loader do end defp load_db_config(args) do - db_type = get_db_type(args) + db_type = args[:db_type] + db_url = args[:db_url] + # db_type = get_db_type(args) - db_url = - if args[:db_url], - do: "ecto://#{args[:db_url]}", - else: raise("Please provide a valid database url") + # db_type = args[:db_type] + + # db_url = args[:db_url] + # if args[:db_url], + # do: "ecto://#{args[:db_url]}", + # else: raise("Please provide a valid database url") varchar_limit = get_varchar_limit(args) insertion_chunk_size = get_insertion_chunk_size(args) diff --git a/apps/dashboard/lib/dashboard_web/live/main_live.ex b/apps/dashboard/lib/dashboard_web/live/main_live.ex index 808de4f..c9499f1 100644 --- a/apps/dashboard/lib/dashboard_web/live/main_live.ex +++ b/apps/dashboard/lib/dashboard_web/live/main_live.ex @@ -5,6 +5,7 @@ defmodule DashboardWeb.Live.MainLive do alias DashBoard.DbAttribute alias Csv2sql.Database.ConnectionTest alias DashboardWeb.Live.ConfigLive + alias DashboardWeb.Live.StartLive @debounce_time 1000 @@ -18,17 +19,50 @@ defmodule DashboardWeb.Live.MainLive do # Check for DB connection on config load from local storage timer_ref = Process.send_after(self(), :check_db_connection, @debounce_time) - {:ok, - assign(socket, - page: "config", - modal: false, - path_validator_debouncer: nil, - db_connection_debouncer: timer_ref, - db_connection_established: false, - changeset: Config.get_defaults() |> Map.merge(local_storage_config) |> Config.changeset(), - matching_date_time: nil, - constraints: Csv2sql.Config.Loader.get_constraints() - )} + case Csv2sql.ProgressTracker.get_state().status do + {:error, %{message: message}} -> + {:ok, + assign(socket, + page: "start", + modal: false, + path_validator_debouncer: nil, + db_connection_debouncer: timer_ref, + db_connection_established: false, + changeset: + Config.get_defaults() |> Map.merge(local_storage_config) |> Config.changeset(), + matching_date_time: nil, + constraints: Csv2sql.Config.Loader.get_constraints(), + error: true, + reason: String.split(message, "\n") |> Enum.filter(fn s -> s not in ["", nil] end), + state: Csv2sql.ProgressTracker.get_state() + )} + + _ -> + {:ok, + assign(socket, + page: "start", + modal: false, + path_validator_debouncer: nil, + db_connection_debouncer: timer_ref, + db_connection_established: false, + changeset: + Config.get_defaults() |> Map.merge(local_storage_config) |> Config.changeset(), + matching_date_time: nil, + constraints: Csv2sql.Config.Loader.get_constraints(), + state: Csv2sql.ProgressTracker.get_state() + )} + end + end + + def handle_event("csv-parse", _attrs, socket) do + try do + Csv2sql.Stages.Analyze.analyze_files() + Process.send_after(self(), :get_status, 2000) + {:noreply, assign(socket, page: "start", state: Csv2sql.ProgressTracker.get_state())} + catch + err -> + {:noreply, assign(socket, page: "start", error: true)} + end end @impl true @@ -115,6 +149,28 @@ defmodule DashboardWeb.Live.MainLive do |> update_matching_date_time()} end + @impl true + def handle_info(:get_status, socket) do + IO.inspect(Csv2sql.ProgressTracker.get_state().status) + + case Csv2sql.ProgressTracker.get_state().status do + :finish -> + {:noreply, assign(socket, page: "start", state: Csv2sql.ProgressTracker.get_state())} + + {:error, %{message: message}} -> + {:ok, + assign(socket, + page: "start", + error: true, + reason: String.split(message, "\n") |> Enum.filter(fn s -> s not in ["", nil] end), + state: Csv2sql.ProgressTracker.get_state() + )} + + _ -> + Process.send_after(self(), :get_status, 2000) + end + end + @impl true def handle_info(:check_db_connection, ~M{assigns} = socket) do with( @@ -161,9 +217,17 @@ defmodule DashboardWeb.Live.MainLive do ConfigLive.config_page(assigns) "start" -> - ~H""" - Placeholder - """ + Map.put(assigns.changeset.changes, :dashboard, true) + + Csv2sql.Config.Loader.load( + Map.put( + assigns.changeset.changes, + :db_url, + create_db_url(assigns.changeset.changes, false) + ) + ) + + StartLive.start_parse(assigns) "about" -> ~H""" diff --git a/apps/dashboard/lib/dashboard_web/live/start_live.ex b/apps/dashboard/lib/dashboard_web/live/start_live.ex new file mode 100644 index 0000000..efcf3f4 --- /dev/null +++ b/apps/dashboard/lib/dashboard_web/live/start_live.ex @@ -0,0 +1,43 @@ +defmodule DashboardWeb.Live.StartLive do + use DashboardWeb, :component + + def start_parse(assigns) do + ~H""" +

Start Parse

+
+ +
+ <%= case Map.get(assigns, :state).status do %> + <% :init -> %> +

Click on Start to parse CSVs

+ <% :working -> %> +

Analyzing files it may take some time

+ <% :finish -> %> +

The csv sucessfully parsed

+ <% _ -> %> +

There was a problem while parsing

+ + <% end %> + <%= if Map.get(assigns, :state).status != :init do%> + + + + + + + <%= Enum.map(Map.get(assigns, :state).files, fn {_path, file} -> %> + + + + + + <% end) %> +
File name rows_processed row_count
<%= file.name %> <%= file.rows_processed %> <%= file.row_count %>
+ <% end %> + """ + end +end