defmodule Arke do alias Arke.Validator alias Arke.Core.Unit alias Arke.Boundary.{ArkeManager, GroupManager, ParameterManager} alias Arke.Core.Parameter def init() do base_parameters() GroupManager.create(Unit.new(:parameter, %{label: "Parameter", description: "Parameter Group", arke_list: []}, :group, nil, %{}, nil, nil, nil), :arke_system) arke_modules = get_arke_modules() end defp get_arke_modules() do Enum.reduce(:application.loaded_applications(), [], fn {app, _, _}, arke_list -> {:ok, modules} = :application.get_key(app, :modules) module_arke_list = Enum.reduce(modules, [], fn mod, mod_arke_list -> is_arke = Code.ensure_loaded?(mod) and :erlang.function_exported(mod, :arke_from_attr, 0) and mod.arke_from_attr != nil mod_arke_list = check_arke_module(mod, mod_arke_list, is_arke) end) arke_list ++ module_arke_list end) end defp check_arke_module(mod, arke_list, true) do %{id: id, data: data, metadata: metadata} = mod.arke_from_attr unit = Unit.new(id, data, :arke, nil, metadata, nil, nil, mod) ArkeManager.create(unit, :arke_system) Enum.map(mod.groups_from_attr, fn %{id: parent_id, metadata: link_metadata} -> GroupManager.add_link(parent_id, :arke_system, :arke_list, id, link_metadata) end) [mod | arke_list] end defp check_arke_module(_, arke_list, false), do: arke_list defp base_parameter(opts \\ []) do %{ label: Keyword.get(opts, :label), # type: Keyword.get!(opts, :type), format: Keyword.get(opts, :format, :attribute), is_primary: Keyword.get(opts, :is_primary, false), nullable: Keyword.get(opts, :nullable, true), required: Keyword.get(opts, :required, false), persistence: Keyword.get(opts, :persistence, "arke_parameter"), helper_text: Keyword.get(opts, :label, nil), } end defp base_parameters() do id = Unit.new(:id, Map.merge( base_parameter(label: "Id", is_primary: true, nullable: false, required: true, persistence: "table_column"), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: true, default_string: nil}), :string, nil, %{}, nil, nil, nil) arke_id = Unit.new(:arke_id, Map.merge( base_parameter(label: "Arke id", nullable: false, required: true, persistence: "table_column"), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) metadata = Unit.new(:metadata, Map.merge( base_parameter(label: "Metadata", persistence: "table_column"), %{default_dict: %{}}), :dict, nil, %{}, nil, nil, nil) configuration = Unit.new(:configuration, Map.merge( base_parameter(label: "Configuration", persistence: "table_column"), %{default_dict: %{}}), :dict, nil, %{}, nil, nil, nil) inserted_at = Unit.new(:inserted_at, Map.merge( base_parameter(label: "Inserted at", persistence: "table_column"), %{default_date_time: nil}), :date_time, nil, %{}, nil, nil, nil) updated_at = Unit.new(:updated_at, Map.merge( base_parameter(label: "Updated at", persistence: "table_column"), %{default_date_time: nil}), :date_time, nil, %{}, nil, nil, nil) active = Unit.new(:active, Map.merge( base_parameter(label: "Active", nullable: false), %{default_boolean: true}), :boolean, nil, %{}, nil, nil, nil) label = Unit.new(:label, Map.merge( base_parameter(label: "Label", nullable: false, required: true), %{min_length: 2, max_length: 200, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) format = Unit.new(:format, Map.merge( base_parameter(label: "Format", nullable: false), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: false, default_string: "attribute"}), :string, nil, %{}, nil, nil, nil) is_primary = Unit.new(:is_primary, Map.merge( base_parameter(label: "Is Primary", nullable: false), %{default_boolean: false}), :boolean, nil, %{}, nil, nil, nil) nullable = Unit.new(:nullable, Map.merge( base_parameter(label: "Nullable", nullable: false), %{default_boolean: true}), :boolean, nil, %{}, nil, nil, nil) required = Unit.new(:required, Map.merge( base_parameter(label: "Required", nullable: false), %{default_boolean: false}), :boolean, nil, %{}, nil, nil, nil) persistence = Unit.new(:persistence, Map.merge( base_parameter(label: "Persistence", nullable: false), %{min_length: 2, max_length: nil, values: [%{label: "Arke Parameter", value: "arke_parameter"}, %{label: "Table Column", value: "table_column"}], multiple: false, unique: false, default_string: "arke_parameter"}), :string, nil, %{}, nil, nil, nil) helper_text = Unit.new(:helper_text, Map.merge( base_parameter(label: "Helper text", nullable: true), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) min_length = Unit.new(:min_length, Map.merge( base_parameter(label: "Min Length"), %{min: nil, max: nil, values: nil, multiple: false, unique: false, default_integer: nil}), :integer, nil, %{}, nil, nil, nil) max_length = Unit.new(:max_length, Map.merge( base_parameter(label: "Max Length"), %{min: nil, max: nil, values: nil, multiple: false, unique: false, default_integer: nil}), :integer, nil, %{}, nil, nil, nil) values = Unit.new(:values, Map.merge( base_parameter(label: "Values"), %{default_dict: %{}}), :dict, nil, %{}, nil, nil, nil) multiple = Unit.new(:multiple, Map.merge( base_parameter(label: "Multiple", nullable: false), %{default_boolean: false}), :boolean, nil, %{}, nil, nil, nil) unique = Unit.new(:unique, Map.merge( base_parameter(label: "Unique", nullable: false), %{default_boolean: false}), :boolean, nil, %{}, nil, nil, nil) min = Unit.new(:min, Map.merge( base_parameter(label: "Min"), %{min: nil, max: nil, values: nil, multiple: false, unique: false, default_integer: nil}), :integer, nil, %{}, nil, nil, nil) max = Unit.new(:max, Map.merge( base_parameter(label: "Max"), %{min: nil, max: nil, values: nil, multiple: false, unique: false, default_integer: nil}), :integer, nil, %{}, nil, nil, nil) default_integer = Unit.new(:default_integer, Map.merge( base_parameter(label: "Default"), %{min: nil, max: nil, values: nil, multiple: false, unique: false, default_integer: nil}), :integer, nil, %{}, nil, nil, nil) default_float = Unit.new(:default_float, Map.merge( base_parameter(label: "Default"), %{min: nil, max: nil, values: nil, multiple: false, unique: false, default_float: nil}), :float, nil, %{}, nil, nil, nil) default_string = Unit.new(:default_string, Map.merge( base_parameter(label: "Default"), %{min_length: nil, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) default_boolean = Unit.new(:default_boolean, Map.merge( base_parameter(label: "Default"), %{default_boolean: nil}), :boolean, nil, %{}, nil, nil, nil) default_dict = Unit.new(:default_dict, Map.merge( base_parameter(label: "Default"), %{default_dict: nil}), :dict, nil, %{}, nil, nil, nil) default_date = Unit.new(:default_date, Map.merge( base_parameter(label: "Default"), %{default_date: nil}), :date, nil, %{}, nil, nil, nil) default_time = Unit.new(:default_time, Map.merge( base_parameter(label: "Default"), %{default_time: nil}), :time, nil, %{}, nil, nil, nil) default_date_time = Unit.new(:default_date_time, Map.merge( base_parameter(label: "Default"), %{default_date_time: nil}), :date_time, nil, %{}, nil, nil, nil) default_link = Unit.new(:default_link, Map.merge( base_parameter(label: "Default"), %{default_link: []}), :link, nil, %{}, nil, nil, nil) description = Unit.new(:description, Map.merge( base_parameter(label: "Description"), %{min_length: 0, max_length: 500, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) arke_list = Unit.new(:arke_list, Map.merge( base_parameter(label: "Arke List"), %{default_link: []}), :link, nil, %{}, nil, nil, nil) parameters = Unit.new(:parameters, Map.merge( base_parameter(label: "Parameters"), %{default_link: []}), :link, nil, %{}, nil, nil, nil) child_id = Unit.new(:child_id, Map.merge( base_parameter(label: "Child Id"), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) parent_id = Unit.new(:parent_id, Map.merge( base_parameter(label: "Parent Id"), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) type = Unit.new(:type, Map.merge( base_parameter(label: "Type"), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) name = Unit.new(:name, Map.merge( base_parameter(label: "Name"), %{min_length: 2, max_length: 100, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) public_key = Unit.new(:public_key, Map.merge( base_parameter(label: "Public Key"), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) email = Unit.new(:email, Map.merge( base_parameter(label: "Email"), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) vat = Unit.new(:vat, Map.merge( base_parameter(label: "Vat"), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) environment = Unit.new(:environment, Map.merge( base_parameter(label: "Environment"), %{min_length: 2, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) username = Unit.new(:username, Map.merge( base_parameter(label: "Username"), %{min_length: 3, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) password_hash = Unit.new(:password_hash, Map.merge( base_parameter(label: "Password hash"), %{min_length: 3, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) first_name = Unit.new(:first_name, Map.merge( base_parameter(label: "First name"), %{min_length: 3, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) last_name = Unit.new(:last_name, Map.merge( base_parameter(label: "Last name"), %{min_length: 3, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) fiscal_code = Unit.new(:fiscal_code, Map.merge( base_parameter(label: "Fiscal code"), %{min_length: 3, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) address = Unit.new(:address, Map.merge( base_parameter(label: "Address"), %{default_dict: nil}), :dict, nil, %{}, nil, nil, nil) phone_number = Unit.new(:phone_number, Map.merge( base_parameter(label: "Phone number"), %{min_length: 1, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) birth_date = Unit.new(:birth_date, Map.merge( base_parameter(label: "Birth date"), %{min_length: 1, max_length: nil, values: nil, multiple: false, unique: false, default_string: nil}), :string, nil, %{}, nil, nil, nil) first_access = Unit.new(:first_access, Map.merge( base_parameter(label: "First access"), %{default_boolean: true}), :boolean, nil, %{}, nil, nil, nil) last_login = Unit.new(:last_login, Map.merge( base_parameter(label: "Last login", persistence: "table_column"), %{default: nil}), :date_time, nil, %{}, nil, nil, nil) parameters = [id, arke_id, metadata, configuration, inserted_at, updated_at, active, label, format, is_primary, nullable, required, persistence, helper_text, min_length, max_length, values, multiple, unique, min, max, default_integer, default_float, default_string, default_boolean, default_dict, default_date, default_time, default_date_time, description, arke_list, parameters, child_id, parent_id, type, name, public_key, email, vat, environment, username, password_hash, first_name, last_name, fiscal_code, address, phone_number, first_access, last_login, birth_date, default_link ] Enum.map(parameters, fn parameter -> ParameterManager.create(parameter, :arke_system) end) end end