diff --git a/cmd/websrv/main.go b/cmd/websrv/main.go index 9165f0b..77a5257 100644 --- a/cmd/websrv/main.go +++ b/cmd/websrv/main.go @@ -2,9 +2,7 @@ package main import ( "context" - "encoding/json" "fmt" - "io" "log" "net/http" "os" @@ -12,7 +10,6 @@ import ( "syscall" "time" - "github.com/google/uuid" "gittea.marcokittel.de/elio/eliotools/datawriter/internal/api" "gittea.marcokittel.de/elio/eliotools/datawriter/internal/database" ) @@ -65,133 +62,12 @@ func main() { fmt.Println("Connectionstring fehlt!. Bsp.: :@tcp(127.0.0.1:3306)/elio?parseTime=true") return } - //Dependency Injection + http.HandleFunc("/api/products", api.GetProductApiHandleFunc(nps)) - - //Todo schöner machen - http.HandleFunc("/api/products/reserve", func(w http.ResponseWriter, r *http.Request) { - if r.Method != "POST" { - return - } - defer r.Body.Close() - data, err := io.ReadAll(r.Body) - if err != nil { - log.Println(err) - return - } - var payload database.Container - err = json.Unmarshal(data, &payload) - if err != nil { - log.Printf("Could not parse Json: %s", err) - return - } - groupId := uuid.New().String() - result, err := nps.FetchReservationData(&payload, database.UUID(groupId)) - if err != nil { - //Todo Fehlerhandling - log.Println(err) - } - if len(result) == 0 { - w.WriteHeader(http.StatusNoContent) - fmt.Fprintln(w) - return - } - _, err = nps.ReserviereBestellungen(result, database.UUID(groupId)) - if err != nil { - log.Println(err) - } - jsonResult, err := json.Marshal(result[0]) - if err != nil { - log.Println(err) - } - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - fmt.Fprintln(w, string(jsonResult)) - }) - - http.HandleFunc("/api/products/confirm", func(w http.ResponseWriter, r *http.Request) { - if r.Method != "POST" { - return - } - defer r.Body.Close() - data, err := io.ReadAll(r.Body) - if err != nil { - log.Println(err) - return - } - payload := struct { - Id string `json:"id"` - }{} - err = json.Unmarshal(data, &payload) - if err != nil { - //Todo Fehlerhandling - log.Println(err) - } - err = nps.ConfirmBestellung(database.UUID(payload.Id)) - if err != nil { - //Todo Fehlerhandling - log.Println(err) - } - w.WriteHeader(http.StatusNoContent) - fmt.Fprintln(w) - return - }) - - http.HandleFunc("/api/products/release", func(w http.ResponseWriter, r *http.Request) { - if r.Method != "POST" { - return - } - defer r.Body.Close() - data, err := io.ReadAll(r.Body) - if err != nil { - log.Println(err) - return - } - payload := struct { - Id string `json:"id"` - }{} - err = json.Unmarshal(data, &payload) - if err != nil { - //Todo Fehlerhandling - log.Println(err) - } - err = nps.ReleaseBestellung(database.UUID(payload.Id)) - if err != nil { - //Todo Fehlerhandling - log.Println(err) - } - w.WriteHeader(http.StatusNoContent) - fmt.Fprintln(w) - return - }) - - http.HandleFunc("/api/products/abort", func(w http.ResponseWriter, r *http.Request) { - if r.Method != "POST" { - return - } - defer r.Body.Close() - data, err := io.ReadAll(r.Body) - if err != nil { - log.Println(err) - return - } - payload := struct { - Id string `json:"id"` - }{} - err = json.Unmarshal(data, &payload) - if err != nil { - //Todo Fehlerhandling - log.Println(err) - } - err = nps.AbortBestellung(database.UUID(payload.Id)) - if err != nil { - //Todo Fehlerhandling - log.Println(err) - } - w.WriteHeader(http.StatusNoContent) - fmt.Fprintln(w) - return - }) + http.HandleFunc("/api/products/reserve", api.GetProductReservationApiHandleFunc(nps)) + http.HandleFunc("/api/products/confirm", api.GetConfirmReservationApiHandleFunc(nps)) + http.HandleFunc("/api/products/release", api.GetReleaseReservationApiHandleFunc(nps)) + http.HandleFunc("/api/products/abort", api.GetAbortApiHandleFunc(nps)) go func() { log.Printf("Easy Peasy: Die Party startet auf Port %s\n", port) diff --git a/initdb/init.sql b/initdb/init.sql index d43e3be..38d6f69 100644 --- a/initdb/init.sql +++ b/initdb/init.sql @@ -2,50 +2,9 @@ CREATE DATABASE IF NOT EXISTS elio_test; CREATE DATABASE IF NOT EXISTS elio; - --- -- Haupttabellen erzeugen --- CREATE TABLE IF NOT EXISTS elio.warehouseproducts ( --- id INT AUTO_INCREMENT PRIMARY KEY, --- warehouse char(2) NOT NULL, --- productid VARCHAR(20) NOT NULL, --- amount INT DEFAULT 0, --- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, --- CONSTRAINT location_product_must_be_one UNIQUE (warehouse, productid) --- ) ENGINE=InnoDB; - --- CREATE TABLE IF NOT EXISTS elio.deliverytimes ( --- id INT AUTO_INCREMENT PRIMARY KEY, --- fromcountry varchar(4) NOT NULL, --- tocountry varchar(4) NOT NULL, --- state varchar(4) NULL, --- delivery INT DEFAULT 0, --- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, --- CONSTRAINT delivery_from_to_country_must_be_one UNIQUE (fromcountry, tocountry) --- ) ENGINE=InnoDB; - --- -- Testtabellen erzeugen --- CREATE TABLE IF NOT EXISTS elio_test.warehouseproducts ( --- id INT AUTO_INCREMENT PRIMARY KEY, --- warehouse char(2) NOT NULL, --- productid VARCHAR(20) NOT NULL, --- amount INT DEFAULT 0, --- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, --- CONSTRAINT location_product_must_be_one UNIQUE (warehouse, productid) --- ) ENGINE=InnoDB; - --- CREATE TABLE IF NOT EXISTS elio_test.deliverytimes ( --- id INT AUTO_INCREMENT PRIMARY KEY, --- fromcountry varchar(4) NOT NULL, --- tocountry varchar(4) NOT NULL, --- state varchar(4) NULL, --- delivery INT DEFAULT 0, --- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, --- CONSTRAINT delivery_from_to_country_must_be_one UNIQUE (fromcountry, tocountry) --- ) ENGINE=InnoDB; - --- Userkram CREATE USER IF NOT EXISTS 'elio'@'%' IDENTIFIED BY 'eliogeheim'; CREATE USER IF NOT EXISTS 'elio_test'@'%' IDENTIFIED BY 'eliogeheim'; + GRANT ALL PRIVILEGES ON elio.* TO 'elio'@'%'; GRANT ALL PRIVILEGES ON elio_test.* TO 'elio_test'@'%'; FLUSH PRIVILEGES; diff --git a/internal/api/abortproducts.go b/internal/api/abortproducts.go new file mode 100644 index 0000000..a714800 --- /dev/null +++ b/internal/api/abortproducts.go @@ -0,0 +1,41 @@ +package api + +import ( + "encoding/json" + "fmt" + "io" + "log" + "net/http" + + "gittea.marcokittel.de/elio/eliotools/datawriter/internal/database" +) + +func GetAbortApiHandleFunc(nps *database.ProductService) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + return + } + defer r.Body.Close() + data, err := io.ReadAll(r.Body) + if err != nil { + log.Println(err) + return + } + payload := struct { + Id string `json:"id"` + }{} + err = json.Unmarshal(data, &payload) + if err != nil { + //Todo Fehlerhandling + log.Println(err) + } + err = nps.AbortBestellung(database.UUID(payload.Id)) + if err != nil { + //Todo Fehlerhandling + log.Println(err) + } + w.WriteHeader(http.StatusNoContent) + fmt.Fprintln(w) + return + } +} diff --git a/internal/api/confirmproducts.go b/internal/api/confirmproducts.go new file mode 100644 index 0000000..f4a8c13 --- /dev/null +++ b/internal/api/confirmproducts.go @@ -0,0 +1,41 @@ +package api + +import ( + "encoding/json" + "fmt" + "io" + "log" + "net/http" + + "gittea.marcokittel.de/elio/eliotools/datawriter/internal/database" +) + +func GetConfirmReservationApiHandleFunc(nps *database.ProductService) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + return + } + defer r.Body.Close() + data, err := io.ReadAll(r.Body) + if err != nil { + log.Println(err) + return + } + payload := struct { + Id string `json:"id"` + }{} + err = json.Unmarshal(data, &payload) + if err != nil { + //Todo Fehlerhandling + log.Println(err) + } + err = nps.ConfirmBestellung(database.UUID(payload.Id)) + if err != nil { + //Todo Fehlerhandling + log.Println(err) + } + w.WriteHeader(http.StatusNoContent) + fmt.Fprintln(w) + return + } +} diff --git a/internal/api/products.go b/internal/api/fetchproducts.go similarity index 100% rename from internal/api/products.go rename to internal/api/fetchproducts.go diff --git a/internal/api/releaseproducts.go b/internal/api/releaseproducts.go new file mode 100644 index 0000000..dcfb235 --- /dev/null +++ b/internal/api/releaseproducts.go @@ -0,0 +1,41 @@ +package api + +import ( + "encoding/json" + "fmt" + "io" + "log" + "net/http" + + "gittea.marcokittel.de/elio/eliotools/datawriter/internal/database" +) + +func GetReleaseReservationApiHandleFunc(nps *database.ProductService) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + return + } + defer r.Body.Close() + data, err := io.ReadAll(r.Body) + if err != nil { + log.Println(err) + return + } + payload := struct { + Id string `json:"id"` + }{} + err = json.Unmarshal(data, &payload) + if err != nil { + //Todo Fehlerhandling + log.Println(err) + } + err = nps.ReleaseBestellung(database.UUID(payload.Id)) + if err != nil { + //Todo Fehlerhandling + log.Println(err) + } + w.WriteHeader(http.StatusNoContent) + fmt.Fprintln(w) + return + } +} diff --git a/internal/api/reserveproducts.go b/internal/api/reserveproducts.go new file mode 100644 index 0000000..890378e --- /dev/null +++ b/internal/api/reserveproducts.go @@ -0,0 +1,54 @@ +package api + +import ( + "encoding/json" + "fmt" + "io" + "log" + "net/http" + + "github.com/google/uuid" + "gittea.marcokittel.de/elio/eliotools/datawriter/internal/database" +) + +func GetProductReservationApiHandleFunc(nps *database.ProductService) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + return + } + defer r.Body.Close() + data, err := io.ReadAll(r.Body) + if err != nil { + log.Println(err) + return + } + var payload database.Container + err = json.Unmarshal(data, &payload) + if err != nil { + log.Printf("Could not parse Json: %s", err) + return + } + groupId := uuid.New().String() + result, err := nps.FetchReservationData(&payload, database.UUID(groupId)) + if err != nil { + //Todo Fehlerhandling + log.Println(err) + } + if len(result) == 0 { + w.WriteHeader(http.StatusNoContent) + fmt.Fprintln(w) + return + } + _, err = nps.ReserviereBestellungen(result, database.UUID(groupId)) + if err != nil { + log.Println(err) + } + jsonResult, err := json.Marshal(result[0]) + if err != nil { + log.Println(err) + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + fmt.Fprintln(w, string(jsonResult)) + } +}