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