diff --git a/lib/towerops_web/controllers/api/v1/devices_controller.ex b/lib/towerops_web/controllers/api/v1/devices_controller.ex index 6b456e86..20a9d276 100644 --- a/lib/towerops_web/controllers/api/v1/devices_controller.ex +++ b/lib/towerops_web/controllers/api/v1/devices_controller.ex @@ -88,37 +88,11 @@ defmodule ToweropsWeb.Api.V1.DevicesController do organization_id = conn.assigns.current_organization_id current_user = conn.assigns[:current_user] - # Default organization_id to authenticated org if not provided or empty - device_params = - case Map.get(device_params, "organization_id") do - nil -> Map.put(device_params, "organization_id", organization_id) - "" -> Map.put(device_params, "organization_id", organization_id) - _provided_id -> device_params - end + device_params = default_organization_id(device_params, organization_id) - # Verify site belongs to organization if site_id is provided case verify_site_access(device_params["site_id"], organization_id) do :ok -> - # Superusers bypass device quota limits - opts = if current_user && current_user.is_superuser, do: [bypass_limits: true], else: [] - - case Devices.create_device(device_params, opts) do - {:ok, device} -> - # Trigger SNMP discovery if enabled - _ = - if device.snmp_enabled do - DiscoveryWorker.enqueue(device.id) - end - - conn - |> put_status(:created) - |> json(format_device(device)) - - {:error, %Ecto.Changeset{} = changeset} -> - conn - |> put_status(:unprocessable_entity) - |> json(%{errors: translate_errors(changeset)}) - end + create_and_discover_device(conn, device_params, current_user) {:error, reason} -> conn @@ -265,6 +239,38 @@ defmodule ToweropsWeb.Api.V1.DevicesController do # Private helpers + defp default_organization_id(device_params, organization_id) do + case Map.get(device_params, "organization_id") do + nil -> Map.put(device_params, "organization_id", organization_id) + "" -> Map.put(device_params, "organization_id", organization_id) + _provided_id -> device_params + end + end + + defp create_and_discover_device(conn, device_params, current_user) do + opts = if current_user && current_user.is_superuser, do: [bypass_limits: true], else: [] + + case Devices.create_device(device_params, opts) do + {:ok, device} -> + maybe_enqueue_discovery(device) + + conn + |> put_status(:created) + |> json(format_device(device)) + + {:error, %Ecto.Changeset{} = changeset} -> + conn + |> put_status(:unprocessable_entity) + |> json(%{errors: translate_errors(changeset)}) + end + end + + defp maybe_enqueue_discovery(device) do + if device.snmp_enabled do + DiscoveryWorker.enqueue(device.id) + end + end + defp verify_site_access(nil, _organization_id), do: :ok defp verify_site_access(site_id, organization_id) do diff --git a/lib/towerops_web/live/device_live/index.ex b/lib/towerops_web/live/device_live/index.ex index 32682b3a..2dfb6bb8 100644 --- a/lib/towerops_web/live/device_live/index.ex +++ b/lib/towerops_web/live/device_live/index.ex @@ -25,6 +25,7 @@ defmodule ToweropsWeb.DeviceLive.Index do |> assign(:timezone, socket.assigns.current_scope.timezone) |> assign(:device, device) |> assign(:grouped_devices, grouped_devices) + |> assign(:sites_enabled, organization.use_sites) |> assign(:has_sites, sites != []) |> assign(:reorder_mode, false) |> assign(:device_quota, %{current: current, limit: limit})} diff --git a/lib/towerops_web/live/device_live/index.html.heex b/lib/towerops_web/live/device_live/index.html.heex index 2657b652..f2572055 100644 --- a/lib/towerops_web/live/device_live/index.html.heex +++ b/lib/towerops_web/live/device_live/index.html.heex @@ -79,7 +79,7 @@ <% end %> <.button - :if={@has_sites} + :if={!@sites_enabled || @has_sites} navigate={~p"/devices/new"} variant="primary" > @@ -137,227 +137,229 @@ <%= case @active_tab do %> <% "existing" -> %> - <%= if !@has_sites do %> + <%= if @sites_enabled && !@has_sites && @grouped_devices != [] do %> +
+ Sites help you organize devices by physical location. Create a site to assign your devices and keep things organized. +
+- Before adding device, you need to create at least one site location. -
-- Sites help you organize your devices by physical location. + Get started by adding your first device.
- Get started by adding your first device. -
-|
+
+
+
+ <% end %>
+
+
| |||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|