// Tracker saves info about short URL activities. // GeoIP database can be loaded from // http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz func Tracker(ctx context.Context, cu *trim.CustomURL, addr string) error { c, err := conf.FromContext(ctx) if err != nil { return err } host, _, err := net.SplitHostPort(addr) if err != nil { return err } geo := GeoData{IP: host} record, err := c.GeoDB.City(net.ParseIP(host)) if err != nil { // not critical: skip GeoIP data filling c.L.Error.Println(err) } else { geo.Country = record.Country.Names["en"] geo.City = record.City.Names["en"] geo.Latitude = record.Location.Latitude geo.Longitude = record.Location.Longitude geo.Tz = record.Location.TimeZone } s, err := db.NewSession(c.Conn, true) if err != nil { return err } defer s.Close() coll, err := db.Coll(s, "tracks") if err != nil { return err } err = coll.Insert(bson.M{ "short": cu.String(), "url": cu.Original, "group": cu.Group, "tag": cu.Tag, "geo": geo, "ts": time.Now().UTC(), }) return err }