context.Background() вместо r.Context() в хендлере

Код-ревьюMiddle20 минпроверка — Спринт23-t008

Проведите ревью и рефакторинг небольшого сервиса каталога: эндпоинт GET /products?category=...&sort=... возвращает товары категории из PostgreSQL. Найдите все проблемы — от корректности и безопасности до структуры кода и эксплуатации — и предложите исправленную версию.

Как на собесе: 20 минут, ищи всё — гонки, утечки, ошибки, безопасность, стиль. Ссылайся на строки.

review.gogo
1package main2 3import (4	"context"5	"database/sql"6	"encoding/json"7	"fmt"8	"net/http"9	"time"10)11 12var db *sql.DB13 14type Product struct {15	ID       int64  `json:"id"`16	Name     string `json:"name"`17	Category string `json:"category"`18	Price    int64  `json:"price"`19}20 21func productsHandler(w http.ResponseWriter, r *http.Request) {22	ctx := context.Background()23	ctx, _ = context.WithTimeout(ctx, 5*time.Second)24 25	category := r.URL.Query().Get("category")26	sort := r.URL.Query().Get("sort")27 28	query := fmt.Sprintf("SELECT id, name, category, price FROM products WHERE category = '%s' ORDER BY %s", category, sort)29	rows, _ := db.QueryContext(ctx, query)30 31	var products []Product32	for rows.Next() {33		var p Product34		rows.Scan(&p.ID, &p.Name, &p.Category, &p.Price)35		products = append(products, p)36	}37 38	json.NewEncoder(w).Encode(products)39}40 41func main() {42	db, _ = sql.Open("postgres", "postgres://shop:shop@localhost/shop?sslmode=disable")43	http.HandleFunc("/products", productsHandler)44	http.ListenAndServe(":8080", nil)45}
⌘ Enter — проверить