reviews + UI

This commit is contained in:
User
2025-02-16 11:17:40 +03:00
parent 73c80dcc16
commit fa53707210
7 changed files with 182 additions and 128 deletions

View File

@@ -3,7 +3,6 @@ package main
import (
"database/sql"
"encoding/json"
"fmt"
"log"
"net/http"
"strconv"
@@ -65,12 +64,65 @@ func createTable() {
log.Fatal("Ошибка создания таблицы:", err)
}
}
func addReview(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
productID, err := strconv.Atoi(vars["product_id"])
if err != nil {
http.Error(w, "Некорректный product_id", http.StatusBadRequest)
log.Println("Ошибка преобразования product_id:", err)
return
}
var review Review
if err := json.NewDecoder(r.Body).Decode(&review); err != nil {
http.Error(w, "Некорректный JSON", http.StatusBadRequest)
log.Println("Ошибка декодирования JSON:", err)
return
}
// Игнорируем переданный в JSON product_id и устанавливаем его из URL
review.ProductID = productID
log.Printf("Добавление отзыва для товара %d: %+v", productID, review)
stmt, err := db.Prepare(`
INSERT INTO reviews (product_id, username, rating, comment, created_at)
VALUES (?, ?, ?, ?, datetime('now'))
`)
if err != nil {
http.Error(w, "Ошибка при подготовке SQL-запроса", http.StatusInternalServerError)
log.Println("Ошибка при подготовке запроса:", err)
return
}
defer stmt.Close()
result, err := stmt.Exec(review.ProductID, review.Username, review.Rating, review.Comment)
if err != nil {
http.Error(w, "Ошибка при добавлении отзыва", http.StatusInternalServerError)
log.Println("Ошибка при выполнении SQL-запроса:", err)
return
}
rowsAffected, _ := result.RowsAffected()
log.Printf("Добавлено строк: %d для товара %d", rowsAffected, productID)
// Возвращаем созданный отзыв
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(review)
}
func getReviews(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
productID := vars["product_id"]
rows, err := db.Query("SELECT id, product_id, username, rating, comment, created_at FROM reviews WHERE product_id = ?", productID)
log.Printf("Получение отзывов для товара %s", productID)
rows, err := db.Query(`
SELECT id, product_id, username, rating, comment, created_at
FROM reviews
WHERE product_id = ?
ORDER BY created_at DESC
`, productID)
if err != nil {
http.Error(w, "Ошибка при получении отзывов", http.StatusInternalServerError)
log.Println("Ошибка при запросе отзывов:", err)
@@ -89,55 +141,9 @@ func getReviews(w http.ResponseWriter, r *http.Request) {
reviews = append(reviews, review)
}
// Log the reviews being returned
log.Printf("Reviews fetched: %+v", reviews)
if len(reviews) == 0 {
http.Error(w, "Нет отзывов", http.StatusNotFound)
return
}
log.Printf("Найдено %d отзывов для товара %s", len(reviews), productID)
// Всегда возвращаем JSON массив, даже если он пустой
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(reviews)
}
func addReview(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
productID, err := strconv.Atoi(vars["product_id"])
if err != nil {
http.Error(w, "Некорректный product_id", http.StatusBadRequest)
log.Println("Ошибка преобразования product_id:", err)
return
}
var review Review
if err := json.NewDecoder(r.Body).Decode(&review); err != nil {
http.Error(w, "Некорректный JSON", http.StatusBadRequest)
log.Println("Ошибка декодирования JSON:", err)
return
}
review.ProductID = productID
log.Printf("Попытка добавить отзыв: %+v", review)
stmt, err := db.Prepare("INSERT INTO reviews (product_id, username, rating, comment, created_at) VALUES (?, ?, ?, ?, datetime('now'))")
if err != nil {
http.Error(w, "Ошибка при подготовке SQL-запроса", http.StatusInternalServerError)
log.Println("Ошибка при подготовке запроса:", err)
return
}
defer stmt.Close()
result, err := stmt.Exec(review.ProductID, review.Username, review.Rating, review.Comment)
if err != nil {
http.Error(w, "Ошибка при добавлении отзыва", http.StatusInternalServerError)
log.Println("Ошибка при выполнении SQL-запроса:", err)
return
}
rowsAffected, _ := result.RowsAffected()
log.Println("Добавлено строк:", rowsAffected)
w.WriteHeader(http.StatusCreated)
fmt.Fprintln(w, "Отзыв успешно добавлен")
}