location-api #4
75
main.go
75
main.go
@ -16,6 +16,7 @@ import (
|
|||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"go.mongodb.org/mongo-driver/bson"
|
"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"
|
||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
"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"`
|
Zip string `json:"Zip"`
|
||||||
}
|
}
|
||||||
err := json.NewDecoder(r.Body).Decode(&request)
|
err := json.NewDecoder(r.Body).Decode(&request)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "Invalid JSON format", http.StatusBadRequest)
|
||||||
|
}
|
||||||
if r.Method != http.MethodPost {
|
if r.Method != http.MethodPost {
|
||||||
http.Error(w, "Only POST method is allowed", http.StatusMethodNotAllowed)
|
http.Error(w, "Only POST method is allowed", http.StatusMethodNotAllowed)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
http.Error(w, "Invalid JSON format", http.StatusBadRequest)
|
|
||||||
}
|
|
||||||
fmt.Println(request)
|
fmt.Println(request)
|
||||||
if request.Zip == "" {
|
if request.Zip == "" {
|
||||||
fmt.Println("Missing or empty zip field")
|
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 {
|
func enableCORS(next http.Handler) http.Handler {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Access-Control-Allow-Origin", "*") // Allow all origins
|
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) {
|
router.HandleFunc("/zipLookup", func(w http.ResponseWriter, r *http.Request) {
|
||||||
getLocByZip(w, r, mongoConn)
|
getLocByZip(w, r, mongoConn)
|
||||||
}).Methods("POST")
|
}).Methods("POST")
|
||||||
|
router.HandleFunc("/parkLookup", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
parkLookup(w, r, mongoConn)
|
||||||
|
}).Methods("POST")
|
||||||
corsRouter := enableCORS(router)
|
corsRouter := enableCORS(router)
|
||||||
|
|
||||||
// Start server and other necessary goroutines
|
// Start server and other necessary goroutines
|
||||||
|
Loading…
Reference in New Issue
Block a user