From 974fc95f2d107c3b0686b9cecbf7ed246eed3a0a Mon Sep 17 00:00:00 2001 From: whysman Date: Mon, 28 Apr 2025 00:10:56 -0400 Subject: [PATCH] added park lookup api --- main.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index 1760190..cf87bb0 100644 --- a/main.go +++ b/main.go @@ -16,6 +16,7 @@ import ( "github.com/gorilla/websocket" "github.com/spf13/viper" "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) @@ -353,15 +354,13 @@ func getLocByZip(w http.ResponseWriter, r *http.Request, mongo *MongoConn) { Zip string `json:"Zip"` } err := json.NewDecoder(r.Body).Decode(&request) - + if err != nil { + http.Error(w, "Invalid JSON format", http.StatusBadRequest) + } if r.Method != http.MethodPost { http.Error(w, "Only POST method is allowed", http.StatusMethodNotAllowed) return } - - if err != nil { - http.Error(w, "Invalid JSON format", http.StatusBadRequest) - } fmt.Println(request) if request.Zip == "" { fmt.Println("Missing or empty zip field") @@ -386,6 +385,69 @@ func getLocByZip(w http.ResponseWriter, r *http.Request, mongo *MongoConn) { } } +func parkLookup(w http.ResponseWriter, r *http.Request, mongo *MongoConn) { + var request struct { + Lat float32 `json:"Lat"` + Lon float32 `json:"Lon"` + Dist float32 `json:"Dist"` + } + err := json.NewDecoder(r.Body).Decode(&request) + if err != nil { + http.Error(w, "Cannot decode request", http.StatusBadRequest) + } + if r.Method != http.MethodPost { + http.Error(w, "Only POST method is allowed", http.StatusMethodNotAllowed) + return + } + log.Println(request.Lat, request.Lon, request.Dist) + + cursor, err := mongo.conn.Database("geodb").Collection("parks"). + Find(ctx, bson.D{{"location", bson.D{{"$near", bson.D{{"$geometry", bson.D{ + {"type", "Point"}, {"coordinates", bson.A{request.Lat, request.Lon}}}}, + {"$minDistance", 0}, {"$maxDistance", request.Dist * 1609.344}}}}}}) + if err != nil { + http.Error(w, "Failed to find parks", http.StatusInternalServerError) + } + if cursor.Err() != nil { + http.Error(w, "Failed to find parks", http.StatusInternalServerError) + } + type Result struct { + Id primitive.ObjectID `bson:"_id"` + Name string `json:"name"` + Address string `json:"address"` + City string `json:"city"` + State string `json:"state"` + Zip string `json:"zip"` + Location struct { + Coordinates []float64 `json:"coordinates"` + } `json:"location"` + } + var totalResult []Result + if cursor.RemainingBatchLength() > 0 { + log.Printf("Found %d parks", cursor.RemainingBatchLength()) + + for cursor.Next(ctx) { + var result Result + log.Printf(cursor.Current.String()) + if err := cursor.Decode(&result); err != nil { + log.Fatal(err) + } + fmt.Printf("%+v\n", result) + totalResult = append(totalResult, result) + } + if err := cursor.Err(); err != nil { + log.Fatal(err) + } + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + err = json.NewEncoder(w).Encode(totalResult) + if err != nil { + http.Error(w, "Failed to encode response", http.StatusInternalServerError) + } + +} + func enableCORS(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") // Allow all origins @@ -418,6 +480,9 @@ func main() { router.HandleFunc("/zipLookup", func(w http.ResponseWriter, r *http.Request) { getLocByZip(w, r, mongoConn) }).Methods("POST") + router.HandleFunc("/parkLookup", func(w http.ResponseWriter, r *http.Request) { + parkLookup(w, r, mongoConn) + }).Methods("POST") corsRouter := enableCORS(router) // Start server and other necessary goroutines