defmodule ToweropsWeb.Api.V1.OrganizationController do @moduledoc "API controller for current organization settings." use ToweropsWeb, :controller alias Towerops.Organizations def show(conn, _params) do organization_id = conn.assigns.current_organization_id org = Organizations.get_organization!(organization_id) json(conn, %{data: format_org(org)}) end def update(conn, %{"organization" => attrs}) do organization_id = conn.assigns.current_organization_id org = Organizations.get_organization!(organization_id) case Organizations.update_organization(org, attrs) do {:ok, updated} -> json(conn, %{data: format_org(updated)}) {:error, changeset} -> conn |> put_status(:unprocessable_entity) |> json(%{errors: translate_errors(changeset)}) end end def update(conn, _params) do conn |> put_status(:bad_request) |> json(%{error: "Missing 'organization' parameter"}) end defp format_org(org) do %{ id: org.id, name: org.name, slug: org.slug, subscription_plan: org.subscription_plan, use_sites: org.use_sites, snmp_version: org.snmp_version, snmp_community: org.snmp_community, snmp_port: org.snmp_port, snmp_transport: org.snmp_transport, snmpv3_security_level: org.snmpv3_security_level, snmpv3_username: org.snmpv3_username, snmpv3_auth_protocol: org.snmpv3_auth_protocol, snmpv3_priv_protocol: org.snmpv3_priv_protocol, mikrotik_enabled: org.mikrotik_enabled, mikrotik_username: org.mikrotik_username, mikrotik_port: org.mikrotik_port, mikrotik_ssh_port: org.mikrotik_ssh_port, mikrotik_use_ssl: org.mikrotik_use_ssl, default_agent_token_id: org.default_agent_token_id, inserted_at: org.inserted_at, updated_at: org.updated_at } end defp translate_errors(changeset) do Ecto.Changeset.traverse_errors(changeset, fn {msg, opts} -> Regex.replace(~r"%{(\w+)}", msg, fn _, key -> if String.length(key) <= 50 and String.match?(key, ~r/^[a-z_]+$/) do opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string() else key end end) end) end end