diff --git a/32-platform/sportsstore/config.json b/32-platform/sportsstore/config.json index 64554e1..3d62b27 100644 --- a/32-platform/sportsstore/config.json +++ b/32-platform/sportsstore/config.json @@ -25,7 +25,13 @@ "GetPage": "sql/get_product_page.sql", "GetPageCount": "sql/get_page_count.sql", "GetCategoryPage": "sql/get_category_product_page.sql", - "GetCategoryPageCount": "sql/get_category_product_page_count.sql" + "GetCategoryPageCount": "sql/get_category_product_page_count.sql", + "GetOrder": "sql/get_order.sql", + "GetOrderLines": "sql/get_order_lines.sql", + "GetOrders": "sql/get_orders.sql", + "GetOrdersLines": "sql/get_orders_lines.sql", + "SaveOrder": "sql/save_order.sql", + "SaveOrderLine": "sql/save_order_line.sql" } } } \ No newline at end of file diff --git a/32-platform/sportsstore/models/order.go b/32-platform/sportsstore/models/order.go new file mode 100644 index 0000000..e4b3b57 --- /dev/null +++ b/32-platform/sportsstore/models/order.go @@ -0,0 +1,22 @@ +package models + +type Order struct { + Id int + ShippingDetails + Products []ProductSelection + Shipped bool +} + +type ShippingDetails struct { + Name string `validation:"required"` + StreetAddr string `validation:"required"` + City string `validation:"required"` + State string `validation:"required"` + Zip string `validation:"required"` + Country string `validation:"required"` +} + +type ProductSelection struct { + Product + Quantity int +} diff --git a/32-platform/sportsstore/models/repo/memory_repo.go b/32-platform/sportsstore/models/repo/memory_repo.go index 1c1cd8d..3a3077c 100644 --- a/32-platform/sportsstore/models/repo/memory_repo.go +++ b/32-platform/sportsstore/models/repo/memory_repo.go @@ -2,10 +2,10 @@ package repo import ( "math" - "platform/services" "sportstore/models" ) +/* func RegisterMemoryRepoService() { err := services.AddSingleton(func() models.Repository { repo := &MemoryRepo{} @@ -17,6 +17,7 @@ func RegisterMemoryRepoService() { return } } +*/ type MemoryRepo struct { products []models.Product diff --git a/32-platform/sportsstore/models/repo/sql_repo.go b/32-platform/sportsstore/models/repo/sql_repo.go index 5276d36..c26ab48 100644 --- a/32-platform/sportsstore/models/repo/sql_repo.go +++ b/32-platform/sportsstore/models/repo/sql_repo.go @@ -24,5 +24,11 @@ type SqlCommands struct { GetPage, GetPageCount, GetCategoryPage, - GetCategoryPageCount *LoggedStmt + GetCategoryPageCount, + GetOrder, + GetOrderLines, + GetOrders, + GetOrdersLines, + SaveOrder, + SaveOrderLine *LoggedStmt } diff --git a/32-platform/sportsstore/models/repository.go b/32-platform/sportsstore/models/repository.go index fff59e7..39cd1bd 100644 --- a/32-platform/sportsstore/models/repository.go +++ b/32-platform/sportsstore/models/repository.go @@ -11,5 +11,11 @@ type Repository interface { GetCategories() []Category + GetOrder(id int) Order + + GetOrders() []Order + + SaveOrder(*Order) + Seed() } diff --git a/32-platform/sportsstore/sql/get_order.sql b/32-platform/sportsstore/sql/get_order.sql new file mode 100644 index 0000000..5a6fe52 --- /dev/null +++ b/32-platform/sportsstore/sql/get_order.sql @@ -0,0 +1,9 @@ +SELECT Orders.Id, + Orders.Name, + Orders.StreetAddr, + Orders.City, + Orders.Zip, + Orders.Country, + Orders.Shipped +FROM Orders +WHERE Orders.Id = ? \ No newline at end of file diff --git a/32-platform/sportsstore/sql/get_order_lines.sql b/32-platform/sportsstore/sql/get_order_lines.sql new file mode 100644 index 0000000..b0b0971 --- /dev/null +++ b/32-platform/sportsstore/sql/get_order_lines.sql @@ -0,0 +1,16 @@ +SELECT OrderLines.Quantity, + Products.Id, + Products.Name, + Products.Description, + Products.Price, + Categories.Id AS CategoryId, + Categories.Name AS CategoryName +FROM Orders, + OrderLines, + Products, + Categories +WHERE Orders.Id = OrderLines.OrderId + AND OrderLines.ProductId = Products.Id + AND Products.Category = Categories.Id + AND Orders.Id = ? +GROUP BY Products.Id \ No newline at end of file diff --git a/32-platform/sportsstore/sql/get_orders.sql b/32-platform/sportsstore/sql/get_orders.sql new file mode 100644 index 0000000..5ba1a4f --- /dev/null +++ b/32-platform/sportsstore/sql/get_orders.sql @@ -0,0 +1,9 @@ +SELECT Orders.Id, + Orders.Name, + Orders.StreetAddr, + Orders.City, + Orders.Zip, + Orders.Country, + Orders.Shipped +FROM Orders +ORDER BY Orders.Shipped, Orders.Id \ No newline at end of file diff --git a/32-platform/sportsstore/sql/get_orders_lines.sql b/32-platform/sportsstore/sql/get_orders_lines.sql new file mode 100644 index 0000000..910befd --- /dev/null +++ b/32-platform/sportsstore/sql/get_orders_lines.sql @@ -0,0 +1,15 @@ +SELECT OrderLines.Quantity, + Products.Id, + Products.Name, + Products.Description, + Products.Price, + Categories.Id AS CategoryId, + Categories.Name AS CategoryName +FROM Orders, + OrderLines, + Products, + Categories +WHERE Orders.Id = OrderLines.OrderId + AND OrderLines.ProductId = Products.Id + AND Products.Category = Categories.Id +GROUP BY Products.Id \ No newline at end of file diff --git a/32-platform/sportsstore/sql/init_db.sql b/32-platform/sportsstore/sql/init_db.sql index b3064c6..0f9e9c0 100644 --- a/32-platform/sportsstore/sql/init_db.sql +++ b/32-platform/sportsstore/sql/init_db.sql @@ -1,5 +1,7 @@ DROP TABLE if exists Products; DROP TABLE if exists Categories; +DROP TABLE IF exists OrderLines; +DROP TABLE IF exists Orders; CREATE TABLE IF NOT EXISTS Categories ( Id INTEGER NOT NULL PRIMARY KEY, @@ -13,4 +15,23 @@ CREATE TABLE IF NOT EXISTS Products ( Category INTEGER NOT NULL, Price decimal(8,2) NOT NULL, CONSTRAINT CatRef FOREIGN KEY(Category) REFERENCES Categories(Id) +); + +CREATE TABLE IF NOT EXISTS OrderLines ( + Id INTEGER NOT NULL PRIMARY KEY, + OrderId INTEGER NOT NULL, + ProductId INTEGER NOT NULL, + Quantity INTEGER NOT NULL, + CONSTRAINT OrderRef FOREIGN KEY(OrderId) REFERENCES Orders(Id), + CONSTRAINT OrderRef FOREIGN KEY(ProductId) REFERENCES Products(Id) +); + +CREATE TABLE IF NOT EXISTS Orders ( + Id INTEGER NOT NULL PRIMARY KEY, + Name TEXT NOT NULL, + StreetAddr Text NOT NULL, + City Text NOT NULL, + Zip Text NOT NULL, + Country Text NOT NULL, + Shipped BOOLEAN NOT NULL ); \ No newline at end of file diff --git a/32-platform/sportsstore/sql/save_order.sql b/32-platform/sportsstore/sql/save_order.sql new file mode 100644 index 0000000..9f00896 --- /dev/null +++ b/32-platform/sportsstore/sql/save_order.sql @@ -0,0 +1,7 @@ +INSERT INTO Orders (Name, + StreetAddr, + City, + Zip, + Country, + Shipped) +VALUES (?, ?, ?, ?, ?, ?) \ No newline at end of file diff --git a/32-platform/sportsstore/sql/save_order_line.sql b/32-platform/sportsstore/sql/save_order_line.sql new file mode 100644 index 0000000..56f2deb --- /dev/null +++ b/32-platform/sportsstore/sql/save_order_line.sql @@ -0,0 +1,2 @@ +INSERT INTO OrderLines (OrderId, ProductId, Quantity) +VALUES (?, ?, ?) \ No newline at end of file diff --git a/32-platform/sportsstore/sql/seed_db.sql b/32-platform/sportsstore/sql/seed_db.sql index 346bd85..c9fa7e7 100644 --- a/32-platform/sportsstore/sql/seed_db.sql +++ b/32-platform/sportsstore/sql/seed_db.sql @@ -12,4 +12,14 @@ VALUES (1, 'Kayak', 'A boat for one person', 1, 275), (6, 'Thinking Cap', 'Improve brain efficiency by 75%', 3, 16), (7, 'Unsteady Chair', 'Secretly give your opponent a disadvantage', 3, 29.95), (8, 'Human Chess Board', 'A fun game for the family', 3, 75), - (9, 'Bling Bling King', 'Gold-plated, diamond-studded King', 3, 1200); \ No newline at end of file + (9, 'Bling Bling King', 'Gold-plated, diamond-studded King', 3, 1200); + +INSERT INTO Orders (Id, Name, StreetAddr, City, Zip, Country, Shipped) +VALUES (1, 'Alice', '123 Main St', 'New Town', '12345', 'USA', false), + (2, 'Bob', 'The Grange', 'Upton', 'Up12 6YT', 'UK', false); + +INSERT INTO OrderLines (Id, OrderId, ProductId, Quantity) +VALUES (1, 1, 1, 1), + (2, 1, 2, 2), + (3, 2, 8, 1), + (4, 2, 5, 2); \ No newline at end of file diff --git a/32-platform/sportsstore/store.db b/32-platform/sportsstore/store.db index 263d944..597e2f4 100644 Binary files a/32-platform/sportsstore/store.db and b/32-platform/sportsstore/store.db differ