from fastapi import APIRouter, Request, Depends from fastapi.responses import RedirectResponse from fastapi.templating import Jinja2Templates from sqlalchemy.orm import Session from web.auth import get_current_user from web.database import get_db from web.models import User, EvotorConnection, VkConnection router = APIRouter() templates = Jinja2Templates(directory="web/templates") SERVICE_TYPES = [ { "type": "evotor", "name": "Эвотор", "icon": "bi-shop", "description": "Подключите кассу Эвотор для синхронизации каталога товаров.", "configure_url": "/evotor", "connect_url": "/evotor", }, { "type": "vk", "name": "ВКонтакте", "icon": "bi-bag", "description": "Подключите аккаунт ВКонтакте для публикации товаров в вашу группу.", "configure_url": "/vk", "connect_url": "/vk/connect", }, ] def _get_connection(svc_type: str, evotor, vk): if svc_type == "evotor": return evotor if svc_type == "vk": return vk return None def _get_details(svc_type: str, conn): if conn is None: return None if svc_type == "evotor": return conn.store_name if svc_type == "vk": return f"{conn.first_name} {conn.last_name}".strip() if conn.first_name else None return None @router.get("/connections") def connections_page( request: Request, db: Session = Depends(get_db), user: User | None = Depends(get_current_user), ): if not user: return RedirectResponse("/login", 303) evotor = db.query(EvotorConnection).filter(EvotorConnection.user_id == user.id).first() vk = db.query(VkConnection).filter(VkConnection.user_id == user.id).first() connected = [] for svc in SERVICE_TYPES: conn = _get_connection(svc["type"], evotor, vk) if conn is not None: connected.append({ **svc, "is_online": conn.is_online, "last_checked_at": conn.last_checked_at, "details": _get_details(svc["type"], conn), }) return templates.TemplateResponse("connections.html", { "request": request, "user": user, "connections": connected, }) @router.get("/connections/add") def connections_add_page( request: Request, db: Session = Depends(get_db), user: User | None = Depends(get_current_user), ): if not user: return RedirectResponse("/login", 303) evotor = db.query(EvotorConnection).filter(EvotorConnection.user_id == user.id).first() vk = db.query(VkConnection).filter(VkConnection.user_id == user.id).first() available = [ svc for svc in SERVICE_TYPES if _get_connection(svc["type"], evotor, vk) is None ] return templates.TemplateResponse("connections_add.html", { "request": request, "user": user, "available": available, }) @router.post("/connections/delete") async def connections_delete( request: Request, db: Session = Depends(get_db), user: User | None = Depends(get_current_user), ): if not user: return RedirectResponse("/login", 303) svc_type = request.query_params.get("type") if svc_type == "evotor": conn = db.query(EvotorConnection).filter(EvotorConnection.user_id == user.id).first() elif svc_type == "vk": conn = db.query(VkConnection).filter(VkConnection.user_id == user.id).first() else: conn = None if conn: db.delete(conn) db.commit() return RedirectResponse("/connections", 303)