diff --git a/app/controllers/base_controller.go b/app/controllers/base_controller.go index 6ce1239..a4b978f 100644 --- a/app/controllers/base_controller.go +++ b/app/controllers/base_controller.go @@ -160,6 +160,9 @@ func (server *Server) routeInit() { server.Router.HandleFunc("/register", server.DoRegister).Methods("POST") server.Router.HandleFunc("/logout", server.Logout).Methods("GET") + server.Router.HandleFunc("/products", server.Products).Methods("GET") + server.Router.HandleFunc("/products/{slug}", server.GetProductByID).Methods("GET") + staticFileDirectory := http.Dir("./assets/") staticFileHandler := http.StripPrefix("/public/", http.FileServer(staticFileDirectory)) server.Router.PathPrefix("/public/").Handler(staticFileHandler).Methods("GET") diff --git a/app/controllers/product_controller.go b/app/controllers/product_controller.go new file mode 100644 index 0000000..094865f --- /dev/null +++ b/app/controllers/product_controller.go @@ -0,0 +1,62 @@ +package controllers + +import ( + "github.com/gorilla/mux" + "github.com/unrolled/render" + "moretcgshop/app/models" + "net/http" + "strconv" +) + +func (server *Server) Products(w http.ResponseWriter, r *http.Request) { + renderer := render.New(render.Options{ + Layout: "layout", + Extensions: []string{".html", ".tmpl"}, + }) + + q := r.URL.Query() + + page, _ := strconv.Atoi(q.Get("page")) + if page <= 0 { + page = 1 + } + perPage := 9 + + productModel := models.Product{} + products, totalRows, err := productModel.GetProducts(server.DB, perPage, page) + if err != nil { + return + } + + _ = totalRows + + _ = renderer.HTML(w, http.StatusOK, "products", map[string]interface{}{ + "products": products, + }) +} + +func (server *Server) GetProductByID(w http.ResponseWriter, r *http.Request) { + renderer := render.New(render.Options{ + Layout: "layout", + Extensions: []string{".html", ".tmpl"}, + }) + + vars := mux.Vars(r) + + if vars["slug"] == "" { + return + } + + productModel := models.Product{} + product, err := productModel.FindByID(server.DB, vars["slug"]) + if err != nil { + println(err.Error()) + return + } + + _ = renderer.HTML(w, http.StatusOK, "product", map[string]interface{}{ + "product": product, + "success": GetFlash(w, r, "success"), + "error": GetFlash(w, r, "error"), + }) +} diff --git a/app/models/ProductImage.go b/app/models/ProductImage.go new file mode 100644 index 0000000..fdafebb --- /dev/null +++ b/app/models/ProductImage.go @@ -0,0 +1,16 @@ +package models + +import "time" + +type ProductImage struct { + ID string `gorm:"size:36;not null;uniqueIndex;primary_key"` + Product Product + ProductID string `gorm:"size:36;index"` + Path string `gorm:"type:text"` + ExtraLarge string `gorm:"type:text"` + Large string `gorm:"type:text"` + Medium string `gorm:"type:text"` + Small string `gorm:"type:text"` + CreatedAt time.Time + UpdatedAt time.Time +} diff --git a/app/models/models.go b/app/models/models.go index 4264cf7..224909e 100644 --- a/app/models/models.go +++ b/app/models/models.go @@ -10,5 +10,6 @@ func RegisterModels() []Model { {Model: Product{}}, {Model: Category{}}, {Model: Section{}}, + {Model: ProductImage{}}, } } diff --git a/app/models/product.go b/app/models/product.go index abba99d..da75949 100644 --- a/app/models/product.go +++ b/app/models/product.go @@ -1,16 +1,55 @@ package models import ( + "github.com/shopspring/decimal" "gorm.io/gorm" "time" ) type Product struct { - ID string - ParentID string - Name string - Categories []Category `gorm:"many2many:product_categories;"` - CreatedAt time.Time - UpdatedAt time.Time - DeletedAt gorm.DeletedAt + ID string `gorm:"size:36;not null;uniqueIndex;primary_key"` + ParentID string `gorm:"size:36;index"` + Name string `gorm:"size:255"` + Slug string `gorm:"size:255"` + ProductImages []ProductImage + Price decimal.Decimal `gorm:"type:decimal(16,2);"` + Categories []Category `gorm:"many2many:product_categories;"` + ShortDescription string `gorm:"type:text"` + Description string `gorm:"type:text"` + + CreatedAt time.Time + UpdatedAt time.Time + DeletedAt gorm.DeletedAt +} + +func (p *Product) GetProducts(db *gorm.DB, perPage int, page int) (*[]Product, int64, error) { + + var count int64 + var products []Product + + err := db.Debug().Model(&Product{}).Count(&count).Error + if err != nil { + return nil, 0, err + } + + offset := (page - 1) * perPage + + err = db.Debug().Model(&Product{}).Order("created_at desc").Limit(perPage).Offset(offset).Find(&products).Error + if err != nil { + return nil, 0, err + } + return &products, count, nil +} + +func (p *Product) FindByID(db *gorm.DB, productID string) (*Product, error) { + var err error + var product Product + + err = db.Debug().Preload("ProductImages").Model(&Product{}).Where("id = ?", productID).First(&product).Error + //err = db.Debug().Model(&Product{}).Where("id = ?", productID).First(&product).Error + if err != nil { + return nil, err + } + + return &product, nil } diff --git a/docker-compose.yml b/docker-compose.yml index cdc036f..704a596 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,29 +31,17 @@ services: labels: # Frontend - "traefik.enable=true" - - "traefik.http.routers.hochzeit.entrypoints=http" - - "traefik.http.routers.hochzeit.rule=Host(`drone.cosysda.de`)" - - "traefik.http.middlewares.hochzeit-https-redirect.redirectscheme.scheme=https" - - "traefik.http.routers.hochzeit.middlewares=hochzeit-https-redirect" - - "traefik.http.routers.hochzeit-secure.entrypoints=https" - - "traefik.http.routers.hochzeit-secure.rule=Host(`drone.cosysda.de`)" - - "traefik.http.routers.hochzeit-secure.tls=true" - - "traefik.http.routers.hochzeit-secure.tls.certresolver=http" - - "traefik.http.routers.hochzeit-secure.service=hochzeit" - - "traefik.http.services.hochzeit.loadbalancer.server.port=9000" + - "traefik.http.routers.moretcg-shop.entrypoints=http" + - "traefik.http.routers.moretcg-shop.rule=Host(`drone.cosysda.de`)" + - "traefik.http.middlewares.moretcg-shop-https-redirect.redirectscheme.scheme=https" + - "traefik.http.routers.moretcg-shop.middlewares=moretcg-shop-https-redirect" + - "traefik.http.routers.moretcg-shop-secure.entrypoints=https" + - "traefik.http.routers.moretcg-shop-secure.rule=Host(`drone.cosysda.de`)" + - "traefik.http.routers.moretcg-shop-secure.tls=true" + - "traefik.http.routers.moretcg-shop-secure.tls.certresolver=http" + - "traefik.http.routers.moretcg-shop-secure.service=moretcg-shop" + - "traefik.http.services.moretcg-shop.loadbalancer.server.port=9000" - "traefik.docker.network=http_network" - #- "traefik.http.routers.frontend.entrypoints=websecure" - #- "traefik.http.services.frontend.loadbalancer.server.port=9000" - #- "traefik.http.routers.frontend.service=frontend" - #- "traefik.http.routers.frontend.tls.certresolver=leresolver" - # Edge - #- "traefik.http.routers.edge.rule=Host:edge.cosysda.de" - #- "traefik.http.routers.edge.entrypoints=websecure" - #- "traefik.http.services.edge.loadbalancer.server.port=8000" - #- "traefik.http.routers.edge.service=edge" - #- "traefik.http.routers.edge.tls.certresolver=leresolver" networks: - http_network - moretcg - #volumes: - #portainer_data: diff --git a/go.mod b/go.mod index b722241..50e670d 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/gorilla/mux v1.8.1 github.com/gorilla/sessions v1.2.2 github.com/joho/godotenv v1.5.1 + github.com/shopspring/decimal v1.3.1 github.com/unrolled/render v1.6.1 golang.org/x/crypto v0.14.0 gorm.io/driver/postgres v1.5.4 diff --git a/go.sum b/go.sum index e573273..ecdfb5c 100644 --- a/go.sum +++ b/go.sum @@ -25,6 +25,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= diff --git a/templates/pages/pagination.html b/templates/pages/pagination.html new file mode 100644 index 0000000..3384fad --- /dev/null +++ b/templates/pages/pagination.html @@ -0,0 +1,27 @@ +{{ define "pagination" }} +
{{ .product.ShortDescription }}
+{{ .product.Description }}
+25 products found of 1.342
+
+
+