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: "member" 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