feat(handlers): Get data from db Methods

Added all methods from fronted documentation whitch needs
This commit is contained in:
Black_Raven committed 2026-03-22 16:53:24 +03:00
1 parent 0439ccd6d9
commit b9c1a1c018
2 files changed
+360 -22

No files matched your search

+107 -17
View File
@@ -1,23 +1,113 @@
import sqlite3
from module.category import Category
from typing import List, Dict, Any, Optional
from loguru import logger as log
def GetAllCategories(db_name: str = 'pipe_store.db', parent_id: int = 1) -> list[Category]:
def get_all_categories_with_attributes(db_name: str = 'pipe_store.db') -> List[Dict[str, Any]]:
conn = sqlite3.connect(db_name)
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
try:
# Получаем все категории (только основные, без parent_id)
cursor.execute("""
SELECT id, name, image_path
FROM categories
WHERE parent_id IS NULL OR parent_id = 1
ORDER BY id
""")
categories = []
for cat_row in cursor.fetchall():
category_id = cat_row['id']
# Получаем все фильтры для товаров в этой категории
cursor.execute("""
SELECT DISTINCT f.id, f.name, f.filter_key
FROM filters f
WHERE f.filter_key IN (
SELECT DISTINCT pf.filter_key
FROM product_filters pf
JOIN products p ON pf.product_id = p.id
WHERE p.category_id = ?
)
ORDER BY f.id
""", (category_id,))
attributes = []
for filter_row in cursor.fetchall():
filter_id = filter_row['id']
filter_key = filter_row['filter_key']
filter_name = filter_row['name']
# Получаем уникальные значения для этого фильтра
cursor.execute("""
SELECT DISTINCT pf.value, COUNT(*) as count
FROM product_filters pf
JOIN products p ON pf.product_id = p.id
WHERE p.category_id = ? AND pf.filter_key = ?
GROUP BY pf.value
ORDER BY pf.value
""", (category_id, filter_key))
vals = []
for val_row in cursor.fetchall():
# Генерируем уникальный ID для значения
val_id = hash(f"{category_id}_{filter_key}_{val_row['value']}") % 1000000
vals.append({
"id": val_id,
"val": val_row['value']
})
if vals: # Добавляем только если есть значения
attributes.append({
"id": filter_id,
"name": filter_name,
"vals": vals
})
categories.append({
"id": category_id,
"name": cat_row['name'],
"image": cat_row['image_path'] or f"/images/categories/{cat_row['name'].lower().replace(' ', '_')}.jpg",
"atributes": attributes
})
return categories
except sqlite3.Error as e:
log.error(f"Ошибка при получении категорий: {e}")
return []
finally:
conn.close()
categories = []
cursor.execute("SELECT id, name, description, image_path FROM categories WHERE parent_id = ?", [parent_id])
for row in cursor.fetchall():
category = Category(
id = row["id"],
name = row["name"],
description= row["description"],
image_path= row["image_path"],
)
categories.append(category.model_dump())
conn.close()
return categories
def get_category_by_id(category_id: int, db_name: str = 'pipe_store.db') -> Optional[Dict[str, Any]]:
"""Получить категорию по ID"""
conn = sqlite3.connect(db_name)
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
try:
cursor.execute("""
SELECT id, name, description, image_path, parent_id
FROM categories
WHERE id = ?
""", (category_id,))
row = cursor.fetchone()
if row:
return {
"id": row['id'],
"name": row['name'],
"description": row['description'],
"image": row['image_path'],
"parent_id": row['parent_id']
}
return None
except sqlite3.Error as e:
log.error(f"Ошибка при получении категории {category_id}: {e}")
return None
finally:
conn.close()