208 lines
5.0 KiB
Go
208 lines
5.0 KiB
Go
package controllers
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"git.dynamicdiscord.de/kalipso/zineshop/models"
|
|
"git.dynamicdiscord.de/kalipso/zineshop/repositories"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type PrintController interface {
|
|
PrintVariantView(*gin.Context)
|
|
PrintCartView(*gin.Context)
|
|
PrintOrderView(*gin.Context)
|
|
PrintHandler(*gin.Context)
|
|
}
|
|
|
|
type printController struct{}
|
|
|
|
func NewPrintController() PrintController {
|
|
return &printController{}
|
|
}
|
|
|
|
func (rc *printController) PrintVariantView(c *gin.Context) {
|
|
variant, err := repositories.ShopItems.GetVariantById(c.Param("id"))
|
|
|
|
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 {
|
|
ShopItem models.ShopItem
|
|
ItemVariant models.ItemVariant
|
|
}
|
|
|
|
data := CreateSessionData(c, gin.H{
|
|
"itemVariants": []ShopItemVariantPair{
|
|
{ShopItem: shopItem, ItemVariant: variant},
|
|
},
|
|
})
|
|
|
|
fmt.Println(data)
|
|
|
|
c.HTML(http.StatusOK, "printvariant.html", data)
|
|
}
|
|
|
|
func (rc *printController) PrintCartView(c *gin.Context) {
|
|
sessionId := GetSessionId(c)
|
|
|
|
cartItems, err := repositories.CartItems.GetAllBySession(sessionId)
|
|
if err != nil {
|
|
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
|
|
return
|
|
}
|
|
|
|
paper, err := repositories.Papers.GetAll()
|
|
if err != nil {
|
|
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
|
|
return
|
|
}
|
|
|
|
data := CreateSessionData(c, gin.H{
|
|
"paper": paper,
|
|
"cartItems": cartItems,
|
|
})
|
|
|
|
c.HTML(http.StatusOK, "printvariant.html", data)
|
|
}
|
|
|
|
func (rc *printController) PrintOrderView(c *gin.Context) {
|
|
order, err := repositories.Orders.GetByToken(c.Param("token"))
|
|
|
|
if err != nil {
|
|
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
|
|
return
|
|
}
|
|
|
|
paper, err := repositories.Papers.GetAll()
|
|
if err != nil {
|
|
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
|
|
return
|
|
}
|
|
|
|
cartItems := order.CartItems
|
|
|
|
data := CreateSessionData(c, gin.H{
|
|
"paper": paper,
|
|
"cartItems": cartItems,
|
|
})
|
|
|
|
c.HTML(http.StatusOK, "printvariant.html", data)
|
|
}
|
|
|
|
func (rc *printController) PrintHandler(c *gin.Context) {
|
|
variantIds := c.PostFormArray("variant-id[]")
|
|
variantAmounts := c.PostFormArray("variant-amount[]")
|
|
variantPapertypes := c.PostFormArray("variant-papertype[]")
|
|
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
|
|
priceTotal := 0.0
|
|
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
|
|
}
|
|
|
|
paperType, err := repositories.Papers.GetById(fmt.Sprintf("%v", variantPapertypes[idx]))
|
|
if err != nil {
|
|
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
|
|
return
|
|
}
|
|
|
|
var coverPage *models.Paper
|
|
if variantCoverPages[idx] != "0" {
|
|
coverPageTmp, err := repositories.Papers.GetById(fmt.Sprintf("%v", variantCoverPages[idx]))
|
|
if err != nil {
|
|
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
|
|
return
|
|
}
|
|
|
|
coverPage = &coverPageTmp
|
|
}
|
|
|
|
variantAmount, err := strconv.Atoi(variantAmounts[idx])
|
|
if err != nil {
|
|
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
|
|
return
|
|
}
|
|
|
|
fmt.Println("Printing Costs:")
|
|
|
|
printJob, err := models.NewPrintJob(shopItem, variant, paperType, coverPage, uint(variantAmount))
|
|
|
|
if err != nil {
|
|
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
|
|
return
|
|
}
|
|
printJob.CalculatePrintCosts()
|
|
priceTotal += printJob.PriceTotal
|
|
printJobs = append(printJobs, printJob)
|
|
}
|
|
|
|
invoice := models.Invoice{
|
|
PrintJobs: printJobs,
|
|
PricePerClick: 0.002604,
|
|
PartCosts: 0.0067,
|
|
PriceTotal: priceTotal,
|
|
}
|
|
invoice, err := repositories.Invoices.Create(invoice)
|
|
|
|
if err != nil {
|
|
c.HTML(http.StatusBadRequest, "error.html", gin.H{"data": gin.H{"error": err}})
|
|
return
|
|
}
|
|
|
|
executeJobs := func() {
|
|
for _, printJob := range printJobs {
|
|
err := printJob.Execute()
|
|
|
|
if err == nil {
|
|
return
|
|
}
|
|
|
|
printJob.ShopItem.WasPrinted = true
|
|
_, err = repositories.ShopItems.Update(printJob.ShopItem)
|
|
|
|
if err != nil {
|
|
fmt.Printf("Error: %s\n", err)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
go executeJobs()
|
|
|
|
fmt.Println(invoice)
|
|
data := CreateSessionData(c, gin.H{
|
|
"invoice": invoice,
|
|
})
|
|
|
|
c.HTML(http.StatusOK, "printstarted.html", data)
|
|
}
|