Reorganize project structure and fix SQLite usage
This commit is contained in:
parent
0e762841a3
commit
e2dda0ade7
20 changed files with 76 additions and 46 deletions
23
cmd/iroon/main.go
Normal file
23
cmd/iroon/main.go
Normal 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))
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Bronku/iroon/store"
|
"github.com/Bronku/iroon/internal/store"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (h *Server) index(r *http.Request) (any, int, error) {
|
func (h *Server) index(r *http.Request) (any, int, error) {
|
||||||
|
|
@ -7,7 +7,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Bronku/iroon/store"
|
"github.com/Bronku/iroon/internal/store"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (h *Server) postOrder(r *http.Request) (any, int, error) {
|
func (h *Server) postOrder(r *http.Request) (any, int, error) {
|
||||||
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"html/template"
|
"html/template"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/Bronku/iroon/store"
|
"github.com/Bronku/iroon/internal/store"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
|
|
@ -22,3 +22,5 @@ create table ordered_cake (
|
||||||
amount integer not null,
|
amount integer not null,
|
||||||
primary key (customer_order, cake)
|
primary key (customer_order, cake)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
PRAGMA user_version = 1;
|
||||||
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
_ "embed"
|
_ "embed"
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -21,11 +20,13 @@ type Store struct {
|
||||||
func OpenStore(filename string) (*Store, error) {
|
func OpenStore(filename string) (*Store, error) {
|
||||||
var out Store
|
var out Store
|
||||||
var err error
|
var err error
|
||||||
_, err = os.Stat(filename)
|
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
|
||||||
defer out.loadSchema()
|
|
||||||
}
|
|
||||||
out.db, err = sql.Open("sqlite3", filename)
|
out.db, err = sql.Open("sqlite3", filename)
|
||||||
|
if err != nil {
|
||||||
|
return &out, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = out.loadSchema()
|
||||||
return &out, err
|
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 {
|
func (s *Store) loadSchema() error {
|
||||||
if s.db == nil {
|
if s.db == nil {
|
||||||
return errors.New("database doesn't exist")
|
return errors.New("database doesn't exist")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if s.version() == 1 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
_, err := s.db.Exec(schema)
|
_, err := s.db.Exec(schema)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -83,11 +101,13 @@ func (s *Store) SaveCake(newCake Cake) (int, error) {
|
||||||
|
|
||||||
row, err := s.db.Query(query, newCake.Name, newCake.Price)
|
row, err := s.db.Query(query, newCake.Name, newCake.Price)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, err
|
return 0, err
|
||||||
}
|
}
|
||||||
defer row.Close()
|
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)
|
err = row.Scan(&newCake.ID)
|
||||||
return newCake.ID, err
|
return newCake.ID, err
|
||||||
}
|
}
|
||||||
|
|
@ -95,10 +115,10 @@ func (s *Store) SaveCake(newCake Cake) (int, error) {
|
||||||
func (s *Store) GetOrder(id int) (Order, error) {
|
func (s *Store) GetOrder(id int) (Order, error) {
|
||||||
var out Order
|
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)
|
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 {
|
if err != nil {
|
||||||
return out, err
|
return out, err
|
||||||
}
|
}
|
||||||
|
defer row.Close()
|
||||||
|
|
||||||
var order_date, delivery_date string
|
var order_date, delivery_date string
|
||||||
row.Next()
|
row.Next()
|
||||||
|
|
@ -187,22 +207,25 @@ func (s *Store) SaveOrder(newOrder Order) (int, error) {
|
||||||
}
|
}
|
||||||
tx, err := s.db.Begin()
|
tx, err := s.db.Begin()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, nil
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
accepted := newOrder.Accepted.Format("2006-01-02 15:04")
|
accepted := newOrder.Accepted.Format("2006-01-02 15:04")
|
||||||
date := newOrder.Date.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)
|
row, err := tx.Query(query, newOrder.Name, newOrder.Surname, newOrder.Phone, newOrder.Location, accepted, date, newOrder.Status, newOrder.Paid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
tx.Rollback()
|
_ = tx.Rollback()
|
||||||
return -1, err
|
return 0, err
|
||||||
}
|
}
|
||||||
defer row.Close()
|
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)
|
err = row.Scan(&newOrder.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
tx.Rollback()
|
_ = tx.Rollback()
|
||||||
return newOrder.ID, err
|
return newOrder.ID, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -210,7 +233,7 @@ func (s *Store) SaveOrder(newOrder Order) (int, error) {
|
||||||
query = "delete from ordered_cake where customer_order = ?;"
|
query = "delete from ordered_cake where customer_order = ?;"
|
||||||
_, err = tx.Exec(query, newOrder.ID)
|
_, err = tx.Exec(query, newOrder.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
tx.Rollback()
|
_ = tx.Rollback()
|
||||||
return newOrder.ID, err
|
return newOrder.ID, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -219,7 +242,7 @@ func (s *Store) SaveOrder(newOrder Order) (int, error) {
|
||||||
for _, e := range newOrder.Cakes {
|
for _, e := range newOrder.Cakes {
|
||||||
_, err := tx.Exec(query, newOrder.ID, e.ID, e.Amount)
|
_, err := tx.Exec(query, newOrder.ID, e.ID, e.Amount)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
tx.Rollback()
|
_ = tx.Rollback()
|
||||||
return newOrder.ID, err
|
return newOrder.ID, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -29,7 +29,7 @@ func TestStore(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// create new cake
|
// 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)
|
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)
|
||||||
|
|
@ -39,7 +39,7 @@ func TestStore(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// create another cake
|
// 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)
|
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)
|
||||||
|
|
@ -112,7 +112,6 @@ func TestStore(t *testing.T) {
|
||||||
// create new order
|
// create new order
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
newOrder := Order{
|
newOrder := Order{
|
||||||
ID: -1,
|
|
||||||
Name: "John",
|
Name: "John",
|
||||||
Surname: "Doe",
|
Surname: "Doe",
|
||||||
Phone: "123-456-7890",
|
Phone: "123-456-7890",
|
||||||
|
|
@ -133,7 +132,6 @@ func TestStore(t *testing.T) {
|
||||||
|
|
||||||
// create another order
|
// create another order
|
||||||
anotherOrder := Order{
|
anotherOrder := Order{
|
||||||
ID: -1,
|
|
||||||
Name: "Jane",
|
Name: "Jane",
|
||||||
Surname: "Doe",
|
Surname: "Doe",
|
||||||
Phone: "123-456-7890",
|
Phone: "123-456-7890",
|
||||||
|
|
@ -198,8 +196,8 @@ func TestStore(t *testing.T) {
|
||||||
newOrder.Phone != orders[newOrderPos].Phone ||
|
newOrder.Phone != orders[newOrderPos].Phone ||
|
||||||
newOrder.Status != orders[newOrderPos].Status ||
|
newOrder.Status != orders[newOrderPos].Status ||
|
||||||
newOrder.Location != orders[newOrderPos].Location ||
|
newOrder.Location != orders[newOrderPos].Location ||
|
||||||
newOrder.Accepted.Format("2006-01-02 15:04") != newOrder.Accepted.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") != newOrder.Date.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])
|
t.Errorf("Want %v\nGot %v", newOrder, orders[newOrderPos])
|
||||||
}
|
}
|
||||||
if !areCakeSlicesEqual(newOrder.Cakes, orders[newOrderPos].Cakes) {
|
if !areCakeSlicesEqual(newOrder.Cakes, orders[newOrderPos].Cakes) {
|
||||||
|
|
@ -214,8 +212,8 @@ func TestStore(t *testing.T) {
|
||||||
anotherOrder.Phone != orders[anotherOrderPos].Phone ||
|
anotherOrder.Phone != orders[anotherOrderPos].Phone ||
|
||||||
anotherOrder.Status != orders[anotherOrderPos].Status ||
|
anotherOrder.Status != orders[anotherOrderPos].Status ||
|
||||||
anotherOrder.Location != orders[anotherOrderPos].Location ||
|
anotherOrder.Location != orders[anotherOrderPos].Location ||
|
||||||
anotherOrder.Accepted.Format("2006-01-02 15:04") != anotherOrder.Accepted.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") != anotherOrder.Date.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])
|
t.Errorf("Want %v\nGot %v", anotherOrder, orders[anotherOrderPos])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -232,8 +230,8 @@ func TestStore(t *testing.T) {
|
||||||
newOrder.Phone != selectedOrder.Phone ||
|
newOrder.Phone != selectedOrder.Phone ||
|
||||||
newOrder.Status != selectedOrder.Status ||
|
newOrder.Status != selectedOrder.Status ||
|
||||||
newOrder.Location != selectedOrder.Location ||
|
newOrder.Location != selectedOrder.Location ||
|
||||||
newOrder.Accepted.Format("2006-01-02 15:04") != newOrder.Accepted.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") != newOrder.Date.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)
|
t.Errorf("Want %v\nGot %v", newOrder, selectedOrder)
|
||||||
}
|
}
|
||||||
|
|
||||||
20
main.go
20
main.go
|
|
@ -1,23 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import "github.com/Bronku/iroon/cmd/iroon"
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/Bronku/iroon/auth"
|
|
||||||
"github.com/Bronku/iroon/logging"
|
|
||||||
"github.com/Bronku/iroon/server"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
h, err := server.New()
|
iroon.Run()
|
||||||
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))
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue