forked from WEB-IMB-WS2526/lab-development-imb
167 lines
3.7 KiB
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))
|
|
|
|
}
|