Initial commit: clean project structure
- Backend: FastAPI + SQLAlchemy + Celery (Python 3.11+) - Frontend: Vue 3 + TypeScript + Pinia + Tailwind - Admin Frontend: separate Vue 3 app for management - Docker Compose: 9 services orchestration - Specs: design prototypes, memory system PRD, product roadmap Cleanup performed: - Removed temporary debug scripts from backend root - Removed deprecated admin_app.py (embedded UI) - Removed duplicate docs from admin-frontend - Updated .gitignore for Vite cache and egg-info
This commit is contained in:
31
backend/app/services/provider_cache.py
Normal file
31
backend/app/services/provider_cache.py
Normal file
@@ -0,0 +1,31 @@
|
||||
"""In-memory cache for providers loaded from DB."""
|
||||
|
||||
from collections import defaultdict
|
||||
from typing import Literal
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.db.admin_models import Provider
|
||||
|
||||
ProviderType = Literal["text", "image", "tts", "storybook"]
|
||||
|
||||
_cache: dict[ProviderType, list[Provider]] = defaultdict(list)
|
||||
|
||||
|
||||
async def reload_providers(db: AsyncSession):
|
||||
result = await db.execute(select(Provider).where(Provider.enabled == True)) # noqa: E712
|
||||
providers = result.scalars().all()
|
||||
grouped: dict[ProviderType, list[Provider]] = defaultdict(list)
|
||||
for p in providers:
|
||||
grouped[p.type].append(p)
|
||||
# sort by priority desc, then weight desc
|
||||
for k in grouped:
|
||||
grouped[k].sort(key=lambda x: (x.priority, x.weight), reverse=True)
|
||||
_cache.clear()
|
||||
_cache.update(grouped)
|
||||
return _cache
|
||||
|
||||
|
||||
def get_providers(provider_type: ProviderType) -> list[Provider]:
|
||||
return _cache.get(provider_type, [])
|
||||
Reference in New Issue
Block a user