mirror of https://github.com/chaitin/PandaWiki.git
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package ipdb
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
|
|
"github.com/chaitin/panda-wiki/domain"
|
|
"github.com/chaitin/panda-wiki/log"
|
|
"github.com/chaitin/panda-wiki/store/ipdb"
|
|
"github.com/chaitin/panda-wiki/utils"
|
|
)
|
|
|
|
type IPAddressRepo struct {
|
|
ipdb *ipdb.IPDB
|
|
logger *log.Logger
|
|
}
|
|
|
|
func NewIPAddressRepo(ipdb *ipdb.IPDB, logger *log.Logger) *IPAddressRepo {
|
|
return &IPAddressRepo{ipdb: ipdb, logger: logger.WithModule("repo.ipdb.ip_addr")}
|
|
}
|
|
|
|
func (r *IPAddressRepo) GetIPAddress(ctx context.Context, ip string) (*domain.IPAddress, error) {
|
|
if ip == "" || net.ParseIP(ip) == nil {
|
|
return &domain.IPAddress{
|
|
IP: ip,
|
|
Country: "无效地址",
|
|
Province: "无效地址",
|
|
City: "无效地址",
|
|
}, nil
|
|
}
|
|
if utils.IsPrivateOrReservedIP(ip) {
|
|
return &domain.IPAddress{
|
|
IP: ip,
|
|
Country: "保留地址",
|
|
Province: "保留地址",
|
|
City: "保留地址",
|
|
}, nil
|
|
}
|
|
info, err := r.ipdb.Lookup(ip)
|
|
if err != nil {
|
|
r.logger.Error("failed to lookup ip address", log.Any("error", err), log.String("ip", ip))
|
|
return &domain.IPAddress{
|
|
IP: ip,
|
|
Country: "未知地址",
|
|
Province: "未知地址",
|
|
City: "未知地址",
|
|
}, nil
|
|
}
|
|
return info, nil
|
|
}
|
|
|
|
func (r *IPAddressRepo) GetIPAddresses(ctx context.Context, ips []string) (map[string]*domain.IPAddress, error) {
|
|
ipAddresses := make(map[string]*domain.IPAddress, len(ips))
|
|
for _, ip := range ips {
|
|
info, err := r.GetIPAddress(ctx, ip)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ipAddresses[ip] = info
|
|
}
|
|
return ipAddresses, nil
|
|
}
|