lib/arke.ex

# Copyright 2023 Arkemis S.r.l.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

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,
        Arke.System.BaseGroup
      ),
      :arke_system
    )

    GroupManager.create(
      Unit.new(
        :arke_or_group,
        %{label: "Arke or Group", description: "Arke or Group", arke_list: []},
        :group,
        nil,
        %{},
        nil,
        nil,
        Arke.System.BaseGroup
      ),
      :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 and mod.arke_from_attr.remote == false

          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,
            strip: true
          }
        ),
        :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,
            strip: true
          }
        ),
        :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
      )

    inserted_at =
      Unit.new(
        :inserted_at,
        Map.merge(
          base_parameter(label: "Inserted at", persistence: "table_column"),
          %{default_datetime: nil}
        ),
        :datetime,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    updated_at =
      Unit.new(
        :updated_at,
        Map.merge(
          base_parameter(label: "Updated at", persistence: "table_column"),
          %{default_datetime: nil}
        ),
        :datetime,
        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,
            strip: false,
            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,
            strip: false,
            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,
            strip: false,
            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,
            strip: false,
            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
      )

    strip =
      Unit.new(
        :strip,
        Map.merge(
          base_parameter(label: "Remove Whitespace"),
          %{default_boolean: false}
        ),
        :boolean,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    remote =
      Unit.new(
        :remote,
        Map.merge(
          base_parameter(label: "Remote"),
          %{default_boolean: false}
        ),
        :boolean,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    token =
      Unit.new(
        :token,
        Map.merge(
          base_parameter(label: "Token"),
          %{
            min_length: 3,
            max_length: nil,
            strip: true,
            values: nil,
            multiple: false,
            unique: false,
            default_string: nil
          }
        ),
        :string,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    expiration =
      Unit.new(
        :expiration,
        Map.merge(
          base_parameter(label: "Expiration date"),
          %{default_datetime: nil}
        ),
        :datetime,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    values =
      Unit.new(
        :values,
        Map.merge(
          base_parameter(label: "Values"),
          %{default_list: nil}
        ),
        :list,
        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,
            strip: false,
            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_list =
      Unit.new(
        :default_list,
        Map.merge(
          base_parameter(label: "Default"),
          %{default_list: nil}
        ),
        :list,
        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_datetime =
      Unit.new(
        :default_datetime,
        Map.merge(
          base_parameter(label: "Default"),
          %{default_datetime: nil}
        ),
        :datetime,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    default_link =
      Unit.new(
        :default_link,
        Map.merge(
          base_parameter(label: "Default"),
          %{
            default_link: nil,
            multiple: false,
            arke_or_group_id: "arke",
            depth: 0,
            connection_type: "link",
            filter_keys: ["arke_id", "id"],
            direction: "child"
          }
        ),
        :link,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    default_dynamic =
      Unit.new(
        :default_dynamic,
        Map.merge(
          base_parameter(label: "Default"),
          %{default_dynamic: nil}
        ),
        :dynamic,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    default_binary =
      Unit.new(
        :default_binary,
        Map.merge(
          base_parameter(label: "Default"),
          %{default_binary: nil}
        ),
        :binary,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    description =
      Unit.new(
        :description,
        Map.merge(
          base_parameter(label: "Description"),
          %{
            min_length: 0,
            max_length: 500,
            strip: false,
            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: [],
            multiple: true,
            filter_keys: ["arke_id", "id"],
            connection_type: "group",
            arke_or_group_id: "arke",
            depth: 0,
            direction: "child"
          }
        ),
        :link,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    parameters =
      Unit.new(
        :parameters,
        Map.merge(
          base_parameter(label: "Parameters"),
          %{
            default_link: [],
            depth: 0,
            connection_type: "link",
            multiple: false,
            direction: "child"
          }
        ),
        :link,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    child_id =
      Unit.new(
        :child_id,
        Map.merge(
          base_parameter(label: "Child Id"),
          %{
            min_length: 2,
            max_length: nil,
            strip: true,
            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,
            strip: true,
            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,
            strip: true,
            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,
            strip: false,
            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,
            strip: false,
            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,
            strip: true,
            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,
            strip: false,
            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,
            strip: false,
            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,
            strip: false,
            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,
            strip: false,
            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,
            strip: false,
            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,
            strip: false,
            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,
            strip: false,
            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,
            strip: false,
            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,
            strip: false,
            values: nil,
            multiple: false,
            unique: false,
            default_string: nil
          }
        ),
        :string,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    user_id =
      Unit.new(
        :user_id,
        Map.merge(
          base_parameter(label: "Unit id"),
          %{
            min_length: 1,
            max_length: nil,
            strip: true,
            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_datetime: nil}
        ),
        :datetime,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    connection_type =
      Unit.new(
        :connection_type,
        Map.merge(
          base_parameter(label: "Connection type"),
          %{
            min_length: 1,
            max_length: nil,
            strip: true,
            values: nil,
            multiple: false,
            unique: false,
            default_string: "link"
          }
        ),
        :string,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    direction =
      Unit.new(
        :direction,
        Map.merge(
          base_parameter(label: "Direction"),
          %{
            min_length: 1,
            max_length: nil,
            strip: true,
            values: [
              %{label: "Child", value: "child"},
              %{label: "Parent", value: "parent"}
            ],
            multiple: false,
            unique: false,
            default_string: "child"
          }
        ),
        :string,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    depth =
      Unit.new(
        :depth,
        Map.merge(
          base_parameter(label: "Depth"),
          %{min: 0, max: 100, values: nil, multiple: false, unique: false, default_integer: 0}
        ),
        :integer,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    arke_or_group_id =
      Unit.new(
        :arke_or_group_id,
        Map.merge(base_parameter(label: "Arke or Group id", required: true), %{
          default_link: nil,
          multiple: false,
          arke_or_group_id: "arke_or_group",
          depth: 0,
          connection_type: "link",
          filter_keys: ["id", "label"],
          direction: "child"
        }),
        :link,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    filter_keys =
      Unit.new(
        :filter_keys,
        Map.merge(
          base_parameter(label: "Filter keys"),
          %{
            min_length: nil,
            max_length: nil,
            strip: false,
            values: nil,
            multiple: true,
            unique: false,
            default_string: []
          }
        ),
        :string,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    only_run_time =
      Unit.new(
        :only_run_time,
        Map.merge(
          base_parameter(label: "Only run time"),
          %{default_boolean: false}
        ),
        :boolean,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    path =
      Unit.new(
        :path,
        Map.merge(
          base_parameter(label: "Path"),
          %{
            min_length: nil,
            max_length: nil,
            strip: false,
            values: nil,
            multiple: false,
            unique: false,
            default_string: ""
          }
        ),
        :string,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    provider =
      Unit.new(
        :provider,
        Map.merge(
          base_parameter(label: "Provider"),
          %{
            min_length: nil,
            max_length: nil,
            strip: false,
            values: ["local", "gcloud", "aws"],
            multiple: false,
            unique: false,
            default_string: "gcloud"
          }
        ),
        :string,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    extension =
      Unit.new(
        :extension,
        Map.merge(
          base_parameter(label: "Extension"),
          %{
            min_length: nil,
            max_length: nil,
            strip: false,
            values: nil,
            multiple: false,
            unique: false,
            default_string: ""
          }
        ),
        :string,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    binary =
      Unit.new(
        :binary,
        Map.merge(
          base_parameter(label: "Binary"),
          %{default_binary: nil}
        ),
        :binary,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    size =
      Unit.new(
        :size,
        Map.merge(
          base_parameter(label: "Size"),
          %{min: 0, max: nil, values: nil, multiple: false, unique: false, default_float: nil}
        ),
        :float,
        nil,
        %{},
        nil,
        nil,
        nil
      )

    parameters = [
      id,
      arke_id,
      metadata,
      inserted_at,
      updated_at,
      active,
      label,
      format,
      is_primary,
      nullable,
      required,
      persistence,
      helper_text,
      strip,
      remote,
      min_length,
      max_length,
      values,
      multiple,
      unique,
      min,
      max,
      default_integer,
      default_float,
      default_string,
      default_boolean,
      default_dict,
      default_list,
      default_date,
      default_time,
      default_datetime,
      default_dynamic,
      default_binary,
      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,
      connection_type,
      direction,
      depth,
      arke_or_group_id,
      filter_keys,
      only_run_time,
      path,
      provider,
      extension,
      binary,
      size,
      expiration,
      token,
      user_id
    ]

    Enum.map(parameters, fn parameter ->
      ParameterManager.create(parameter, :arke_system)
    end)
  end
end