Move Cake struct to separate models package

This commit is contained in:
bronku 2025-03-28 14:54:17 +01:00
parent e749e77a2a
commit 7ee564f6b2
7 changed files with 48 additions and 38 deletions

10
internal/models/data.go Normal file
View file

@ -0,0 +1,10 @@
package models
type Cake struct {
Name string
ID int
Price int
Amount int
Category string
Availability string
}

View file

@ -5,6 +5,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/Bronku/iroon/internal/models"
"github.com/Bronku/iroon/internal/store" "github.com/Bronku/iroon/internal/store"
) )
@ -21,7 +22,7 @@ func (h *Server) cakes(r *http.Request) (any, int, error) {
func (h *Server) cake(r *http.Request) (any, int, error) { func (h *Server) cake(r *http.Request) (any, int, error) {
url := strings.Split(r.URL.String(), "/") url := strings.Split(r.URL.String(), "/")
if len(url) < 3 || url[2] == "" { if len(url) < 3 || url[2] == "" {
return store.Cake{}, http.StatusOK, nil return models.Cake{}, http.StatusOK, nil
} }
id, err := strconv.Atoi(url[2]) id, err := strconv.Atoi(url[2])
@ -40,7 +41,7 @@ func (h *Server) cake(r *http.Request) (any, int, error) {
func (h *Server) order(r *http.Request) (any, int, error) { func (h *Server) order(r *http.Request) (any, int, error) {
type formData struct { type formData struct {
Order store.Order Order store.Order
Catalogue []store.Cake Catalogue []models.Cake
} }
var err error var err error
var data formData var data formData

View file

@ -7,6 +7,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/Bronku/iroon/internal/models"
"github.com/Bronku/iroon/internal/store" "github.com/Bronku/iroon/internal/store"
) )
@ -16,7 +17,7 @@ func (h *Server) postCake(r *http.Request) (any, int, error) {
return nil, http.StatusInternalServerError, err return nil, http.StatusInternalServerError, err
} }
var n store.Cake var n models.Cake
n.ID, err = strconv.Atoi(r.FormValue("id")) n.ID, err = strconv.Atoi(r.FormValue("id"))
if err != nil { if err != nil {
return nil, http.StatusBadRequest, err return nil, http.StatusBadRequest, err
@ -58,7 +59,7 @@ func (h *Server) postOrder(r *http.Request) (any, int, error) {
return nil, http.StatusBadRequest, err return nil, http.StatusBadRequest, err
} }
n.Cakes = make([]store.Cake, 0) n.Cakes = make([]models.Cake, 0)
for _, e := range cakes { for _, e := range cakes {
e.Amount, err = strconv.Atoi(r.FormValue(fmt.Sprintf("cake[%d]", e.ID))) e.Amount, err = strconv.Atoi(r.FormValue(fmt.Sprintf("cake[%d]", e.ID)))
if err != nil { if err != nil {

View file

@ -3,16 +3,9 @@ package store
import ( import (
"errors" "errors"
"fmt" "fmt"
)
type Cake struct { "github.com/Bronku/iroon/internal/models"
Name string )
ID int
Price int
Amount int
Category string
Availability string
}
func (s *Store) cakeCount() int { func (s *Store) cakeCount() int {
out := 0 out := 0
@ -26,8 +19,8 @@ func (s *Store) cakeCount() int {
return out return out
} }
func (s *Store) loadCakes() ([]Cake, error) { func (s *Store) loadCakes() ([]models.Cake, error) {
out := make([]Cake, 0, s.cakeCount()) out := make([]models.Cake, 0, s.cakeCount())
rows, err := s.db.Query("select id, name, price, category, availability from cake order by id asc;") rows, err := s.db.Query("select id, name, price, category, availability from cake order by id asc;")
if err != nil { if err != nil {
@ -36,7 +29,7 @@ func (s *Store) loadCakes() ([]Cake, error) {
defer rows.Close() defer rows.Close()
for rows.Next() { for rows.Next() {
var cake Cake var cake models.Cake
err = rows.Scan(&cake.ID, &cake.Name, &cake.Price, &cake.Category, &cake.Availability) err = rows.Scan(&cake.ID, &cake.Name, &cake.Price, &cake.Category, &cake.Availability)
if err != nil { if err != nil {
continue continue
@ -57,25 +50,25 @@ func (s *Store) searchCakes(id int) (int, error) {
return 0, errors.New("cake not found") return 0, errors.New("cake not found")
} }
func (s *Store) GetCake(id int) (Cake, error) { func (s *Store) GetCake(id int) (models.Cake, error) {
if id <= 0 { if id <= 0 {
return Cake{}, errors.New("Invalid cake id") return models.Cake{}, errors.New("Invalid cake id")
} }
i, err := s.searchCakes(id) i, err := s.searchCakes(id)
if err != nil { if err != nil {
return Cake{}, err return models.Cake{}, err
} }
return s.cakes[i], err return s.cakes[i], err
} }
func (s *Store) GetCakes() ([]Cake, error) { func (s *Store) GetCakes() ([]models.Cake, error) {
result := make([]Cake, len(s.cakes)) result := make([]models.Cake, len(s.cakes))
copy(result, s.cakes) copy(result, s.cakes)
return result, nil return result, nil
} }
func (s *Store) updateCake(newCake Cake) error { func (s *Store) updateCake(newCake models.Cake) error {
query := "update cake set name = ? , price = ?, category = ?, availability = ? where id = ?" query := "update cake set name = ? , price = ?, category = ?, availability = ? where id = ?"
_, err := s.db.Exec(query, newCake.Name, newCake.Price, newCake.Category, newCake.Availability, newCake.ID) _, err := s.db.Exec(query, newCake.Name, newCake.Price, newCake.Category, newCake.Availability, newCake.ID)
if err != nil { if err != nil {
@ -95,7 +88,7 @@ func (s *Store) SyncCakes() error {
return nil return nil
} }
func (s *Store) SaveCake(newCake Cake) (int, error) { func (s *Store) SaveCake(newCake models.Cake) (int, error) {
if newCake.ID != 0 { if newCake.ID != 0 {
return newCake.ID, s.updateCake(newCake) return newCake.ID, s.updateCake(newCake)
} }

View file

@ -4,6 +4,8 @@ import (
"errors" "errors"
"strconv" "strconv"
"time" "time"
"github.com/Bronku/iroon/internal/models"
) )
type Order struct { type Order struct {
@ -16,7 +18,7 @@ type Order struct {
Accepted time.Time Accepted time.Time
Status string Status string
Paid int // increments of 0.01 Paid int // increments of 0.01
Cakes []Cake Cakes []models.Cake
} }
func (s *Store) GetOrder(id int) (Order, error) { func (s *Store) GetOrder(id int) (Order, error) {
@ -36,14 +38,14 @@ func (s *Store) GetOrder(id int) (Order, error) {
out.Accepted, _ = time.Parse("2006-01-02 15:04", order_date) out.Accepted, _ = time.Parse("2006-01-02 15:04", order_date)
out.Date, _ = time.Parse("2006-01-02 15:04", delivery_date) out.Date, _ = time.Parse("2006-01-02 15:04", delivery_date)
out.Cakes = make([]Cake, 0) out.Cakes = make([]models.Cake, 0)
rows, err := s.db.Query("select cake, amount from ordered_cake where customer_order = ?;", id) rows, err := s.db.Query("select cake, amount from ordered_cake where customer_order = ?;", id)
if err != nil { if err != nil {
return out, err return out, err
} }
defer rows.Close() defer rows.Close()
for rows.Next() { for rows.Next() {
var newCake Cake var newCake models.Cake
err = rows.Scan(&newCake.ID, &newCake.Amount) err = rows.Scan(&newCake.ID, &newCake.Amount)
if err != nil { if err != nil {
return out, err return out, err
@ -78,7 +80,7 @@ func (s *Store) GetOrders() ([]Order, error) {
o.Accepted, _ = time.Parse("2006-01-02 15:04", order_date) o.Accepted, _ = time.Parse("2006-01-02 15:04", order_date)
o.Date, _ = time.Parse("2006-01-02 15:04", delivery_date) o.Date, _ = time.Parse("2006-01-02 15:04", delivery_date)
o.Cakes = make([]Cake, 0) o.Cakes = make([]models.Cake, 0)
rows, err := s.db.Query("select cake, amount from ordered_cake where customer_order = ?;", o.ID) rows, err := s.db.Query("select cake, amount from ordered_cake where customer_order = ?;", o.ID)
if err != nil { if err != nil {
@ -86,7 +88,7 @@ func (s *Store) GetOrders() ([]Order, error) {
} }
defer rows.Close() defer rows.Close()
for rows.Next() { for rows.Next() {
var newCake Cake var newCake models.Cake
err = rows.Scan(&newCake.ID, &newCake.Amount) err = rows.Scan(&newCake.ID, &newCake.Amount)
if err != nil { if err != nil {
return out, err return out, err

View file

@ -4,12 +4,13 @@ import (
"database/sql" "database/sql"
"log" "log"
"github.com/Bronku/iroon/internal/models"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
) )
type Store struct { type Store struct {
db *sql.DB db *sql.DB
cakes []Cake cakes []models.Cake
} }
func OpenStore(filename string) *Store { func OpenStore(filename string) *Store {

View file

@ -3,6 +3,8 @@ package store
import ( import (
"testing" "testing"
"time" "time"
"github.com/Bronku/iroon/internal/models"
) )
func TestStore(t *testing.T) { func TestStore(t *testing.T) {
@ -26,7 +28,7 @@ func TestStore(t *testing.T) {
} }
// create new cake // create new cake
newCake := Cake{Name: "Chocolate Cake", Price: 2500} newCake := models.Cake{Name: "Chocolate Cake", Price: 2500}
newCake.ID, err = s.SaveCake(newCake) newCake.ID, err = s.SaveCake(newCake)
if err != nil { if err != nil {
t.Fatalf("Failed to save new cake: %v", err) t.Fatalf("Failed to save new cake: %v", err)
@ -36,7 +38,7 @@ func TestStore(t *testing.T) {
} }
// create another cake // create another cake
anotherCake := Cake{Name: "Another Cake", Price: 3000} anotherCake := models.Cake{Name: "Another Cake", Price: 3000}
anotherCake.ID, err = s.SaveCake(anotherCake) anotherCake.ID, err = s.SaveCake(anotherCake)
if err != nil { if err != nil {
t.Fatalf("Failed to save new cake: %v", err) t.Fatalf("Failed to save new cake: %v", err)
@ -57,7 +59,7 @@ func TestStore(t *testing.T) {
} }
// Update Non-existing Cake // Update Non-existing Cake
var updatedCake Cake var updatedCake models.Cake
updatedCake.ID = 10 updatedCake.ID = 10
_, err = s.SaveCake(updatedCake) _, err = s.SaveCake(updatedCake)
if err == nil { if err == nil {
@ -117,7 +119,7 @@ func TestStore(t *testing.T) {
Date: now.Add(time.Hour * 24), Date: now.Add(time.Hour * 24),
Status: "Pending", Status: "Pending",
Paid: 1000, Paid: 1000,
Cakes: []Cake{{ID: newCake.ID, Amount: 2}, {ID: anotherCake.ID, Amount: 10}}, Cakes: []models.Cake{{ID: newCake.ID, Amount: 2}, {ID: anotherCake.ID, Amount: 10}},
} }
newOrder.ID, err = s.SaveOrder(newOrder) newOrder.ID, err = s.SaveOrder(newOrder)
if err != nil { if err != nil {
@ -137,7 +139,7 @@ func TestStore(t *testing.T) {
Date: now.Add(time.Hour * 192), Date: now.Add(time.Hour * 192),
Status: "Accepted", Status: "Accepted",
Paid: 1500, Paid: 1500,
Cakes: []Cake{{ID: newCake.ID, Amount: 100}}, Cakes: []models.Cake{{ID: newCake.ID, Amount: 100}},
} }
anotherOrder.ID, err = s.SaveOrder(anotherOrder) anotherOrder.ID, err = s.SaveOrder(anotherOrder)
if err != nil { if err != nil {
@ -243,13 +245,13 @@ func TestStore(t *testing.T) {
} }
func TestSliceComparison(t *testing.T) { func TestSliceComparison(t *testing.T) {
a := []Cake{ a := []models.Cake{
{Name: "ok", Price: 100, ID: 12, Amount: 10}, {Name: "ok", Price: 100, ID: 12, Amount: 10},
{Name: "ok", Price: 11, ID: 13, Amount: 1}, {Name: "ok", Price: 11, ID: 13, Amount: 1},
{Name: "ok", Price: 100, ID: 10, Amount: 11}, {Name: "ok", Price: 100, ID: 10, Amount: 11},
} }
b := []Cake{ b := []models.Cake{
{Name: "okas", Price: 110, ID: 12, Amount: 10}, {Name: "okas", Price: 110, ID: 12, Amount: 10},
{Name: "oksa", Price: 11, ID: 13, Amount: 1}, {Name: "oksa", Price: 11, ID: 13, Amount: 1},
{Name: "oasdk", Price: 101, ID: 10, Amount: 11}, {Name: "oasdk", Price: 101, ID: 10, Amount: 11},
@ -259,11 +261,11 @@ func TestSliceComparison(t *testing.T) {
} }
} }
func areCakesEqual(a, b Cake) bool { func areCakesEqual(a, b models.Cake) bool {
return a.ID == b.ID && a.Amount == b.Amount return a.ID == b.ID && a.Amount == b.Amount
} }
func areCakeSlicesEqual(a, b []Cake) bool { func areCakeSlicesEqual(a, b []models.Cake) bool {
if len(a) != len(b) { if len(a) != len(b) {
return false return false
} }