88 lines
2.1 KiB
Go
88 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// Fetch data from NASA Exoplanet API
|
|
func fetchExoplanetData(query string) ([]map[string]interface{}, error) {
|
|
baseURL := "https://exoplanetarchive.ipac.caltech.edu/TAP/sync"
|
|
|
|
params := url.Values{}
|
|
params.Set("query", query)
|
|
params.Set("format", "json")
|
|
|
|
fullURL := baseURL + "?" + params.Encode()
|
|
resp, err := http.Get(fullURL)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("fetch error: %v", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("read error: %v", err)
|
|
}
|
|
|
|
var results []map[string]interface{}
|
|
if err := json.Unmarshal(body, &results); err != nil {
|
|
return nil, fmt.Errorf("unmarshal error: %v", err)
|
|
}
|
|
|
|
return results, nil
|
|
}
|
|
|
|
// Handler: /planets
|
|
func planetsHandler(w http.ResponseWriter, r *http.Request) {
|
|
year := r.URL.Query().Get("year")
|
|
query := "SELECT pl_name, disc_year FROM pscomppars"
|
|
if year != "" {
|
|
query += fmt.Sprintf(" WHERE disc_year = %s", year)
|
|
}
|
|
|
|
results, err := fetchExoplanetData(query)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
// Add inside each handler, before writing the response:
|
|
w.Header().Set("Access-Control-Allow-Origin", "*")
|
|
|
|
writeJSON(w, results)
|
|
}
|
|
|
|
// Handler: /planets/large-radius
|
|
func largeRadiusHandler(w http.ResponseWriter, r *http.Request) {
|
|
query := "SELECT pl_name, pl_radj FROM pscomppars WHERE pl_radj > 5"
|
|
|
|
results, err := fetchExoplanetData(query)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
// Add inside each handler, before writing the response:
|
|
w.Header().Set("Access-Control-Allow-Origin", "*")
|
|
|
|
writeJSON(w, results)
|
|
}
|
|
|
|
// Helper to write JSON response
|
|
func writeJSON(w http.ResponseWriter, data interface{}) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(data)
|
|
}
|
|
|
|
// Main
|
|
func main() {
|
|
http.HandleFunc("/planets", planetsHandler)
|
|
http.HandleFunc("/planets/large-radius", largeRadiusHandler)
|
|
|
|
fmt.Println("Server running at http://localhost:8080")
|
|
log.Fatal(http.ListenAndServe(":8080", nil))
|
|
}
|