forked from WEB-IMB-WS2526/lab-development-imb
Aufgabe 9 und paar kleine Übungen
parent
f3859ea3e4
commit
082eb3009e
|
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
// Produktarray
|
||||||
|
const produkte = [
|
||||||
|
{ produkt: "Joghurt", preis: 2.49 },
|
||||||
|
{ produkt: "Brot", preis: 3.29 },
|
||||||
|
{ produkt: "Käse", preis: 8.99 },
|
||||||
|
{ produkt: "Duschgel", preis: 2.79 }
|
||||||
|
];
|
||||||
|
|
||||||
|
// neues Array
|
||||||
|
|
||||||
|
const rabattProdukte = produkte.map(p => {
|
||||||
|
return {
|
||||||
|
produkt: p.produkt,
|
||||||
|
preis: (p.preis * 0.9).toFixed(2) // Preis um 10% reduziert und gerundet
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// Ausgabe
|
||||||
|
console.log(rabattProdukte);
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
module db_insert
|
||||||
|
|
||||||
|
go 1.24.5
|
||||||
|
|
||||||
|
require github.com/lib/pq v1.10.9
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
|
||||||
|
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
|
|
@ -0,0 +1,166 @@
|
||||||
|
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))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
const zahlen = [38, 0, 226, 384, 111, 500383];
|
||||||
|
|
||||||
|
for (let i = 0; i < zahlen.length; i++){
|
||||||
|
if (zahlen[i] === 0){
|
||||||
|
console.log("Null");
|
||||||
|
} else {
|
||||||
|
console.log(zahlen[i] % 2 === 0 ? "Gerade Zahl" : "Ungerade Zahl")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
<!DOcTYPE html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" method="POST">
|
||||||
|
<title>Anamesebogen</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Anamesebogen</h1>
|
||||||
|
<h2>Bitte ausfüllen</h2>
|
||||||
|
<form>
|
||||||
|
<fieldset>
|
||||||
|
<legend>Persönliches</legend>
|
||||||
|
<label for="name">Name:</label>
|
||||||
|
<input type="text" name="name" id="name" required><br><br>
|
||||||
|
<label for="vorname">Vorname:</label>
|
||||||
|
<input type="text" name="vorname" id="vorname" required><br><br>
|
||||||
|
<label for="gebdatum">Geburtsdatum</label>
|
||||||
|
<input type="date" name="gebdatum" id="gebdatum" required><br><br>
|
||||||
|
<label for="gender">Geschlecht</label>
|
||||||
|
<select name="gender" id="gender" required><br><br>
|
||||||
|
<option value="Weiblich">weiblich</option>
|
||||||
|
<option value="männlich">männlich</option>
|
||||||
|
<option value="divers">divers</option>
|
||||||
|
<option value="ka">keine Angabe</option>
|
||||||
|
</select>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>Körperdaten</legend>
|
||||||
|
<label for="gewicht">Gewicht (kg):</label>
|
||||||
|
<input type="number" name="gewicht" id="gewicht"><br><br>
|
||||||
|
<label for="groesse">Größe (cm):</label>
|
||||||
|
<input type="number" name="groesse" id="groesse"><br><br>
|
||||||
|
</fieldset>
|
||||||
|
<button type="submit">Absenden</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ist ein Struct sowas wie eine Klasse in Java ?
|
||||||
|
type Klient struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Vorname string `json:"vorname"`
|
||||||
|
Gebdatum time.Time `json:"gebdatum"`
|
||||||
|
Geschlecht string `json:"gender"`
|
||||||
|
Gewicht int `json:"gewicht"`
|
||||||
|
Groesse int `json:"groesse"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func anameseHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.Method != http.MethodPost {
|
||||||
|
http.Error(w, "Methode ungültig", http.StatusMethodNotAllowed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// ist ka dann eine Art Objekt von der Klasse KLient?
|
||||||
|
var k Klient
|
||||||
|
|
||||||
|
err := json.NewDecoder(r.Body).Decode(&k)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "Kein gültiges Json", http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if k.Name == "" || k.Vorname == "" || k.Geschlecht == "" {
|
||||||
|
http.Error(w, "Pflichtfelder sind leer", http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if k.Gebdatum.IsZero() {
|
||||||
|
http.Error(w, "Geburtsdatum fehlt", http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if k.Gewicht == 0 || k.Groesse == 0 {
|
||||||
|
warnings = append(warnings, "BMI kann nicht berechnet werden")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erfolg und Warnung zurückgeben wnn genu wird die response varibale genutzt?
|
||||||
|
response := map[string]interface{}{
|
||||||
|
"message:": "Klient erfolgreich angelegt",
|
||||||
|
"warnings": warnings,
|
||||||
|
}
|
||||||
|
|
||||||
|
//ok response habe ich hier gefunden, aber den Rest dieses Codes verstehe ich gerade nich
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusCreated)
|
||||||
|
json.NewEncoder(w).Encode(response)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
openapi: 3.0.x
|
||||||
|
info:
|
||||||
|
title: Anamese API
|
||||||
|
version: 1.0.0
|
||||||
|
description: API für Anamesebogen
|
||||||
|
servers:
|
||||||
|
- url: http://localhost:8080
|
||||||
|
paths:
|
||||||
|
/anamese:
|
||||||
|
post:
|
||||||
|
summary: Daten erfassen
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Klient'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Klient erfolgreich angelegt
|
||||||
|
'400':
|
||||||
|
description: Eingaben ungültig
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
Klient:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
vorname:
|
||||||
|
type: string
|
||||||
|
gebdatum:
|
||||||
|
type: date
|
||||||
|
gender:
|
||||||
|
type: string
|
||||||
|
enum: [weiblich, männluch, divers, ka]
|
||||||
|
gewicht:
|
||||||
|
type: number
|
||||||
|
groesse:
|
||||||
|
type: number
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
- vorname
|
||||||
|
- gebdatum
|
||||||
|
- gender
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
openapi: 3.0.x
|
||||||
|
info:
|
||||||
|
title: Wichteln
|
||||||
|
version: 1.0.0
|
||||||
|
description: API für Wichtelaktion
|
||||||
|
servers:
|
||||||
|
- url: http://localhost:8080
|
||||||
|
paths:
|
||||||
|
/wichtelaktion:
|
||||||
|
post:
|
||||||
|
summary: Aktion anlegen
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
adminEmail:
|
||||||
|
type: string
|
||||||
|
format: email
|
||||||
|
startDate:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
endDate:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
- adminEmail
|
||||||
|
- startDate
|
||||||
|
- endDate
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Aktion erfolgreich erstellt
|
||||||
|
'400':
|
||||||
|
description: Aktion konnte nicht erstellt werden
|
||||||
|
/wichtelaktion/{id}/invite:
|
||||||
|
post:
|
||||||
|
summary: Teilnehmer einladen und Tokens generieren
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
emails:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
reqired:
|
||||||
|
- emails
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Teilnehmer erfolgreich eingeladen
|
||||||
|
'400':
|
||||||
|
description: Teilnehmer konnten nicht eingeladen werden
|
||||||
|
/wichtelaktion/{id}/:
|
||||||
|
put:
|
||||||
|
summary: Wichtelaktion bearbeiten
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responseBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue