1+ # This is required so that changesets can be serialized and stored in browser local storage
2+ # We are using only changes on a changeset
3+ defimpl Jason.Encoder , for: Ecto.Changeset do
4+ def encode ( changeset , opts ) do
5+ Jason.Encode . map ( changeset . changes , opts )
6+ end
7+ end
8+
19defmodule DashBoard.Config do
210 use Ecto.Schema
311 import Ecto.Changeset
@@ -37,20 +45,41 @@ defmodule DashBoard.Config do
3745 embeds_many ( :date_time_patterns , DashBoard.DateTimePattern , on_replace: :delete )
3846 end
3947
40- def changeset ( params ) do
48+ def get_defaults do
49+ % __MODULE__ {
50+ db_type: :mysql ,
51+ db_worker_count: 10 ,
52+ drop_existing_tables: false ,
53+ insert_data: true ,
54+ insert_schema: true ,
55+ insertion_chunk_size: 100 ,
56+ log: false ,
57+ ordered: false ,
58+ parse_datetime: true ,
59+ remove_illegal_characters: false ,
60+ schema_infer_chunk_size: 100 ,
61+ varchar_limit: 200 ,
62+ worker_count: System . schedulers_online ( )
63+ }
64+ end
65+
66+ def changeset ( params ) , do: changeset ( % __MODULE__ { } , params )
67+
68+ def changeset ( % __MODULE__ { } = config , params ) do
4169 attrs_to_cast =
4270 :fields
4371 |> __MODULE__ . __schema__ ( )
72+ # Reject nested attributes from cast, they will be loaded via cast_embed/2
4473 |> Enum . reject ( fn
4574 field when field in ~w[ db_attrs date_patterns date_time_patterns] a -> true
4675 _field -> false
4776 end )
4877
4978 changeset =
50- % __MODULE__ { }
79+ config
5180 |> cast ( params , attrs_to_cast )
5281 |> validate_source_directory ( )
53- |> validate_path ( :schema_path )
82+ |> validate_path ( :schema_path , true )
5483 |> cast_embed ( :db_attrs )
5584 |> cast_embed ( :date_patterns )
5685 |> cast_embed ( :date_time_patterns )
@@ -65,14 +94,19 @@ defmodule DashBoard.Config do
6594 |> add_csv_count ( )
6695 end
6796
68- defp validate_path ( changeset , field ) do
69- changeset
70- |> get_change ( field , "" )
71- |> File . dir? ( )
72- |> if (
73- do: changeset ,
74- else: add_error ( changeset , field , "Invalid path, enter a path to a valid directory" )
75- )
97+ defp validate_path ( changeset , field , allow_blank \\ false ) do
98+ value = get_change ( changeset , field , "" )
99+
100+ if allow_blank && value == "" do
101+ changeset
102+ else
103+ value
104+ |> File . dir? ( )
105+ |> if (
106+ do: changeset ,
107+ else: add_error ( changeset , field , "Invalid path, enter a path to a valid directory" )
108+ )
109+ end
76110 end
77111
78112 defp add_csv_count ( % Ecto.Changeset { valid?: true } = changeset ) do
0 commit comments