forked from WEB-IMB-WS2526/lab-development-imb
118 lines
3.4 KiB
Go
118 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
_ "github.com/lib/pq"
|
|
)
|
|
|
|
var db *sql.DB
|
|
|
|
type dataManipulator func(w http.ResponseWriter, name string, hobbies string, alter int, db *sql.DB)
|
|
|
|
func insertToDB(w http.ResponseWriter, name string, hobbies string, alter int, db *sql.DB) {
|
|
|
|
// INSERT-Anweisung vorbereiten
|
|
query := `INSERT INTO personen (name, hobbies, alter) VALUES ($1, $2, $3)`
|
|
// INSERT-Anweisung ausführen
|
|
_, err := db.Exec(query, name, hobbies, alter)
|
|
if err != nil {
|
|
log.Println("Fehler beim Einfügen:", err)
|
|
http.Error(w, "Datensatz konnte nicht gespeichert werden.", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
log.Println("Datensatz erfolgreich eingefügt.")
|
|
|
|
fmt.Fprintln(w, "Ihre Hobbies wurden erfolgreich gespeichert.")
|
|
}
|
|
|
|
func updateInDB(w http.ResponseWriter, name string, hobbies string, alter int, db *sql.DB) {
|
|
|
|
// UPDATE-Anweisung vorbereiten
|
|
query := `UPDATE personen SET hobbies = $1, alter =$2 WHERE name = $3`
|
|
// UPDATE-Anweisung ausführen
|
|
_, err := db.Exec(query, hobbies, alter, name)
|
|
if err != nil {
|
|
log.Println("Fehler beim Aktualisieren:", err)
|
|
http.Error(w, "Datensatz konnte nicht aktualisiert werden.", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
log.Println("Datensatz erfolgreich aktualisiert.")
|
|
|
|
fmt.Fprintln(w, "Ihre Hobbies wurden erfolgreich aktualisiert.")
|
|
}
|
|
|
|
func handleFormRequest(w http.ResponseWriter, r *http.Request, dbf dataManipulator) {
|
|
|
|
w.Header().Set("Access-Control-Allow-Origin", "*")
|
|
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
|
|
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
|
|
|
|
if r.Method == "OPTIONS" {
|
|
w.WriteHeader(http.StatusNoContent)
|
|
return
|
|
}
|
|
|
|
if r.Method != http.MethodPost {
|
|
http.Error(w, "Nur POST-Methode erlaubt.", http.StatusMethodNotAllowed)
|
|
return
|
|
}
|
|
|
|
err := r.ParseForm()
|
|
if err != nil {
|
|
http.Error(w, "Fehler beim Parsen des Formulars", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
if len(r.PostForm) == 0 {
|
|
http.Error(w, "Kein POST-Formular gesendet", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
name := r.PostForm.Get("name")
|
|
hobbies := r.PostForm["hobby"]
|
|
// Umwandlung in einen String mit Komma-Trennung
|
|
hobbiesAsString := strings.Join(hobbies, ", ")
|
|
alter, err := strconv.Atoi(r.PostForm.Get("alter"))
|
|
if err != nil {
|
|
log.Println("Parameter konnte nicht korrekt verarbeitet werden:", err)
|
|
http.Error(w, "Benutzereingabe fehlerhaft.", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
dbf(w, name, hobbiesAsString, alter, db)
|
|
}
|
|
|
|
func handleFormRequestWithDB(dbm dataManipulator) func(w http.ResponseWriter, r *http.Request) {
|
|
return func(w http.ResponseWriter, r *http.Request) { handleFormRequest(w, r, dbm) }
|
|
}
|
|
|
|
func main() {
|
|
// Verbindungszeichenfolge: Benutzername, Passwort, DB-Name, Host, Port
|
|
connStr := "user=devuser password=devpass dbname=devdb host=localhost port=5432 sslmode=disable"
|
|
// Verbindung zur Datenbank öffnen
|
|
var err error
|
|
db, err = sql.Open("postgres", connStr)
|
|
if err != nil {
|
|
log.Fatal("Fehler beim Öffnen der DB-Verbindung:", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
// Verbindung testen
|
|
err = db.Ping()
|
|
if err != nil {
|
|
log.Fatal("Datenbank nicht erreichbar:", err)
|
|
}
|
|
log.Println("Verbindung zur Datenbank erfolgreich hergestellt.")
|
|
|
|
http.HandleFunc("/insert", handleFormRequestWithDB(insertToDB))
|
|
http.HandleFunc("/update", handleFormRequestWithDB(updateInDB))
|
|
fmt.Println("Server läuft auf localhost:8080...")
|
|
log.Fatal(http.ListenAndServe(":8080", nil))
|
|
}
|