Files
Nexus/server/infrastructure/database/admin_ui_preference_repo.py
T

56 lines
1.7 KiB
Python
Raw Normal View History

"""Admin UI preference repository — per-admin JSON blobs (search history, etc.)."""
from __future__ import annotations
from datetime import datetime, timezone
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from server.domain.models import AdminUiPreference
def _utcnow() -> datetime:
return datetime.now(timezone.utc).replace(tzinfo=None)
class AdminUiPreferenceRepositoryImpl:
def __init__(self, session: AsyncSession):
self.session = session
async def get(self, admin_id: int, context: str) -> dict | None:
result = await self.session.execute(
select(AdminUiPreference).where(
AdminUiPreference.admin_id == admin_id,
AdminUiPreference.context == context,
)
)
row = result.scalar_one_or_none()
if not row or not isinstance(row.payload, dict):
return None
return dict(row.payload)
async def upsert(self, admin_id: int, context: str, payload: dict) -> dict:
result = await self.session.execute(
select(AdminUiPreference).where(
AdminUiPreference.admin_id == admin_id,
AdminUiPreference.context == context,
)
)
row = result.scalar_one_or_none()
now = _utcnow()
if row:
row.payload = payload
row.updated_at = now
else:
self.session.add(
AdminUiPreference(
admin_id=admin_id,
context=context,
payload=payload,
updated_at=now,
)
)
await self.session.commit()
return payload