From 5340963ac2c9b0a653571bbf0f2407afbf66fad9 Mon Sep 17 00:00:00 2001 From: Damian Wessels Date: Mon, 20 Nov 2023 15:51:42 +0100 Subject: [PATCH] =?UTF-8?q?Kategorien=20und=20Produkte=20k=C3=B6nnen=20zur?= =?UTF-8?q?=20DB=20hinzugef=C3=BCgt=20werden.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/base_controller.go | 10 ++- app/controllers/category_controller.go | 65 +++++++++++++++-- app/controllers/product_controller.go | 87 ++++++++++++++++++++++- app/models/Category.go | 34 +++++++-- app/models/Section.go | 9 +++ app/models/product.go | 19 +++++ app/models/user.go | 1 + database/seeders/seeder.go | 3 - templates/pages/admin/category_admin.html | 37 ++++++++++ templates/pages/admin/product_admin.html | 69 ++++++++++++++++++ templates/pages/categories.html | 2 +- templates/pages/products.html | 13 ++-- 12 files changed, 330 insertions(+), 19 deletions(-) create mode 100644 templates/pages/admin/category_admin.html create mode 100644 templates/pages/admin/product_admin.html diff --git a/app/controllers/base_controller.go b/app/controllers/base_controller.go index 13f8f0d..4924b56 100644 --- a/app/controllers/base_controller.go +++ b/app/controllers/base_controller.go @@ -184,10 +184,18 @@ func (server *Server) routeInit() { server.Router.HandleFunc("/logout", server.Logout).Methods("GET") server.Router.HandleFunc("/products/cat/{id}", server.ProductsByCategory).Methods("GET") - server.Router.HandleFunc("/products/{slug}", server.GetProductByID).Methods("GET") + server.Router.HandleFunc("/products/{id}", server.GetProductByID).Methods("GET") server.Router.HandleFunc("/section/{id}", server.Categories).Methods("GET") + server.Router.HandleFunc("/admin/category/{spielid}", server.AdminCategoryList).Methods("GET") + server.Router.HandleFunc("/admin/category", server.AdminCategoryPost).Methods("POST") + + server.Router.HandleFunc("/admin/product/add/{categoryID}", server.AddProduct).Methods("GET") + server.Router.HandleFunc("/admin/product", server.DoAddProduct).Methods("POST") + server.Router.HandleFunc("/admin/product/{productID}", server.AddProduct).Methods("GET") + server.Router.HandleFunc("/admin/product/{productID}", server.DoEditProduct).Methods("POST") + staticFileDirectory := http.Dir("./assets/") staticFileHandler := http.StripPrefix("/public/", http.FileServer(staticFileDirectory)) server.Router.PathPrefix("/public/").Handler(staticFileHandler).Methods("GET") diff --git a/app/controllers/category_controller.go b/app/controllers/category_controller.go index 18e241a..5a2b41f 100644 --- a/app/controllers/category_controller.go +++ b/app/controllers/category_controller.go @@ -1,6 +1,7 @@ package controllers import ( + "github.com/google/uuid" "github.com/gorilla/mux" "github.com/unrolled/render" "moretcgshop/app/models" @@ -19,9 +20,9 @@ func (server *Server) Categories(w http.ResponseWriter, r *http.Request) { return } - categorieModel := models.Category{} + categoryModel := models.Category{} - categorien, err := categorieModel.GetCategorie(server.DB, vars["id"]) + categories, err := categoryModel.GetCategory(server.DB, vars["id"]) if err != nil { println(err.Error()) @@ -29,7 +30,63 @@ func (server *Server) Categories(w http.ResponseWriter, r *http.Request) { } _ = renderer.HTML(w, http.StatusOK, "categories", map[string]interface{}{ - //"user": user, - "categorien": categorien, + "categories": categories, }) } + +func (server *Server) AdminCategoryList(w http.ResponseWriter, r *http.Request) { + renderer := render.New(render.Options{ + Layout: "layout", + Extensions: []string{".html", ".tmpl"}, + }) + + vars := mux.Vars(r) + if vars["spielid"] == "" { + println("spielid is leer") + return + } + + section, err := models.GetSectionByID(server.DB, vars["spielid"]) + + categoryModel := models.Category{} + categories, err := categoryModel.GetCategory(server.DB, vars["spielid"]) + + if err != nil { + println(err.Error()) + return + } + + _ = renderer.HTML(w, http.StatusOK, "admin_categoryList", map[string]interface{}{ + "categories": categories, + "spiel": section, + }) +} + +func (server *Server) AdminCategoryPost(w http.ResponseWriter, r *http.Request) { + kategorieName := r.FormValue("katname") + spielID := r.FormValue("spielid") + + if kategorieName == "" { + SetFlash(w, r, "error", "Kategoriename wurde nicht eingetragen") + http.Redirect(w, r, "/admin/category/"+spielID, http.StatusSeeOther) + return + } + + kategorieModel := &models.Category{} + + params := &models.Category{ + ID: uuid.New().String(), + Name: kategorieName, + SectionID: spielID, + } + + _, err := kategorieModel.CreateCategory(server.DB, params) + if err != nil { + SetFlash(w, r, "error", "Sorry das war nicht erfolgreich") + http.Redirect(w, r, "/admin/category/"+spielID, http.StatusSeeOther) + return + } + + http.Redirect(w, r, "/admin/category/"+spielID, http.StatusSeeOther) + +} diff --git a/app/controllers/product_controller.go b/app/controllers/product_controller.go index 29d3847..217a565 100644 --- a/app/controllers/product_controller.go +++ b/app/controllers/product_controller.go @@ -1,13 +1,96 @@ package controllers import ( + "github.com/google/uuid" "github.com/gorilla/mux" + "github.com/shopspring/decimal" "github.com/unrolled/render" + "log" "moretcgshop/app/models" "net/http" "strconv" ) +func (server *Server) AddProduct(w http.ResponseWriter, r *http.Request) { + renderer := render.New(render.Options{ + Layout: "layout", + Extensions: []string{".html", ".tmpl"}, + }) + + //http://localhost:9000/admin/product/add/7bfbead0-cbef-4eb1-bb8d-966359050047 + vars := mux.Vars(r) + if vars["categoryID"] == "" { + println("CategoryID is null") + return + } + categoryID := vars["categoryID"] + + categoryModel := &models.Category{} + + category, err := categoryModel.GetCategoryByID(server.DB, categoryID) + if err != nil { + log.Fatalf(err.Error()) + return + } + + _ = renderer.HTML(w, http.StatusOK, "admin_productAdd", map[string]interface{}{ + "category": category, + "error": GetFlash(w, r, "error"), + }) + +} + +func (server *Server) DoAddProduct(w http.ResponseWriter, r *http.Request) { + name := r.FormValue("name") + price := r.FormValue("price") + shortdescription := r.FormValue("shortdescription") + description := r.FormValue("description") + categoryID := r.FormValue("categoryID") + + if name == "" || price == "" || shortdescription == "" || description == "" { + SetFlash(w, r, "error", "Name,Preis, Kurze Beschreibung und Beschreibung sind pflicht Felder") + http.Redirect(w, r, "/admin/product/add/"+categoryID, http.StatusSeeOther) + return + } + + productModel := models.Product{} + + pr, err := decimal.NewFromString(price) + if err != nil { + SetFlash(w, r, "error", err.Error()) + http.Redirect(w, r, "/admin/product/add/"+categoryID, http.StatusSeeOther) + + } + + params := &models.Product{ + ID: uuid.New().String(), + Name: name, + ShortDescription: shortdescription, + Description: description, + CategoryID: categoryID, + Price: pr, + } + + product, err := productModel.CreateProduct(server.DB, params) + if err != nil { + log.Println(err.Error()) + SetFlash(w, r, "error", "Sorry Produkt konnte nicht hinzugefügt werden") + http.Redirect(w, r, "/admin/product/add/"+categoryID, http.StatusSeeOther) + return + } + + _ = product + http.Redirect(w, r, "/admin/product/add/"+categoryID, http.StatusSeeOther) +} + +func (server *Server) GetEditProduct(w http.ResponseWriter, r *http.Request) { + +} + +func (server *Server) DoEditProduct(w http.ResponseWriter, r *http.Request) { + +} + func (server *Server) ProductsByCategory(w http.ResponseWriter, r *http.Request) { renderer := render.New(render.Options{ Layout: "layout", @@ -55,12 +138,12 @@ func (server *Server) GetProductByID(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) - if vars["slug"] == "" { + if vars["id"] == "" { return } productModel := models.Product{} - product, err := productModel.FindByID(server.DB, vars["slug"]) + product, err := productModel.FindByID(server.DB, vars["id"]) if err != nil { println(err.Error()) return diff --git a/app/models/Category.go b/app/models/Category.go index 5f1b059..09d5c65 100644 --- a/app/models/Category.go +++ b/app/models/Category.go @@ -17,13 +17,39 @@ type Category struct { UpdatedAt time.Time } -func (p *Category) GetCategorie(db *gorm.DB, sectionID string) (*[]Category, error) { +func (p *Category) GetCategory(db *gorm.DB, sectionID string) (*[]Category, error) { - var categorie []Category + var categories []Category - err := db.Debug().Model(&Category{}).Order("created_at desc").Where("section_id = ?", sectionID).Find(&categorie).Error + err := db.Debug().Model(&Category{}).Order("created_at desc").Where("section_id = ?", sectionID).Find(&categories).Error if err != nil { return nil, err } - return &categorie, nil + return &categories, nil +} + +func (p *Category) GetCategoryByID(db *gorm.DB, categoryID string) (*Category, error) { + var result Category + + err := db.Debug().Model(&Category{}).Where("id = ?", categoryID).Find(&result).Error + if err != nil { + return nil, err + } + return &result, nil +} + +func (p *Category) CreateCategory(db *gorm.DB, param *Category) (*Category, error) { + category := &Category{ + ID: param.ID, + Name: param.Name, + SectionID: param.SectionID, + CreatedAt: time.Time{}, + UpdatedAt: time.Time{}, + } + + err := db.Debug().Create(&category).Error + if err != nil { + return nil, err + } + return category, nil } diff --git a/app/models/Section.go b/app/models/Section.go index 632ae33..3c4502e 100644 --- a/app/models/Section.go +++ b/app/models/Section.go @@ -21,3 +21,12 @@ func GetSection(db *gorm.DB) ([]Section, error) { } return sections, nil } + +func GetSectionByID(db *gorm.DB, id string) (Section, error) { + var section Section + err := db.Debug().Model(&Section{}).Where("id = ?", id).Find(§ion).Error + if err != nil { + + } + return section, nil +} diff --git a/app/models/product.go b/app/models/product.go index 6283f38..0c1679a 100644 --- a/app/models/product.go +++ b/app/models/product.go @@ -24,6 +24,25 @@ type Product struct { DeletedAt gorm.DeletedAt } +func (p *Product) CreateProduct(db *gorm.DB, param *Product) (*Product, error) { + product := &Product{ + ID: param.ID, + Name: param.Name, + Price: param.Price, + CategoryID: param.CategoryID, + Description: param.Description, + ShortDescription: param.ShortDescription, + CreatedAt: time.Time{}, + UpdatedAt: time.Time{}, + } + + err := db.Debug().Create(&product).Error + if err != nil { + return nil, err + } + return product, nil +} + func (p *Product) GetProducts(db *gorm.DB, perPage int, page int) (*[]Product, int64, error) { var count int64 diff --git a/app/models/user.go b/app/models/user.go index ae447e7..5bfe22d 100644 --- a/app/models/user.go +++ b/app/models/user.go @@ -14,6 +14,7 @@ type User struct { Email string Password string RememberToken string + Admin bool CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt diff --git a/database/seeders/seeder.go b/database/seeders/seeder.go index bbf1c78..da6c1ad 100644 --- a/database/seeders/seeder.go +++ b/database/seeders/seeder.go @@ -11,10 +11,7 @@ type Seeder struct { func RegisterSeeders(db *gorm.DB) []Seeder { return []Seeder{ - {Seeder: fakers.UserFaker(db)}, - {Seeder: fakers.ProductFaker(db)}, {Seeder: fakers.SectionFaker(db)}, - {Seeder: fakers.CategoryFaker(db)}, } } diff --git a/templates/pages/admin/category_admin.html b/templates/pages/admin/category_admin.html new file mode 100644 index 0000000..6a9defa --- /dev/null +++ b/templates/pages/admin/category_admin.html @@ -0,0 +1,37 @@ +{{ define "admin_categoryList" }} +

Adminpage vom {{ .spiel.Name }}

+{{ if .error }} +
+ {{ range $i, $msg := .error }} + {{ $msg }}
+ {{ end }} +
+{{ end }} +{{ range $i, $category := .categories }} +
  • {{ $category.Name }}
  • +{{ end }} + +{{ template "admin_categoryAdd" $d := .spiel.ID }} + +{{ end }} + + +{{ define "admin_categoryAdd" }} +
    +
    +
    +
    + +
    + + +
    +
    +
    + +
    +
    + +{{ end }} + + diff --git a/templates/pages/admin/product_admin.html b/templates/pages/admin/product_admin.html new file mode 100644 index 0000000..55a0cd0 --- /dev/null +++ b/templates/pages/admin/product_admin.html @@ -0,0 +1,69 @@ +{{ define "admin_productAdd" }} + + +
    +
    +
    +
    +
    +
    Neue Produkt Hinzufügen in den Kategorie {{ .category.Name }}
    + +
    +
    + + {{ if .error }} +
    + {{ range $i, $msg := .error }} + {{ $msg }}
    + {{ end }} +
    + {{ end }} +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + + +
    +
    +
    + +
    +
    +
    + + + +{{ end }} \ No newline at end of file diff --git a/templates/pages/categories.html b/templates/pages/categories.html index 11a2bb6..c05b334 100644 --- a/templates/pages/categories.html +++ b/templates/pages/categories.html @@ -19,7 +19,7 @@
    diff --git a/templates/pages/products.html b/templates/pages/products.html index 0ac06b8..5a81322 100644 --- a/templates/pages/products.html +++ b/templates/pages/products.html @@ -33,6 +33,7 @@
    --> +