package main import ( "database/sql" "encoding/json" "fmt" "log" "net/http" _ "github.com/lib/pq" ) const ( host = "45.79.210.141" port = 5432 user = "postgres" password = "shae3Hai.dot" dbname = "diegodb" ) type Jedi struct { Name string `json:"name"` Color string `json:"color"` Era string `json:"era"` } func main() { http.HandleFunc("/create", createJedi) http.HandleFunc("/retrieve", retrieveJedi) http.HandleFunc("/delete", deleteJedi) http.HandleFunc("/list", listJedi) log.Fatal(http.ListenAndServe(":8080", nil)) } func createJedi(w http.ResponseWriter, r *http.Request) { var jedi Jedi err := json.NewDecoder(r.Body).Decode(&jedi) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } db, err := sql.Open("postgres", fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer db.Close() sqlStatement := ` INSERT INTO sables_de_luz (jedi, color, era) VALUES ($1, $2, $3)` _, err = db.Exec(sqlStatement, jedi.Name, jedi.Color, jedi.Era) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(jedi) } func retrieveJedi(w http.ResponseWriter, r *http.Request) { name := r.URL.Query().Get("name") db, err := sql.Open("postgres", fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer db.Close() sqlStatement := ` SELECT jedi, color, era FROM sables_de_luz WHERE jedi = $1` var jedi Jedi row := db.QueryRow(sqlStatement, name) err = row.Scan(&jedi.Name, &jedi.Color, &jedi.Era) if err != nil { if err == sql.ErrNoRows { http.NotFound(w, r) } else { http.Error(w, err.Error(), http.StatusInternalServerError) } return } json.NewEncoder(w).Encode(jedi) } func deleteJedi(w http.ResponseWriter, r *http.Request) { name := r.URL.Query().Get("name") db, err := sql.Open("postgres", fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer db.Close() sqlStatement := ` DELETE FROM sables_de_luz WHERE jedi = $1` _, err = db.Exec(sqlStatement, name) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusNoContent) } func listJedi(w http.ResponseWriter, r *http.Request) { db, err := sql.Open("postgres", fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer db.Close() rows, err := db.Query("SELECT jedi, color, era FROM sables_de_luz") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer rows.Close() var jediList []Jedi for rows.Next() { var jedi Jedi if err := rows.Scan(&jedi.Name, &jedi.Color, &jedi.Era); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } jediList = append(jediList, jedi) } if err := rows.Err(); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Construir una cadena con los nombres, colores y eras de los Jedi con saltos de lĂ­nea var response string for _, jedi := range jediList { response += fmt.Sprintf("%s, Color %s, Era %s\n", jedi.Name, jedi.Color, jedi.Era) } // Escribir la respuesta en la respuesta HTTP w.Header().Set("Content-Type", "text/plain") fmt.Fprintf(w, response) }