func getTopProducts()

in products.go [33:56]


func getTopProducts(ctx context.Context, db *sqlx.DB) ([]Product, error) {
	const limit = 3 // top 3 best-selling products
	queryString := `SELECT
	  id, sku, name, stock, SUM(order_lines.amount) AS sold
FROM products JOIN order_lines ON id=product_id GROUP BY products.id ORDER BY sold DESC
`
	queryString += fmt.Sprintf("LIMIT %d\n", limit)

	rows, err := db.QueryContext(ctx, queryString)
	if err != nil {
		return nil, errors.Wrap(err, "querying top products")
	}
	defer rows.Close()

	var products []Product
	for rows.Next() {
		var p Product
		if err := rows.Scan(&p.ID, &p.SKU, &p.Name, &p.Stock, &p.Sold); err != nil {
			return nil, err
		}
		products = append(products, p)
	}
	return products, rows.Err()
}