Files
geoip-rest/internal/geo/resolver_mmdb.go
2025-12-09 13:51:25 +09:00

60 lines
1.0 KiB
Go

package geo
import (
"errors"
"net"
"github.com/oschwald/geoip2-golang"
)
type mmdbResolver struct {
db *geoip2.Reader
}
func newMMDBResolver(dbPath string) (Resolver, error) {
if dbPath == "" {
return nil, errors.New("mmdb path is required")
}
db, err := geoip2.Open(dbPath)
if err != nil {
return nil, err
}
return &mmdbResolver{db: db}, nil
}
func (r *mmdbResolver) Close() error {
return r.db.Close()
}
func (r *mmdbResolver) Lookup(ipStr string) (Location, error) {
ip := net.ParseIP(ipStr)
if ip == nil {
return Location{}, ErrInvalidIP
}
record, err := r.db.City(ip)
if err != nil {
return Location{}, err
}
country := record.Country.Names["en"]
region := ""
if len(record.Subdivisions) > 0 {
region = record.Subdivisions[0].Names["en"]
}
city := record.City.Names["en"]
return Location{
IP: ip.String(),
Country: country,
Region: region,
City: city,
Address: buildAddress(city, region, country),
Latitude: record.Location.Latitude,
Longitude: record.Location.Longitude,
}, nil
}