From f87a6352dd5897fb7511decf6e30910b9347f6c0 Mon Sep 17 00:00:00 2001
From: kalipso
Date: Thu, 10 Apr 2025 14:26:20 +0200
Subject: [PATCH] implement dummy printer
---
controllers/printController.go | 95 ++++++++++++++++++++++++++++------
main.go | 4 +-
models/printer.go | 55 ++++++++++++++++++++
views/printvariant.html | 71 ++++++++++++-------------
4 files changed, 170 insertions(+), 55 deletions(-)
create mode 100644 models/printer.go
diff --git a/controllers/printController.go b/controllers/printController.go
index a1c5d37..e8fa36f 100644
--- a/controllers/printController.go
+++ b/controllers/printController.go
@@ -3,6 +3,7 @@ package controllers
import (
"fmt"
"net/http"
+ "strconv"
"example.com/gin/test/models"
"example.com/gin/test/repositories"
@@ -11,7 +12,8 @@ import (
type PrintController interface {
PrintVariantView(*gin.Context)
- PrintVariantHandler(*gin.Context)
+ PrintCartView(*gin.Context)
+ PrintHandler(*gin.Context)
}
type printController struct{}
@@ -25,12 +27,14 @@ func (rc *printController) PrintVariantView(c *gin.Context) {
if err != nil {
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
+ return
}
shopItem, err := repositories.ShopItems.GetById(fmt.Sprintf("%v", variant.ShopItemID))
if err != nil {
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
+ return
}
type ShopItemVariantPair struct {
@@ -49,27 +53,86 @@ func (rc *printController) PrintVariantView(c *gin.Context) {
c.HTML(http.StatusOK, "printvariant.html", data)
}
-func (rc *printController) PrintVariantHandler(c *gin.Context) {
- err := repositories.ShopItems.DeleteById(c.Param("id"))
+func (rc *printController) PrintCartView(c *gin.Context) {
+ sessionId := GetSessionId(c)
+ cartItems, err := repositories.CartItems.GetAllBySession(sessionId)
if err != nil {
- data := CreateSessionData(c, gin.H{
- "error": err,
- "success": "",
- })
-
- c.HTML(http.StatusOK, "deleteitem.html", data)
+ c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
+ return
}
- shopItems, _ := repositories.ShopItems.GetAll()
- fmt.Println(len(shopItems))
+ type ShopItemVariantPair struct {
+ ShopItem models.ShopItem
+ ItemVariant models.ItemVariant
+ }
+
+ var items []ShopItemVariantPair
+ for _, cartItem := range cartItems {
+ items = append(items, ShopItemVariantPair{ShopItem: cartItem.ShopItem, ItemVariant: cartItem.ItemVariant})
+ }
data := CreateSessionData(c, gin.H{
- "title": "shopItem Page",
- "shopItems": shopItems,
+ "itemVariants": items,
})
- fmt.Println(data)
-
- c.HTML(http.StatusOK, "index.html", data)
+ c.HTML(http.StatusOK, "printvariant.html", data)
+}
+
+func (rc *printController) PrintHandler(c *gin.Context) {
+ variantIds := c.PostFormArray("variant-id[]")
+ variantAmounts := c.PostFormArray("variant-amount[]")
+ variantCoverPages := c.PostFormArray("variant-coverpage[]")
+
+ if len(variantIds) != len(variantAmounts) || len(variantIds) != len(variantCoverPages) {
+ c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": "Invalid arguments"}})
+ return
+ }
+
+ var printJobs []models.PrintJob
+ for idx := range variantIds {
+ variant, err := repositories.ShopItems.GetVariantById(variantIds[idx])
+
+ if err != nil {
+ c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
+ return
+ }
+
+ shopItem, err := repositories.ShopItems.GetById(fmt.Sprintf("%v", variant.ShopItemID))
+
+ if err != nil {
+ c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
+ return
+ }
+
+ coverPage := false
+ if variantCoverPages[idx] == "1" {
+ coverPage = true
+ }
+
+ variantAmount, err := strconv.Atoi(variantAmounts[idx])
+ if err != nil {
+ c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
+ return
+ }
+
+ printJob, err := models.NewPrintJob(shopItem, variant, coverPage, uint(variantAmount))
+
+ if err != nil {
+ c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
+ return
+ }
+
+ printJobs = append(printJobs, printJob)
+ }
+
+ executeJobs := func() {
+ for _, printJob := range printJobs {
+ printJob.Execute()
+ }
+ }
+
+ go executeJobs()
+
+ c.HTML(http.StatusOK, "index.html", nil)
}
diff --git a/main.go b/main.go
index 7403758..b8e7b8e 100644
--- a/main.go
+++ b/main.go
@@ -83,7 +83,9 @@ func main() {
viewRoutes.GET("/shopitems/:id/delete", authValidator.RequireAuth, shopItemController.DeleteItemView)
viewRoutes.POST("/shopitems/:id/delete", authValidator.RequireAuth, shopItemController.DeleteItemHandler)
viewRoutes.GET("/variant/:id/print", authValidator.RequireAuth, printController.PrintVariantView)
- viewRoutes.POST("/variant/:id/print", authValidator.RequireAuth, printController.PrintVariantHandler)
+ viewRoutes.GET("/cart/print", authValidator.RequireAuth, printController.PrintCartView)
+ viewRoutes.POST("/print", authValidator.RequireAuth, printController.PrintHandler)
+
viewRoutes.GET("/tags", authValidator.RequireAuth, shopItemController.TagView)
viewRoutes.POST("/tags/:id", authValidator.RequireAuth, shopItemController.TagHandler)
viewRoutes.POST("/tags", authValidator.RequireAuth, shopItemController.AddTagHandler)
diff --git a/models/printer.go b/models/printer.go
new file mode 100644
index 0000000..d307cb5
--- /dev/null
+++ b/models/printer.go
@@ -0,0 +1,55 @@
+package models
+
+import (
+ "fmt"
+)
+
+type PrintOption string
+
+const (
+ CoverPage PrintOption = "-o FrontCoverPage=Printed -o FrontCoverTray=BypassTray -o InputSlot=Tray1"
+ Colored PrintOption = "-o SelectColor=Color"
+ Grayscale PrintOption = "-o SelectColor=Grayscale"
+)
+
+type PrintJob struct {
+ Pdf string
+ Amount uint
+ Options []PrintOption
+}
+
+func NewPrintJob(shopItem ShopItem, variant ItemVariant, coverPage bool, amount uint) (PrintJob, error) {
+ if shopItem.Pdf == "" {
+ return PrintJob{}, fmt.Errorf("ShopItem has no PDF assigned")
+ }
+
+ if amount > 100 {
+ return PrintJob{}, fmt.Errorf("Amount to big. This is denied for security reasons")
+ }
+
+ var result PrintJob
+ result.Pdf = shopItem.Pdf
+ result.Amount = amount
+
+ if variant.Name == "Colored" {
+ result.Options = append(result.Options, Colored)
+ }
+
+ if coverPage {
+ result.Options = append(result.Options, CoverPage)
+ }
+
+ return result, nil
+}
+
+func (p *PrintJob) Execute() error {
+ baseCommand := "lp -p KONICA_MINOLTA_KONICA_MINOLTA_bizhub_C258/Booklet "
+ baseCommand += fmt.Sprintf("-n %v ", p.Amount)
+
+ for _, option := range p.Options {
+ baseCommand += fmt.Sprintf(" %v ", option)
+ }
+
+ fmt.Println(baseCommand)
+ return nil
+}
diff --git a/views/printvariant.html b/views/printvariant.html
index 5dff735..f5bb36a 100644
--- a/views/printvariant.html
+++ b/views/printvariant.html
@@ -17,52 +17,47 @@
-
+
+
If CoverPage selected, make sure you put paper in the BypassTray
+
+
+