Reorganize project structure and fix SQLite usage

This commit is contained in:
bronku 2025-03-23 10:45:42 +01:00
parent 0e762841a3
commit e2dda0ade7
20 changed files with 76 additions and 46 deletions

23
cmd/iroon/main.go Normal file
View file

@ -0,0 +1,23 @@
package iroon
import (
"log"
"net/http"
"github.com/Bronku/iroon/internal/auth"
"github.com/Bronku/iroon/internal/logging"
"github.com/Bronku/iroon/internal/server"
)
func Run() {
h, err := server.New()
if err != nil {
log.Fatal(err)
}
defer h.Close()
var handler http.Handler = h
handler = logging.Middleware(handler)
handler = auth.New().Middleware(handler)
log.Fatal(http.ListenAndServe(":8080", handler))
}

View file

@ -5,7 +5,7 @@ import (
"strconv"
"strings"
"github.com/Bronku/iroon/store"
"github.com/Bronku/iroon/internal/store"
)
func (h *Server) index(r *http.Request) (any, int, error) {

View file

@ -7,7 +7,7 @@ import (
"strings"
"time"
"github.com/Bronku/iroon/store"
"github.com/Bronku/iroon/internal/store"
)
func (h *Server) postOrder(r *http.Request) (any, int, error) {

View file

@ -4,7 +4,7 @@ import (
"html/template"
"net/http"
"github.com/Bronku/iroon/store"
"github.com/Bronku/iroon/internal/store"
)
type Server struct {

View file

@ -22,3 +22,5 @@ create table ordered_cake (
amount integer not null,
primary key (customer_order, cake)
);
PRAGMA user_version = 1;

View file

@ -4,7 +4,6 @@ import (
"database/sql"
_ "embed"
"errors"
"os"
"strconv"
"time"
@ -21,11 +20,13 @@ type Store struct {
func OpenStore(filename string) (*Store, error) {
var out Store
var err error
_, err = os.Stat(filename)
if errors.Is(err, os.ErrNotExist) {
defer out.loadSchema()
}
out.db, err = sql.Open("sqlite3", filename)
if err != nil {
return &out, err
}
err = out.loadSchema()
return &out, err
}
@ -35,10 +36,27 @@ func (s *Store) Close() {
}
}
func (s *Store) version() int {
out := -1
row, err := s.db.Query("PRAGMA user_version;")
if err != nil {
return out
}
defer row.Close()
row.Next()
_ = row.Scan(&out)
return out
}
func (s *Store) loadSchema() error {
if s.db == nil {
return errors.New("database doesn't exist")
}
if s.version() == 1 {
return nil
}
_, err := s.db.Exec(schema)
return err
}
@ -83,11 +101,13 @@ func (s *Store) SaveCake(newCake Cake) (int, error) {
row, err := s.db.Query(query, newCake.Name, newCake.Price)
if err != nil {
return -1, err
return 0, err
}
defer row.Close()
row.Next()
if !row.Next() {
return 0, errors.New("The database didn't respond with an id")
}
err = row.Scan(&newCake.ID)
return newCake.ID, err
}
@ -95,10 +115,10 @@ func (s *Store) SaveCake(newCake Cake) (int, error) {
func (s *Store) GetOrder(id int) (Order, error) {
var out Order
row, err := s.db.Query("select id, name, surname, phone, location, order_date, delivery_date, status, paid from customer_order where id = ?;", id)
defer row.Close()
if err != nil {
return out, err
}
defer row.Close()
var order_date, delivery_date string
row.Next()
@ -187,22 +207,25 @@ func (s *Store) SaveOrder(newOrder Order) (int, error) {
}
tx, err := s.db.Begin()
if err != nil {
return -1, nil
return 0, err
}
accepted := newOrder.Accepted.Format("2006-01-02 15:04")
date := newOrder.Date.Format("2006-01-02 15:04")
row, err := tx.Query(query, newOrder.Name, newOrder.Surname, newOrder.Phone, newOrder.Location, accepted, date, newOrder.Status, newOrder.Paid)
if err != nil {
tx.Rollback()
return -1, err
_ = tx.Rollback()
return 0, err
}
defer row.Close()
row.Next()
if !row.Next() {
_ = tx.Rollback()
return 0, errors.New("The database didn't respond with an id")
}
err = row.Scan(&newOrder.ID)
if err != nil {
tx.Rollback()
_ = tx.Rollback()
return newOrder.ID, err
}
@ -210,7 +233,7 @@ func (s *Store) SaveOrder(newOrder Order) (int, error) {
query = "delete from ordered_cake where customer_order = ?;"
_, err = tx.Exec(query, newOrder.ID)
if err != nil {
tx.Rollback()
_ = tx.Rollback()
return newOrder.ID, err
}
@ -219,7 +242,7 @@ func (s *Store) SaveOrder(newOrder Order) (int, error) {
for _, e := range newOrder.Cakes {
_, err := tx.Exec(query, newOrder.ID, e.ID, e.Amount)
if err != nil {
tx.Rollback()
_ = tx.Rollback()
return newOrder.ID, err
}
}

View file

@ -29,7 +29,7 @@ func TestStore(t *testing.T) {
}
// create new cake
newCake := Cake{Name: "Chocolate Cake", ID: -1, Price: 2500, Amount: -1}
newCake := Cake{Name: "Chocolate Cake", Price: 2500}
newCake.ID, err = s.SaveCake(newCake)
if err != nil {
t.Fatalf("Failed to save new cake: %v", err)
@ -39,7 +39,7 @@ func TestStore(t *testing.T) {
}
// create another cake
anotherCake := Cake{Name: "Another Cake", ID: -1, Price: 3000, Amount: -1}
anotherCake := Cake{Name: "Another Cake", Price: 3000}
anotherCake.ID, err = s.SaveCake(anotherCake)
if err != nil {
t.Fatalf("Failed to save new cake: %v", err)
@ -112,7 +112,6 @@ func TestStore(t *testing.T) {
// create new order
now := time.Now()
newOrder := Order{
ID: -1,
Name: "John",
Surname: "Doe",
Phone: "123-456-7890",
@ -133,7 +132,6 @@ func TestStore(t *testing.T) {
// create another order
anotherOrder := Order{
ID: -1,
Name: "Jane",
Surname: "Doe",
Phone: "123-456-7890",
@ -198,8 +196,8 @@ func TestStore(t *testing.T) {
newOrder.Phone != orders[newOrderPos].Phone ||
newOrder.Status != orders[newOrderPos].Status ||
newOrder.Location != orders[newOrderPos].Location ||
newOrder.Accepted.Format("2006-01-02 15:04") != newOrder.Accepted.Format("2006-01-02 15:04") ||
newOrder.Date.Format("2006-01-02 15:04") != newOrder.Date.Format("2006-01-02 15:04") {
newOrder.Accepted.Format("2006-01-02 15:04") != orders[newOrderPos].Accepted.Format("2006-01-02 15:04") ||
newOrder.Date.Format("2006-01-02 15:04") != orders[newOrderPos].Date.Format("2006-01-02 15:04") {
t.Errorf("Want %v\nGot %v", newOrder, orders[newOrderPos])
}
if !areCakeSlicesEqual(newOrder.Cakes, orders[newOrderPos].Cakes) {
@ -214,8 +212,8 @@ func TestStore(t *testing.T) {
anotherOrder.Phone != orders[anotherOrderPos].Phone ||
anotherOrder.Status != orders[anotherOrderPos].Status ||
anotherOrder.Location != orders[anotherOrderPos].Location ||
anotherOrder.Accepted.Format("2006-01-02 15:04") != anotherOrder.Accepted.Format("2006-01-02 15:04") ||
anotherOrder.Date.Format("2006-01-02 15:04") != anotherOrder.Date.Format("2006-01-02 15:04") {
anotherOrder.Accepted.Format("2006-01-02 15:04") != orders[anotherOrderPos].Accepted.Format("2006-01-02 15:04") ||
anotherOrder.Date.Format("2006-01-02 15:04") != orders[anotherOrderPos].Date.Format("2006-01-02 15:04") {
t.Errorf("Want %v\nGot %v", anotherOrder, orders[anotherOrderPos])
}
@ -232,8 +230,8 @@ func TestStore(t *testing.T) {
newOrder.Phone != selectedOrder.Phone ||
newOrder.Status != selectedOrder.Status ||
newOrder.Location != selectedOrder.Location ||
newOrder.Accepted.Format("2006-01-02 15:04") != newOrder.Accepted.Format("2006-01-02 15:04") ||
newOrder.Date.Format("2006-01-02 15:04") != newOrder.Date.Format("2006-01-02 15:04") {
newOrder.Accepted.Format("2006-01-02 15:04") != selectedOrder.Accepted.Format("2006-01-02 15:04") ||
newOrder.Date.Format("2006-01-02 15:04") != selectedOrder.Date.Format("2006-01-02 15:04") {
t.Errorf("Want %v\nGot %v", newOrder, selectedOrder)
}

20
main.go
View file

@ -1,23 +1,7 @@
package main
import (
"log"
"net/http"
"github.com/Bronku/iroon/auth"
"github.com/Bronku/iroon/logging"
"github.com/Bronku/iroon/server"
)
import "github.com/Bronku/iroon/cmd/iroon"
func main() {
h, err := server.New()
if err != nil {
log.Fatal(err)
}
defer h.Close()
var handler http.Handler = h
handler = logging.Middleware(handler)
handler = auth.New().Middleware(handler)
log.Fatal(http.ListenAndServe(":8080", handler))
iroon.Run()
}