ppt-web / src /landppt /web /route_modules /support.py
26fwyzpz6f-max
Clean deploy without binary files
6aecb2e
Raw
History Blame Contribute Delete
3.55 kB
"""
Shared helpers for extracted web route modules.
"""
from __future__ import annotations
import logging
from datetime import datetime
from typing import Any
from fastapi import Response
from ...core.config import app_config
from ...database.database import AsyncSessionLocal
from ...services.service_instances import get_ppt_service_for_user, ppt_service
from ..template_utils import create_templates
logger = logging.getLogger(__name__)
templates = create_templates()
def _apply_no_store_headers(response: Response) -> Response:
response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "0"
return response
def _timestamp_to_datetime(timestamp: Any) -> str:
try:
if isinstance(timestamp, (int, float)):
return datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S")
return str(timestamp)
except (ValueError, OSError):
return "Invalid timestamp"
def _strftime_filter(timestamp: Any, format_string: str = "%Y-%m-%d %H:%M") -> str:
try:
if isinstance(timestamp, (int, float)):
return datetime.fromtimestamp(timestamp).strftime(format_string)
return str(timestamp)
except (ValueError, OSError):
return "Invalid timestamp"
templates.env.filters["timestamp_to_datetime"] = _timestamp_to_datetime
templates.env.filters["strftime"] = _strftime_filter
templates.env.globals["credits_enabled"] = app_config.enable_credits_system
async def consume_credits_for_operation(
user_id: int,
operation_type: str,
quantity: int = 1,
description: str | None = None,
reference_id: str | None = None,
provider_name: str | None = None,
) -> tuple[bool, str]:
if not app_config.enable_credits_system:
return True, "Credits system disabled"
if (provider_name or "").strip().lower() != "landppt":
return True, "Non-billable provider"
try:
from ...services.credits_service import CreditsService
async with AsyncSessionLocal() as session:
credits_service = CreditsService(session)
return await credits_service.consume_credits(
user_id=user_id,
operation_type=operation_type,
quantity=quantity,
description=description,
reference_id=reference_id,
)
except Exception as exc: # noqa: BLE001
logger.error("Credits consumption error: %s", exc)
return False, f"Credits consumption failed: {exc}"
async def check_credits_for_operation(
user_id: int,
operation_type: str,
quantity: int = 1,
provider_name: str | None = None,
) -> tuple[bool, int, int]:
if not app_config.enable_credits_system:
return True, 0, 0
if (provider_name or "").strip().lower() != "landppt":
return True, 0, 0
try:
from ...services.credits_service import CreditsService
async with AsyncSessionLocal() as session:
credits_service = CreditsService(session)
required = credits_service.get_operation_cost(operation_type, quantity)
balance = await credits_service.get_balance(user_id)
return balance >= required, required, balance
except Exception as exc: # noqa: BLE001
logger.error("Credits check error: %s", exc)
return False, 0, 0