lab-development-imb/web/09/09_loesungen/Aufgabe_1und2/main.go

167 lines
3.7 KiB
Go

package main
import (
"database/sql"
"fmt"
"log"
"net/http"
"strings"
_ "github.com/lib/pq"
)
// INSERT
type insertHandler int
func (ihandler insertHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// auf Post prüfen
if r.Method != http.MethodPost {
http.Error(w, "Nur Post ist erlaubt", http.StatusMethodNotAllowed)
return
}
//Formulardaten einlesen
err := r.ParseForm()
if err != nil {
http.Error(w, "gesendetes Formular ungültig", http.StatusBadRequest)
return
}
name := r.FormValue("name")
alter := r.FormValue("alter")
hobbies := r.Form["hobby"]
// alter und name sollten vorhanden sein
if name == "" {
http.Error(w, "Name fehlt", http.StatusBadRequest)
return
}
if alter == "" {
http.Error(w, "Alter fehlt", http.StatusBadRequest)
return
}
// Hobbies mit Komma separiert zusammenfügen
alleHobbies := strings.Join(hobbies, ", ")
//DB Verbindung öffnen
connStr := "user=devuser password=devpass dbname=devdb host=localhost port=5432 sslmode=disable"
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Println("Datenbank nicht erreichbar", err)
http.Error(w, "Server Fehler", http.StatusInternalServerError)
return
}
defer db.Close()
//Verbindung testen
err = db.Ping()
if err != nil {
log.Println("Datenbank nicht erreichbar", err)
http.Error(w, "Interner Server Error", http.StatusInternalServerError)
return
}
log.Println("Verbindung erfolgreich hergestellt")
//Insert
query := `INSERT INTO personen (name, hobbies, alter) VALUES ($1, $2, $3)`
_, err = db.Exec(query, name, alleHobbies, alter)
if err != nil {
log.Println("Fehler beim Einfügen der Daten", err)
http.Error(w, "Interner Server Fehler", http.StatusInternalServerError)
return
}
fmt.Fprintln(w, "Datensatz erfolgreich eingefügt")
}
// UPDATE
type updateHandler int
func (uhandler updateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// nur POST erlauben
if r.Method != http.MethodPost {
http.Error(w, "Nur Post ist erlaubt", http.StatusMethodNotAllowed)
return
}
// Formulardaten einlesen
err := r.ParseForm()
if err != nil {
http.Error(w, "gesendetes Formular ungültig", http.StatusBadRequest)
return
}
name := r.FormValue("name")
alter := r.FormValue("alter")
hobbies := r.Form["hobby"]
if name == "" {
http.Error(w, "Name fehlt", http.StatusBadRequest)
return
}
if alter == "" {
http.Error(w, "Alter fehlt", http.StatusBadRequest)
return
}
// Hobbies zusammenfügen
alleHobbies := strings.Join(hobbies, ", ")
// DB-Verbindung
connStr := "user=devuser dbname=devdb host=localhost port=5432 sslmode=disable"
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Println("Datenbank nicht erreichbar", err)
http.Error(w, "Server Fehler", http.StatusInternalServerError)
return
}
defer db.Close()
err = db.Ping()
if err != nil {
log.Println("Datenbank nicht erreichbar", err)
http.Error(w, "Interner Server Fehler", http.StatusInternalServerError)
return
}
// Update-Query
query := `UPDATE personen SET hobbies = $1, alter = $2 WHERE name = $3`
res, err := db.Exec(query, alleHobbies, alter, name)
if err != nil {
log.Println("Fehler beim Update", err)
http.Error(w, "Interner Server Fehler", http.StatusInternalServerError)
return
}
rowsAffected, _ := res.RowsAffected()
if rowsAffected == 0 {
http.Error(w, "Kein Datensatz mit diesem Namen gefunden", http.StatusNotFound)
return
}
fmt.Fprintln(w, "Datensatz erfolgreich aktualisiert")
}
func main() {
var ihandler insertHandler
var uhandler updateHandler
http.Handle("/insert", ihandler) // Insert-Endpunkt
http.Handle("/update", uhandler) // Update-Endpunkt
log.Println("Server startet auf http://localhost:8080")
log.Fatal(http.ListenAndServe("localhost:8080", nil))
}