defmodule ToweropsWeb.GraphQL.Schema do @moduledoc """ GraphQL schema for the TowerOps API. Provides a complete GraphQL interface for managing devices, sites, alerts, agents, organization settings, members, integrations, and activity feeds. """ use Absinthe.Schema import_types(ToweropsWeb.GraphQL.Types.Common) import_types(ToweropsWeb.GraphQL.Types.Device) import_types(ToweropsWeb.GraphQL.Types.Site) import_types(ToweropsWeb.GraphQL.Types.Alert) import_types(ToweropsWeb.GraphQL.Types.Agent) import_types(ToweropsWeb.GraphQL.Types.Organization) import_types(ToweropsWeb.GraphQL.Types.Member) import_types(ToweropsWeb.GraphQL.Types.Integration) import_types(ToweropsWeb.GraphQL.Types.Activity) query do # Devices field :devices, list_of(:device) do arg(:site_id, :id) arg(:status, :string) arg(:limit, :integer, default_value: 100) resolve(&ToweropsWeb.GraphQL.Resolvers.Device.list/3) end field :device, :device do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Device.get/3) end # Sites field :sites, list_of(:site) do resolve(&ToweropsWeb.GraphQL.Resolvers.Site.list/3) end field :site, :site do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Site.get/3) end # Alerts field :alerts, list_of(:alert) do arg(:status, :string) arg(:device_id, :id) arg(:limit, :integer, default_value: 100) resolve(&ToweropsWeb.GraphQL.Resolvers.Alert.list/3) end field :alert, :alert do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Alert.get/3) end # Agents field :agents, list_of(:agent) do resolve(&ToweropsWeb.GraphQL.Resolvers.Agent.list/3) end field :agent, :agent do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Agent.get/3) end # Organization field :organization, :organization do resolve(&ToweropsWeb.GraphQL.Resolvers.Organization.get/3) end # Members field :members, list_of(:member) do resolve(&ToweropsWeb.GraphQL.Resolvers.Member.list/3) end # Integrations field :integrations, list_of(:integration) do resolve(&ToweropsWeb.GraphQL.Resolvers.Integration.list/3) end # Activity feed field :activity, list_of(:activity_item) do arg(:limit, :integer, default_value: 50) arg(:type, :string) resolve(&ToweropsWeb.GraphQL.Resolvers.Activity.list/3) end # Device metrics field :device_metrics, list_of(:metric_point) do arg(:device_id, non_null(:id)) arg(:sensor_type, :string) arg(:time_range, :string, default_value: "24h") resolve(&ToweropsWeb.GraphQL.Resolvers.Device.metrics/3) end # Device interfaces field :device_interfaces, list_of(:interface) do arg(:device_id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Device.interfaces/3) end end mutation do # Device CRUD field :create_device, :device do arg(:input, non_null(:device_input)) resolve(&ToweropsWeb.GraphQL.Resolvers.Device.create/3) end field :update_device, :device do arg(:id, non_null(:id)) arg(:input, non_null(:device_input)) resolve(&ToweropsWeb.GraphQL.Resolvers.Device.update/3) end field :delete_device, :delete_result do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Device.delete/3) end # Site CRUD field :create_site, :site do arg(:input, non_null(:site_input)) resolve(&ToweropsWeb.GraphQL.Resolvers.Site.create/3) end field :update_site, :site do arg(:id, non_null(:id)) arg(:input, non_null(:site_input)) resolve(&ToweropsWeb.GraphQL.Resolvers.Site.update/3) end field :delete_site, :delete_result do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Site.delete/3) end # Alert actions field :acknowledge_alert, :alert do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Alert.acknowledge/3) end field :resolve_alert, :alert do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Alert.resolve_alert/3) end # Agent management field :create_agent, :agent_with_token do arg(:name, non_null(:string)) resolve(&ToweropsWeb.GraphQL.Resolvers.Agent.create/3) end field :delete_agent, :delete_result do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Agent.delete/3) end # Organization settings field :update_organization, :organization do arg(:input, non_null(:organization_input)) resolve(&ToweropsWeb.GraphQL.Resolvers.Organization.update/3) end # Member management field :send_invitation, :invitation do arg(:email, non_null(:string)) arg(:role, :string, default_value: "technician") resolve(&ToweropsWeb.GraphQL.Resolvers.Member.invite/3) end field :cancel_invitation, :delete_result do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Member.cancel_invitation/3) end field :remove_member, :delete_result do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Member.remove/3) end field :update_member_role, :member do arg(:id, non_null(:id)) arg(:role, non_null(:string)) resolve(&ToweropsWeb.GraphQL.Resolvers.Member.update_role/3) end # Integrations field :create_integration, :integration do arg(:input, non_null(:integration_input)) resolve(&ToweropsWeb.GraphQL.Resolvers.Integration.create/3) end field :update_integration, :integration do arg(:id, non_null(:id)) arg(:input, non_null(:integration_input)) resolve(&ToweropsWeb.GraphQL.Resolvers.Integration.update/3) end field :delete_integration, :delete_result do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Integration.delete/3) end field :test_integration, :test_result do arg(:id, non_null(:id)) resolve(&ToweropsWeb.GraphQL.Resolvers.Integration.test_connection/3) end end end