diff --git a/cmd/iroon/main.go b/cmd/iroon/main.go new file mode 100644 index 0000000..e384e7d --- /dev/null +++ b/cmd/iroon/main.go @@ -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)) +} diff --git a/auth/auth.go b/internal/auth/auth.go similarity index 100% rename from auth/auth.go rename to internal/auth/auth.go diff --git a/auth/login.html b/internal/auth/login.html similarity index 100% rename from auth/login.html rename to internal/auth/login.html diff --git a/auth/token.go b/internal/auth/token.go similarity index 100% rename from auth/token.go rename to internal/auth/token.go diff --git a/auth/wrongPassword.html b/internal/auth/wrongPassword.html similarity index 100% rename from auth/wrongPassword.html rename to internal/auth/wrongPassword.html diff --git a/logging/logger.go b/internal/logging/logger.go similarity index 100% rename from logging/logger.go rename to internal/logging/logger.go diff --git a/server/errors.go b/internal/server/errors.go similarity index 100% rename from server/errors.go rename to internal/server/errors.go diff --git a/server/fetcher.go b/internal/server/fetcher.go similarity index 100% rename from server/fetcher.go rename to internal/server/fetcher.go diff --git a/server/get.go b/internal/server/get.go similarity index 95% rename from server/get.go rename to internal/server/get.go index 65a5e09..a632123 100644 --- a/server/get.go +++ b/internal/server/get.go @@ -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) { diff --git a/server/post.go b/internal/server/post.go similarity index 96% rename from server/post.go rename to internal/server/post.go index 0000392..1b33504 100644 --- a/server/post.go +++ b/internal/server/post.go @@ -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) { diff --git a/server/server.go b/internal/server/server.go similarity index 95% rename from server/server.go rename to internal/server/server.go index fa3a318..b5193e5 100644 --- a/server/server.go +++ b/internal/server/server.go @@ -4,7 +4,7 @@ import ( "html/template" "net/http" - "github.com/Bronku/iroon/store" + "github.com/Bronku/iroon/internal/store" ) type Server struct { diff --git a/server/template.go b/internal/server/template.go similarity index 100% rename from server/template.go rename to internal/server/template.go diff --git a/server/templates/confirmation.html b/internal/server/templates/confirmation.html similarity index 100% rename from server/templates/confirmation.html rename to internal/server/templates/confirmation.html diff --git a/server/templates/index.html b/internal/server/templates/index.html similarity index 100% rename from server/templates/index.html rename to internal/server/templates/index.html diff --git a/server/templates/order.html b/internal/server/templates/order.html similarity index 100% rename from server/templates/order.html rename to internal/server/templates/order.html diff --git a/store/model.go b/internal/store/model.go similarity index 100% rename from store/model.go rename to internal/store/model.go diff --git a/store/schema.sql b/internal/store/schema.sql similarity index 95% rename from store/schema.sql rename to internal/store/schema.sql index c4f85a7..e874f9c 100644 --- a/store/schema.sql +++ b/internal/store/schema.sql @@ -22,3 +22,5 @@ create table ordered_cake ( amount integer not null, primary key (customer_order, cake) ); + +PRAGMA user_version = 1; diff --git a/store/store.go b/internal/store/store.go similarity index 89% rename from store/store.go rename to internal/store/store.go index 4af17ca..b038ed9 100644 --- a/store/store.go +++ b/internal/store/store.go @@ -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 } } diff --git a/store/store_test.go b/internal/store/store_test.go similarity index 90% rename from store/store_test.go rename to internal/store/store_test.go index 61aea9f..31248fb 100644 --- a/store/store_test.go +++ b/internal/store/store_test.go @@ -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) } diff --git a/main.go b/main.go index 7e090a7..5dffb9b 100644 --- a/main.go +++ b/main.go @@ -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() }