127 lines
3.6 KiB
Python
127 lines
3.6 KiB
Python
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)
|