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
+ +