Move Cake struct to separate models package
This commit is contained in:
parent
e749e77a2a
commit
7ee564f6b2
7 changed files with 48 additions and 38 deletions
10
internal/models/data.go
Normal file
10
internal/models/data.go
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
type Cake struct {
|
||||||
|
Name string
|
||||||
|
ID int
|
||||||
|
Price int
|
||||||
|
Amount int
|
||||||
|
Category string
|
||||||
|
Availability string
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue