Documentation
¶
Overview ¶
Package pdbcompat provides a PeeringDB-compatible REST API layer that translates Django-style query parameters to ent predicates and serializes ent entities to PeeringDB's exact JSON response format.
Index ¶
- Constants
- Variables
- func ParseFilters(params url.Values, fields map[string]FieldType) ([]func(*sql.Selector), error)
- func ParsePaginationParams(params url.Values) (limit, skip int)
- func ParseSinceParam(params url.Values) (*time.Time, error)
- func WriteError(w http.ResponseWriter, status int, message string)
- func WriteResponse(w http.ResponseWriter, data any)
- type FieldType
- type GetFunc
- type Handler
- type ListFunc
- type QueryOptions
- type TypeConfig
Constants ¶
const ( // DefaultLimit is the default page size for list endpoints. DefaultLimit = 250 // MaxLimit is the maximum allowed page size per D-21. MaxLimit = 1000 )
Variables ¶
var Registry = map[string]TypeConfig{ peeringdb.TypeOrg: { Name: peeringdb.TypeOrg, Fields: map[string]FieldType{ "id": FieldInt, "name": FieldString, "aka": FieldString, "name_long": FieldString, "website": FieldString, "notes": FieldString, "logo": FieldString, "address1": FieldString, "address2": FieldString, "city": FieldString, "state": FieldString, "country": FieldString, "zipcode": FieldString, "suite": FieldString, "floor": FieldString, "latitude": FieldFloat, "longitude": FieldFloat, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name", "aka", "name_long"}, }, peeringdb.TypeNet: { Name: peeringdb.TypeNet, Fields: map[string]FieldType{ "id": FieldInt, "org_id": FieldInt, "name": FieldString, "aka": FieldString, "name_long": FieldString, "website": FieldString, "asn": FieldInt, "looking_glass": FieldString, "route_server": FieldString, "irr_as_set": FieldString, "info_type": FieldString, "info_prefixes4": FieldInt, "info_prefixes6": FieldInt, "info_traffic": FieldString, "info_ratio": FieldString, "info_scope": FieldString, "info_unicast": FieldBool, "info_multicast": FieldBool, "info_ipv6": FieldBool, "info_never_via_route_servers": FieldBool, "notes": FieldString, "policy_url": FieldString, "policy_general": FieldString, "policy_locations": FieldString, "policy_ratio": FieldBool, "policy_contracts": FieldString, "allow_ixp_update": FieldBool, "status_dashboard": FieldString, "rir_status": FieldString, "rir_status_updated": FieldTime, "logo": FieldString, "ix_count": FieldInt, "fac_count": FieldInt, "netixlan_updated": FieldTime, "netfac_updated": FieldTime, "poc_updated": FieldTime, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name", "aka", "name_long", "irr_as_set"}, }, peeringdb.TypeFac: { Name: peeringdb.TypeFac, Fields: map[string]FieldType{ "id": FieldInt, "org_id": FieldInt, "org_name": FieldString, "campus_id": FieldInt, "name": FieldString, "aka": FieldString, "name_long": FieldString, "website": FieldString, "clli": FieldString, "rencode": FieldString, "npanxx": FieldString, "tech_email": FieldString, "tech_phone": FieldString, "sales_email": FieldString, "sales_phone": FieldString, "property": FieldString, "diverse_serving_substations": FieldBool, "notes": FieldString, "region_continent": FieldString, "status_dashboard": FieldString, "logo": FieldString, "net_count": FieldInt, "ix_count": FieldInt, "carrier_count": FieldInt, "address1": FieldString, "address2": FieldString, "city": FieldString, "state": FieldString, "country": FieldString, "zipcode": FieldString, "suite": FieldString, "floor": FieldString, "latitude": FieldFloat, "longitude": FieldFloat, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name", "aka", "name_long", "city", "country"}, }, peeringdb.TypeIX: { Name: peeringdb.TypeIX, Fields: map[string]FieldType{ "id": FieldInt, "org_id": FieldInt, "name": FieldString, "aka": FieldString, "name_long": FieldString, "city": FieldString, "country": FieldString, "region_continent": FieldString, "media": FieldString, "notes": FieldString, "proto_unicast": FieldBool, "proto_multicast": FieldBool, "proto_ipv6": FieldBool, "website": FieldString, "url_stats": FieldString, "tech_email": FieldString, "tech_phone": FieldString, "policy_email": FieldString, "policy_phone": FieldString, "sales_email": FieldString, "sales_phone": FieldString, "net_count": FieldInt, "fac_count": FieldInt, "ixf_net_count": FieldInt, "ixf_last_import": FieldTime, "ixf_import_request": FieldString, "ixf_import_request_status": FieldString, "service_level": FieldString, "terms": FieldString, "status_dashboard": FieldString, "logo": FieldString, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name", "aka", "name_long", "city", "country"}, }, peeringdb.TypePoc: { Name: peeringdb.TypePoc, Fields: map[string]FieldType{ "id": FieldInt, "net_id": FieldInt, "role": FieldString, "visible": FieldString, "name": FieldString, "phone": FieldString, "email": FieldString, "url": FieldString, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name", "email"}, }, peeringdb.TypeIXLan: { Name: peeringdb.TypeIXLan, Fields: map[string]FieldType{ "id": FieldInt, "ix_id": FieldInt, "name": FieldString, "descr": FieldString, "mtu": FieldInt, "dot1q_support": FieldBool, "rs_asn": FieldInt, "arp_sponge": FieldString, "ixf_ixp_member_list_url_visible": FieldString, "ixf_ixp_import_enabled": FieldBool, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name", "descr"}, }, peeringdb.TypeIXPfx: { Name: peeringdb.TypeIXPfx, Fields: map[string]FieldType{ "id": FieldInt, "ixlan_id": FieldInt, "protocol": FieldString, "prefix": FieldString, "in_dfz": FieldBool, "notes": FieldString, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"prefix"}, }, peeringdb.TypeNetIXLan: { Name: peeringdb.TypeNetIXLan, Fields: map[string]FieldType{ "id": FieldInt, "net_id": FieldInt, "ix_id": FieldInt, "ixlan_id": FieldInt, "name": FieldString, "notes": FieldString, "speed": FieldInt, "asn": FieldInt, "ipaddr4": FieldString, "ipaddr6": FieldString, "is_rs_peer": FieldBool, "bfd_support": FieldBool, "operational": FieldBool, "net_side_id": FieldInt, "ix_side_id": FieldInt, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name"}, }, peeringdb.TypeNetFac: { Name: peeringdb.TypeNetFac, Fields: map[string]FieldType{ "id": FieldInt, "net_id": FieldInt, "fac_id": FieldInt, "name": FieldString, "city": FieldString, "country": FieldString, "local_asn": FieldInt, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name"}, }, peeringdb.TypeIXFac: { Name: peeringdb.TypeIXFac, Fields: map[string]FieldType{ "id": FieldInt, "ix_id": FieldInt, "fac_id": FieldInt, "name": FieldString, "city": FieldString, "country": FieldString, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name"}, }, peeringdb.TypeCarrier: { Name: peeringdb.TypeCarrier, Fields: map[string]FieldType{ "id": FieldInt, "org_id": FieldInt, "org_name": FieldString, "name": FieldString, "aka": FieldString, "name_long": FieldString, "website": FieldString, "notes": FieldString, "fac_count": FieldInt, "logo": FieldString, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name", "aka", "name_long"}, }, peeringdb.TypeCarrierFac: { Name: peeringdb.TypeCarrierFac, Fields: map[string]FieldType{ "id": FieldInt, "carrier_id": FieldInt, "fac_id": FieldInt, "name": FieldString, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name"}, }, peeringdb.TypeCampus: { Name: peeringdb.TypeCampus, Fields: map[string]FieldType{ "id": FieldInt, "org_id": FieldInt, "org_name": FieldString, "name": FieldString, "name_long": FieldString, "aka": FieldString, "website": FieldString, "notes": FieldString, "country": FieldString, "city": FieldString, "zipcode": FieldString, "state": FieldString, "logo": FieldString, "created": FieldTime, "updated": FieldTime, "status": FieldString, }, SearchFields: []string{"name"}, }, }
Registry maps PeeringDB type name strings to their TypeConfig. List and Get functions are nil until serializers are wired up.
Functions ¶
func ParseFilters ¶
ParseFilters translates Django-style query parameters into ent sql.Selector predicates. Reserved parameters (limit, skip, etc.) are skipped. Unknown fields are silently ignored per D-20. Returns an error only for known fields with unsupported operators.
func ParsePaginationParams ¶
ParsePaginationParams extracts limit and skip from query parameters with defaults and bounds per D-16, D-21.
func ParseSinceParam ¶
ParseSinceParam parses the ?since= query parameter as a Unix timestamp per D-15. Returns nil if the parameter is absent or empty.
func WriteError ¶
func WriteError(w http.ResponseWriter, status int, message string)
WriteError writes a PeeringDB-compatible error response with the standard error envelope format per D-24.
func WriteResponse ¶
func WriteResponse(w http.ResponseWriter, data any)
WriteResponse writes a successful PeeringDB-compatible JSON response with the standard envelope format per D-04. Data must be a slice.
Types ¶
type FieldType ¶
type FieldType int
FieldType represents the data type of a filterable field.
const ( // FieldString indicates a string-typed field. FieldString FieldType = iota // FieldInt indicates an integer-typed field. FieldInt // FieldBool indicates a boolean-typed field. FieldBool // FieldTime indicates a time.Time-typed field. FieldTime // FieldFloat indicates a float64-typed field. FieldFloat )
type Handler ¶
type Handler struct {
// contains filtered or unexported fields
}
Handler serves PeeringDB-compatible API endpoints.
func NewHandler ¶
NewHandler creates a Handler for PeeringDB-compatible API endpoints.