chore: claude final touches

This commit is contained in:
Daniil
2026-03-17 18:11:23 +03:00
parent 4b90925c2a
commit 0299949553
21 changed files with 1915 additions and 101 deletions
+70
View File
@@ -0,0 +1,70 @@
from __future__ import annotations
import uuid
from sqlalchemy import Select, or_, select
from sqlalchemy.ext.asyncio import AsyncSession
from cpv3.modules.captions.models import CaptionPreset
from cpv3.modules.captions.schemas import CaptionPresetCreate, CaptionPresetUpdate
class CaptionPresetRepository:
"""Repository for CaptionPreset database operations."""
def __init__(self, session: AsyncSession) -> None:
self._session = session
async def list_all_for_user(self, user_id: uuid.UUID) -> list[CaptionPreset]:
"""Return system presets + user's own presets."""
stmt: Select[tuple[CaptionPreset]] = (
select(CaptionPreset)
.where(CaptionPreset.is_active.is_(True))
.where(
or_(
CaptionPreset.is_system.is_(True),
CaptionPreset.user_id == user_id,
)
)
.order_by(CaptionPreset.is_system.desc(), CaptionPreset.created_at.desc())
)
result = await self._session.execute(stmt)
return list(result.scalars().all())
async def get_by_id(self, preset_id: uuid.UUID) -> CaptionPreset | None:
result = await self._session.execute(
select(CaptionPreset)
.where(CaptionPreset.id == preset_id)
.where(CaptionPreset.is_active.is_(True))
)
return result.scalar_one_or_none()
async def create(
self, *, user_id: uuid.UUID | None, data: CaptionPresetCreate
) -> CaptionPreset:
preset = CaptionPreset(
user_id=user_id,
name=data.name,
description=data.description,
is_system=user_id is None,
style_config=data.style_config.model_dump(mode="json"),
)
self._session.add(preset)
await self._session.commit()
await self._session.refresh(preset)
return preset
async def update(self, preset: CaptionPreset, data: CaptionPresetUpdate) -> CaptionPreset:
for key, value in data.model_dump(exclude_unset=True).items():
if value is not None:
if key == "style_config":
setattr(preset, key, value.model_dump(mode="json"))
else:
setattr(preset, key, value)
await self._session.commit()
await self._session.refresh(preset)
return preset
async def deactivate(self, preset: CaptionPreset) -> None:
preset.is_active = False
await self._session.commit()