pdbcompat

package
v1.8.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 26, 2026 License: BSD-3-Clause Imports: 27 Imported by: 0

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

View Source
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

View Source
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

func ParseFilters(params url.Values, fields map[string]FieldType) ([]func(*sql.Selector), error)

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

func ParsePaginationParams(params url.Values) (limit, skip int)

ParsePaginationParams extracts limit and skip from query parameters with defaults and bounds per D-16, D-21.

func ParseSinceParam

func ParseSinceParam(params url.Values) (*time.Time, error)

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 GetFunc

type GetFunc func(ctx context.Context, client *ent.Client, id int, depth int) (any, error)

GetFunc queries a single entity by ID and returns its serialized form.

type Handler

type Handler struct {
	// contains filtered or unexported fields
}

Handler serves PeeringDB-compatible API endpoints.

func NewHandler

func NewHandler(client *ent.Client) *Handler

NewHandler creates a Handler for PeeringDB-compatible API endpoints.

func (*Handler) Register

func (h *Handler) Register(mux *http.ServeMux)

Register sets up PeeringDB-compatible routes on the given mux. Routes follow PeeringDB's URL patterns: /api/{type}, /api/{type}/{id}. Both with and without trailing slash variants are handled per D-02. The index endpoint at /api/ lists all available types per D-17.

type ListFunc

type ListFunc func(ctx context.Context, client *ent.Client, opts QueryOptions) ([]any, int, error)

ListFunc queries entities and returns serialized objects plus total count.

type QueryOptions

type QueryOptions struct {
	Filters []func(*sql.Selector)
	Limit   int
	Skip    int
	Since   *time.Time
	Search  string   // ?q= parameter
	Fields  []string // ?fields= parameter
	Depth   int      // depth parameter (only used on detail)
}

QueryOptions holds parsed query parameters for list endpoints.

type TypeConfig

type TypeConfig struct {
	Name         string
	Fields       map[string]FieldType
	SearchFields []string
	List         ListFunc
	Get          GetFunc
}

TypeConfig describes a PeeringDB object type for the compatibility layer.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL