diff --git a/32-platform/sportsstore/admin/categories_handler.go b/32-platform/sportsstore/admin/categories_handler.go index 398f115..25b1b98 100644 --- a/32-platform/sportsstore/admin/categories_handler.go +++ b/32-platform/sportsstore/admin/categories_handler.go @@ -2,15 +2,45 @@ package admin import ( "platform/http/actionresults" + "platform/http/handing" + "platform/sessions" "sportstore/models" + "sportstore/store" ) type CategoriesHandler struct { models.Repository + handing.URLGenerator + sessions.Session } -func (handler CategoriesHandler) GetData() string { - return "This is the categories handler" +type CategoryTemplateContext struct { + Categories []models.Category + EditId int + EditUrl string + SaveUrl string +} + +const CategoryEditKey = "category_edit" + +func (handler CategoriesHandler) GetData() actionresults.ActionResult { + context := CategoryTemplateContext{ + Categories: handler.GetCategories(), + EditId: handler.Session.GetValueDefault(CategoryEditKey, 0).(int), + EditUrl: store.MustGenerateUrl(handler.URLGenerator, CategoriesHandler.PostCategoryEdit), + SaveUrl: store.MustGenerateUrl(handler.URLGenerator, CategoriesHandler.PostCategorySave), + } + return actionresults.NewTemplateAction("admin_categories.html", context) +} + +func (handler CategoriesHandler) PostCategoryEdit(ref EditReference) actionresults.ActionResult { + handler.Session.SetValue(CategoryEditKey, ref.ID) + return actionresults.NewRedirectAction(store.MustGenerateUrl(handler.URLGenerator, AdminHandler.GetSection, "Categories")) +} +func (handler CategoriesHandler) PostCategorySave(c models.Category) actionresults.ActionResult { + handler.SaveCategory(&c) + handler.Session.SetValue(CategoryEditKey, 0) + return actionresults.NewRedirectAction(store.MustGenerateUrl(handler.URLGenerator, AdminHandler.GetSection, "Categories")) } func (handler CategoriesHandler) GetSelect(current int) actionresults.ActionResult { diff --git a/32-platform/sportsstore/config.json b/32-platform/sportsstore/config.json index 26e9bce..b273b22 100644 --- a/32-platform/sportsstore/config.json +++ b/32-platform/sportsstore/config.json @@ -33,7 +33,9 @@ "SaveOrder": "sql/save_order.sql", "SaveOrderLine": "sql/save_order_line.sql", "SaveProduct": "sql/save_product.sql", - "UpdateProduct": "sql/update_product.sql" + "UpdateProduct": "sql/update_product.sql", + "SaveCategory": "sql/save_category.sql", + "UpdateCategory": "sql/update_category.sql" } } } \ No newline at end of file diff --git a/32-platform/sportsstore/models/repo/sql_category_save.go b/32-platform/sportsstore/models/repo/sql_category_save.go new file mode 100644 index 0000000..ee5acdc --- /dev/null +++ b/32-platform/sportsstore/models/repo/sql_category_save.go @@ -0,0 +1,34 @@ +package repo + +import "sportstore/models" + +func (repo *SqlRepository) SaveCategory(c *models.Category) { + if c.ID == 0 { + result, err := repo.Commands.SaveCategory.ExecContext(repo.Context, c.CategoryName) + if err != nil { + repo.Logger.Panicf("Cannot exec SaveCategory command: %v ", err.Error()) + return + } + id, err := result.LastInsertId() + if err != nil { + repo.Logger.Panicf("Cannot exec SaveCategory get LastInsertId: %v ", err.Error()) + return + } + c.ID = int(id) + return + } else { + result, err := repo.Commands.UpdateCategory.ExecContext(repo.Context, c.CategoryName, c.ID) + if err != nil { + repo.Logger.Panicf("Cannot exec UpdateCategory command: %v ", err.Error()) + return + } + rowsAffected, err := result.RowsAffected() + if err != nil { + repo.Logger.Panicf("Cannot exec UpdateCategory get RowsAffected: %v ", err.Error()) + return + } + if rowsAffected != 1 { + repo.Logger.Panicf("Got exec UpdateCategory unexpected rows affected: %v ", rowsAffected) + } + } +} diff --git a/32-platform/sportsstore/models/repo/sql_repo.go b/32-platform/sportsstore/models/repo/sql_repo.go index 3e50d8f..0b8c102 100644 --- a/32-platform/sportsstore/models/repo/sql_repo.go +++ b/32-platform/sportsstore/models/repo/sql_repo.go @@ -32,5 +32,7 @@ type SqlCommands struct { SaveOrder, SaveOrderLine, SaveProduct, - UpdateProduct *LoggedStmt + UpdateProduct, + SaveCategory, + UpdateCategory *LoggedStmt } diff --git a/32-platform/sportsstore/models/repository.go b/32-platform/sportsstore/models/repository.go index a9509d6..fe6edbf 100644 --- a/32-platform/sportsstore/models/repository.go +++ b/32-platform/sportsstore/models/repository.go @@ -13,6 +13,8 @@ type Repository interface { GetCategories() []Category + SaveCategory(*Category) + GetOrder(id int) Order GetOrders() []Order diff --git a/32-platform/sportsstore/sql/save_category.sql b/32-platform/sportsstore/sql/save_category.sql new file mode 100644 index 0000000..62a1abc --- /dev/null +++ b/32-platform/sportsstore/sql/save_category.sql @@ -0,0 +1,2 @@ +INSERT INTO Categories (Name) +VALUES (?) \ No newline at end of file diff --git a/32-platform/sportsstore/sql/update_category.sql b/32-platform/sportsstore/sql/update_category.sql new file mode 100644 index 0000000..1326901 --- /dev/null +++ b/32-platform/sportsstore/sql/update_category.sql @@ -0,0 +1,3 @@ +UPDATE Categories +SET Name = ? +WHERE Id = ? \ No newline at end of file diff --git a/32-platform/sportsstore/store.db b/32-platform/sportsstore/store.db index 2527476..09f65e7 100644 Binary files a/32-platform/sportsstore/store.db and b/32-platform/sportsstore/store.db differ diff --git a/32-platform/sportsstore/templates/admin_categories.html b/32-platform/sportsstore/templates/admin_categories.html new file mode 100644 index 0000000..ed6e2e5 --- /dev/null +++ b/32-platform/sportsstore/templates/admin_categories.html @@ -0,0 +1,57 @@ +{{ $context := . }} + +
| Id | +Name | ++ | |||
|---|---|---|---|---|---|
| {{ .ID }} | +{{ .CategoryName }} | ++ + | +|||
| Add New Product | +|||||