package dashboard import "time" // Wire shapes for control-api's /api/v1/admin/* surface, defined locally // rather than importing internal/httpapi's (unexported) DTOs or // internal/db's models — the same "each binary owns the wire shapes it // needs" pattern already used by internal/probercore and internal/agentcore. // // The read-only list/detail endpoints (ipQueueItem, validator, check, // event below) mirror internal/db model structs field-for-field: those // endpoints marshal Go structs with no json tags, so encoding/json matches // fields by name (case-insensitively) with no tags needed here either. // Everything else mirrors internal/httpapi/dto_admin.go's snake_case tags. type statusResponse struct { TotalIPs int `json:"total_ips"` IPsByState map[string]int `json:"ips_by_state"` TotalValidators int `json:"total_validators"` } type ipQueueItem struct { ID int64 IPAddress string Sequence int State string OwnerValidatorID *string FIPID string AttemptNumber int RetryCount int LeaseExpiresAt *time.Time EgressComplete bool OverallResult string AssignedAt *time.Time FIPAssociatedAt *time.Time AggregatedAt *time.Time FIPReleasedAt *time.Time CreatedAt time.Time UpdatedAt time.Time } type check struct { ID int64 IPID int64 IPAddress string AttemptNumber int ValidatorID string Source string CheckType string Target string Success bool LatencyMS int64 Detail string CheckedAt time.Time } type event struct { ID int64 SourceType string SourceID string IPID *int64 EventType string Payload string OccurredAt time.Time } type ipDetailResponse struct { IP ipQueueItem `json:"ip"` Checks []check `json:"checks"` Events []event `json:"events"` } type validator struct { ValidatorID string Hostname string OSPortID string State string CurrentIPID *int64 AgentVersion string LastHeartbeatAt *time.Time } type submitIPsResponse struct { Added []string `json:"added"` Requeued []string `json:"requeued"` Reordered []string `json:"reordered"` SkippedInProgress []string `json:"skipped_in_progress"` } type deleteIPsResponse struct { Deleted []string `json:"deleted"` NotFound []string `json:"not_found"` } type clearQueueResponse struct { Deleted []string `json:"deleted"` } type validatorDTO struct { ValidatorID string `json:"validator_id"` OSPortID string `json:"os_port_id"` State string `json:"state"` } type siteDTO struct { Index int `json:"index"` SiteID string `json:"site_id"` Hostname string `json:"hostname"` State string `json:"state"` LastHeartbeatAt *time.Time `json:"last_heartbeat_at"` } type targetGroupDTO struct { Name string `json:"name"` Targets []string `json:"targets"` } type checkTypeDTO struct { Name string `json:"name"` Enabled bool `json:"enabled"` Targets []string `json:"targets"` } type errorResponse struct { Error string `json:"error"` } type orchestratorSettingsDTO struct { FIPSettleSeconds int `json:"fip_settle_seconds"` } type inboundChecksDTO struct { Ports []int `json:"ports"` ICMP bool `json:"icmp"` }