moved to gorm

This commit is contained in:
Bronku 2025-07-07 11:30:28 +02:00
parent 66884c64bb
commit a074f264df
30 changed files with 247 additions and 1040 deletions

View file

@ -2,12 +2,14 @@ package server
import (
"fmt"
"log"
"net/http"
"strconv"
"strings"
"time"
"github.com/Bronku/iroon/models"
"gorm.io/gorm/clause"
)
func monthInterval(y int, m time.Month) (firstDay, lastDay time.Time) {
@ -24,13 +26,18 @@ func (h *Server) orders(_ *http.Request) (any, int, error) {
y, m, _ = time.Now().Date()
first, last := monthInterval(y, m)
fmt.Println(first, last)
orders, err := h.s.GetOrders(first, last)
var orders []models.Order
result := h.db.Preload("OrderItems.Product").Preload(clause.Associations).Where("date between ? and ?", first, last).Find(&orders)
if result.Error != nil {
log.Println("eroor getting orders")
return nil, http.StatusInternalServerError, result.Error
}
data := struct {
First string
Last string
Orders []models.Order
}{first.Format("2006-01-02"), last.Format("2006-01-02"), orders}
return data, http.StatusOK, err
return data, http.StatusOK, nil
}
func (h *Server) ordersSearch(r *http.Request) (any, int, error) {
@ -42,20 +49,21 @@ func (h *Server) ordersSearch(r *http.Request) (any, int, error) {
if err != nil {
to = time.Time{}
}
fmt.Println(from, to)
data, err := h.s.GetOrders(from, to)
return data, http.StatusOK, err
var orders []models.Order
result := h.db.Preload("OrderItems.Product").Preload(clause.Associations).Where("date between ? and ?", from, to).Find(&orders)
return orders, http.StatusOK, result.Error
}
func (h *Server) cakes(_ *http.Request) (any, int, error) {
data, err := h.s.GetCakes()
return data, http.StatusOK, err
var cakes []models.Product
result := h.db.Find(&cakes)
return cakes, http.StatusOK, result.Error
}
func (h *Server) cake(r *http.Request) (any, int, error) {
url := strings.Split(r.URL.String(), "/")
if len(url) < 3 || url[2] == "" {
return models.Cake{}, http.StatusOK, nil
return models.Product{}, http.StatusOK, nil
}
id, err := strconv.Atoi(url[2])
@ -63,25 +71,21 @@ func (h *Server) cake(r *http.Request) (any, int, error) {
return nil, http.StatusBadRequest, err
}
data, err := h.s.GetCake(id)
if err != nil {
return nil, http.StatusNotFound, err
}
return data, http.StatusOK, nil
var cake models.Product
result := h.db.First(&cake, id)
return cake, http.StatusOK, result.Error
}
func (h *Server) order(r *http.Request) (any, int, error) {
type formData struct {
Order models.Order
Catalogue []models.Cake
Catalogue []models.Product
}
var err error
var data formData
data.Catalogue, err = h.s.GetCakes()
if err != nil {
return nil, http.StatusInternalServerError, err
result := h.db.Find(&data.Catalogue)
if result.Error != nil {
return nil, http.StatusInternalServerError, result.Error
}
url := strings.Split(r.URL.String(), "/")
@ -94,9 +98,10 @@ func (h *Server) order(r *http.Request) (any, int, error) {
return nil, http.StatusBadRequest, err
}
data.Order, err = h.s.GetOrder(id)
if err != nil {
return nil, http.StatusNotFound, err
result = h.db.Preload("OrderItems.Product").Preload(clause.Associations).Find(&data.Order, id)
//result = h.db.Find(&data.Order, id)
if result.Error != nil {
return nil, http.StatusNotFound, result.Error
}
return data, http.StatusOK, nil

View file

@ -2,6 +2,7 @@ package server
import (
"fmt"
"log"
"net/http"
"strconv"
"strings"
@ -10,47 +11,50 @@ import (
"github.com/Bronku/iroon/models"
)
func atoui(input string) (uint, error) {
num, err := strconv.ParseUint(input, 10, 0)
return uint(num), err
}
func (h *Server) postCake(r *http.Request) (any, int, error) {
err := r.ParseForm()
if err != nil {
return nil, http.StatusInternalServerError, err
}
var n models.Cake
n.ID, err = strconv.Atoi(r.FormValue("id"))
var n models.Product
n.ID, err = atoui(r.FormValue("id"))
if err != nil {
return nil, http.StatusBadRequest, err
}
n.Name = r.FormValue("name")
n.Price, err = strconv.Atoi(r.FormValue("price"))
n.Price, err = atoui(r.FormValue("price"))
if err != nil {
return nil, http.StatusBadRequest, err
}
n.Category = r.FormValue("category")
n.Availability = r.FormValue("availability")
n.ID, err = h.s.SaveCake(n)
fmt.Println(err)
return n, http.StatusAccepted, err
result := h.db.Save(&n)
return n, http.StatusAccepted, result.Error
}
func (h *Server) postOrder(r *http.Request) (any, int, error) {
cakes, err := h.s.GetCakes()
if err != nil {
return nil, http.StatusInternalServerError, err
var cakes []models.Product
result := h.db.Find(&cakes)
if result.Error != nil {
return nil, http.StatusInternalServerError, result.Error
}
err = r.ParseForm()
fmt.Println(r.PostForm)
err := r.ParseForm()
log.Println("received form:", r.PostForm)
if err != nil {
return nil, http.StatusBadRequest, err
}
var n models.Order
n.ID, err = strconv.Atoi(r.FormValue("id"))
n.ID, err = atoui(r.FormValue("id"))
if err != nil {
return nil, http.StatusBadRequest, err
}
n.Paid, err = strconv.Atoi(r.FormValue("paid"))
n.Prepaid, err = atoui(r.FormValue("paid"))
if err != nil {
return nil, http.StatusBadRequest, err
}
@ -59,23 +63,29 @@ func (h *Server) postOrder(r *http.Request) (any, int, error) {
return nil, http.StatusBadRequest, err
}
n.Cakes = make([]models.Cake, 0)
n.OrderItems = make([]models.OrderItem, 0)
for _, e := range cakes {
e.Amount, err = strconv.Atoi(r.FormValue(fmt.Sprintf("cake[%d]", e.ID)))
count, err := atoui(r.FormValue(fmt.Sprintf("cake[%d]", e.ID)))
if err != nil {
continue
}
n.Cakes = append(n.Cakes, e)
n.OrderItems = append(n.OrderItems, models.OrderItem{Amount: count, Product: e})
}
n.Accepted = time.Now()
n.Name = strings.TrimSpace(r.FormValue("name"))
n.Surname = strings.TrimSpace(r.FormValue("surname"))
n.Phone = strings.TrimSpace(r.FormValue("phone"))
n.Location = strings.TrimSpace(r.FormValue("location"))
n.Status = strings.TrimSpace(r.FormValue("status"))
n.ID, err = h.s.SaveOrder(n)
fmt.Println(n)
return n, http.StatusAccepted, err
log.Println("parsed order:", n)
err = h.db.Save(&n).Error
if err != nil {
log.Println("save: ", err)
}
err = h.db.Model(&n).Association("OrderItems").Replace(n.OrderItems)
if err != nil {
log.Println("replace: ", err)
}
return n, http.StatusAccepted, nil
}

View file

@ -5,12 +5,12 @@ import (
"html/template"
"net/http"
"github.com/Bronku/iroon/store"
"gorm.io/gorm"
)
type Server struct {
tmpl map[string]*template.Template
s *store.Store
db *gorm.DB
routes map[string]route
http.Handler
}
@ -21,9 +21,6 @@ type route struct {
templateEntry string
}
func (h *Server) Close() {
}
//go:embed static/*
var static embed.FS
@ -42,8 +39,10 @@ func (h *Server) loadHandler() {
h.Handler = mux
}
func New(store *store.Store) *Server {
var server Server
func New(db *gorm.DB) *Server {
server := Server{
db: db,
}
server.routes = map[string]route{
"GET /order/": {server.order, "order", "layout"},
@ -56,7 +55,7 @@ func New(store *store.Store) *Server {
}
server.loadTemplates()
server.s = store
server.loadHandler()
return &server

View file

@ -3,7 +3,7 @@ function addCake(id, name, price, amount) {
if (cake != null) {
cake.value = Number(cake.value) + 1;
let tr = cake.parentElement.parentElement.parentElement;
console.log(tr);
//console.log(tr);
tr.querySelector(".cake-total").innerText =
`${price * Number(cake.value)}PLN`;
updateTotalPrice();
@ -41,7 +41,7 @@ function totalPrice() {
let price = Number(priceString.substring(0, priceString.length - 3));
let amount = Number(e.querySelector("input").value);
out += price * amount;
console.log(out);
// console.log(out);
});
return out;
}

View file

@ -17,18 +17,6 @@ Cake {{.ID}}
<label>
<input type="number" name="price" min="0" value="{{.Price}}">
</label>
<label>category</label>
<label for="category"></label><select name="category" id="category" >
<option {{ if eq .Category "common" }}selected{{ end }} value="common">common</option>
<option {{ if eq .Category "christmas" }}selected{{ end }} value="christmas">christmas</option>
<option {{ if eq .Category "easter" }}selected{{ end }} value="easter">easter</option>
<option {{ if eq .Category "donuts" }}selected{{ end }} value="donuts">donuts</option>
</select>
<label>availability</label>
<label for="availability"></label><select name="availability" id="availability" >
<option {{ if eq .Availability "available" }}selected{{ end }} value="available">available</option>
<option {{ if eq .Availability "unavailable" }}selected{{ end }} value="unavailable">unavailable</option>
</select>
</div>
<button type="submit">submit</button>
</form>

View file

@ -8,16 +8,12 @@ Cakes
<th></th>
<th>Name</th>
<th>Price</th>
<th>Category</th>
<th>Availability</th>
</tr>
{{range .}}
<tr>
<th><a href="/cake/{{.ID}}">edit</a></th>
<th>{{.Name}}</th>
<th>{{.Price}}</th>
<th>{{.Category}}</th>
<th>{{.Availability}}</th>
</tr>
{{end}}
</table>

View file

@ -31,7 +31,11 @@
</select>
</label>
<label>Data dostawy
<input type="date" name="date" value="{{.Date.Format "2006-01-02"}}">
{{if .ID}}
<input type="date" name="date" value="{{.Date.Format "2006-01-02"}}" required>
{{else}}
<input type="date" name="date" required>
{{end}}
</label>
<label>Status
<select name="status">
@ -40,7 +44,7 @@
</select>
</label>
<label>Zaliczka
<input type="number" name="paid" min="0" value="{{.Paid}}">
<input type="number" name="paid" min="0" value="{{.Prepaid}}">
</label>
</div>
<div>
@ -52,7 +56,7 @@
<ul id="basket" class="scrollable">
</ul>
</div>
<div>
<label>
<small>Total:</small><br>
@ -69,7 +73,7 @@
<table>
{{range .}}
<tr>
<th>{{.Name}}<br><small>{{.Category}} (#{{.ID}})</small></th>
<th>{{.Name}}<br><small>#{{.ID}}</small></th>
<th>{{.Price}}PLN</th>
<th>
<button type=button onClick="addCake({{.ID}},{{.Name}}, {{.Price}}, 1)">
@ -102,8 +106,8 @@
</tr>
</template>
<script>
{{range .Order.Cakes}}
addCake({{.ID}},{{.Name}}, {{.Price}}, {{.Amount}})
{{range .Order.OrderItems}}
addCake({{.ProductID}},{{.Product.Name}}, {{.Product.Price}}, {{.Amount}})
{{end}}
</script>
{{end}}

View file

@ -59,10 +59,10 @@ Zamówienia
{{end}}
{{define "order_info"}}
<table>
{{range .Cakes}}
{{range .OrderItems}}
<tr>
<th>{{.Name}}<br><small>ID: {{.ID}}</small></th>
<th><small>Cena:</small><br>{{.Price}} PLN</th>
<th>{{.Product.Name}}<br><small>ID: {{.ProductID}}</small></th>
<th><small>Cena:</small><br>{{.Product.Price}} PLN</th>
<th><small>Ilość:</small><br>{{.Amount}}</th>
<th><small>Razem:</small><br>{{.Total}} PLN</th>
</tr>