diff --git a/32-platform/sportsstore/models/repo/sql_basic_method.go b/32-platform/sportsstore/models/repo/sql_basic_method.go new file mode 100644 index 0000000..4ab40c0 --- /dev/null +++ b/32-platform/sportsstore/models/repo/sql_basic_method.go @@ -0,0 +1,46 @@ +package repo + +import "sportstore/models" + +func (repo *SqlRepository) GetProduct(id int) (p models.Product) { + row := repo.Commands.GetProduct.QueryRowContext(repo.Context, id) + if row.Err() == nil { + var err error + if p, err = scanProduct(row); err != nil { + repo.Logger.Panicf("Cannot scan data product: %v ", err.Error()) + } + } else { + repo.Logger.Panicf("Cannot exec GetProduct command: %v ", row.Err().Error()) + } + return +} + +func (repo *SqlRepository) GetProducts() (results []models.Product) { + rows, err := repo.Commands.GetProducts.QueryContext(repo.Context) + if err == nil { + if results, err = scanProducts(rows); err != nil { + repo.Logger.Panicf("Cannot scan data products: %v ", err.Error()) + return + } + } else { + repo.Logger.Panicf("Cannot exec GetProducts command: %v ", err.Error()) + } + return +} + +func (repo *SqlRepository) GetCategories() []models.Category { + results := make([]models.Category, 0, 10) + rows, err := repo.Commands.GetCategories.QueryContext(repo.Context) + if err == nil { + for rows.Next() { + c := models.Category{} + if err := rows.Scan(&c.ID, &c.CategoryName); err != nil { + repo.Logger.Panicf("Cannot scan data category: %v ", err.Error()) + } + results = append(results, c) + } + } else { + repo.Logger.Panicf("Cannot exec GetCategories command: %v ", err.Error()) + } + return results +} diff --git a/32-platform/sportsstore/models/repo/sql_scan.go b/32-platform/sportsstore/models/repo/sql_scan.go new file mode 100644 index 0000000..1e027b1 --- /dev/null +++ b/32-platform/sportsstore/models/repo/sql_scan.go @@ -0,0 +1,27 @@ +package repo + +import ( + "database/sql" + "sportstore/models" +) + +func scanProducts(rows *sql.Rows) (products []models.Product, err error) { + products = make([]models.Product, 0, 10) + for rows.Next() { + p := models.Product{Category: &models.Category{}} + if err = rows.Scan(&p.ID, &p.Name, &p.Description, &p.Price, + &p.Category.ID, &p.Category.CategoryName); err == nil { + products = append(products, p) + } else { + return + } + } + return +} + +func scanProduct(row *sql.Row) (p models.Product, err error) { + p = models.Product{Category: &models.Category{}} + err = row.Scan(&p.ID, &p.Name, &p.Description, &p.Price, + &p.Category.ID, &p.Category.CategoryName) + return p, err +} diff --git a/32-platform/sportsstore/sql/get_categories.sql b/32-platform/sportsstore/sql/get_categories.sql new file mode 100644 index 0000000..a006c7f --- /dev/null +++ b/32-platform/sportsstore/sql/get_categories.sql @@ -0,0 +1,3 @@ +SELECT Categories.Id, Categories.Name +FROM Categories +ORDER BY Categories.Id \ No newline at end of file diff --git a/32-platform/sportsstore/sql/get_product.sql b/32-platform/sportsstore/sql/get_product.sql new file mode 100644 index 0000000..002c474 --- /dev/null +++ b/32-platform/sportsstore/sql/get_product.sql @@ -0,0 +1,10 @@ +SELECT Products.Id, + Products.Name, + Products.Description, + Products.Price AS ProductPrice, + Categories.Id AS CategoryId, + Categories.Name AS CategoryName +FROM Products, + Categories +WHERE Products.Category = Categories.Id + AND Products.Id = ? \ No newline at end of file diff --git a/32-platform/sportsstore/sql/get_products.sql b/32-platform/sportsstore/sql/get_products.sql new file mode 100644 index 0000000..2517821 --- /dev/null +++ b/32-platform/sportsstore/sql/get_products.sql @@ -0,0 +1,10 @@ +SELECT Products.Id, + Products.Name, + Products.Description, + Products.Price AS ProductPrice, + Categories.Id AS CategoryId, + Categories.Name AS CategoryName +FROM Products, + Categories +WHERE Products.Category = Categories.Id +ORDER BY Products.Id \ No newline at end of file