@@ -51,16 +68,23 @@ export function ReviewList({ productId }: ReviewListProps) {
)
}
+ if (isLoading) {
+ return
Загрузка отзывов...
+ }
+
+ if (error) {
+ return
{error}
+ }
+
return (
Отзывы покупателей
- {reviews.length === 0 ? (
+ {!reviews || reviews.length === 0 ? (
Пока нет отзывов. Будьте первым!
) : (
reviews.map((review) => (
- {/* Вывод рейтинга с помощью звезд */}
{[1, 2, 3, 4, 5].map((star) => (
))}
- {/* Дата отзыва */}
{new Date(review.createdAt).toLocaleDateString()}
- {/* Комментарий */}
+
{review.username}
{review.comment}
))
)}
)
-
}
+
diff --git a/frontend/style/components/reviews.db b/frontend/style/components/reviews.db
index 31720121..fba9a53b 100644
Binary files a/frontend/style/components/reviews.db and b/frontend/style/components/reviews.db differ
diff --git a/frontend/style/components/reviews.go b/frontend/style/components/reviews.go
index bccb2c72..c3830071 100644
--- a/frontend/style/components/reviews.go
+++ b/frontend/style/components/reviews.go
@@ -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, "Отзыв успешно добавлен")
-}