import uuid from typing import Sequence from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.models.knowledge_note import KnowledgeNote from app.schemas.knowledge_note import KnowledgeNoteCreate, KnowledgeNoteUpdate async def create_note( db: AsyncSession, study_id: uuid.UUID, note_in: KnowledgeNoteCreate, created_by: uuid.UUID | None, ) -> KnowledgeNote: note = KnowledgeNote( study_id=study_id, site_name=note_in.site_name, title=note_in.title, content=note_in.content, level=note_in.level, created_by=created_by, ) db.add(note) await db.commit() await db.refresh(note) return note async def get_note(db: AsyncSession, note_id: uuid.UUID) -> KnowledgeNote | None: result = await db.execute(select(KnowledgeNote).where(KnowledgeNote.id == note_id)) return result.scalar_one_or_none() async def list_notes( db: AsyncSession, study_id: uuid.UUID, site_name: str | None = None, keyword: str | None = None, skip: int = 0, limit: int = 100, ) -> Sequence[KnowledgeNote]: stmt = ( select(KnowledgeNote) .where(KnowledgeNote.study_id == study_id) ) if site_name: stmt = stmt.where(KnowledgeNote.site_name.ilike(f"%{site_name}%")) if keyword: stmt = stmt.where(KnowledgeNote.title.ilike(f"%{keyword}%")) stmt = stmt.order_by(KnowledgeNote.updated_at.desc()).offset(skip).limit(limit) result = await db.execute(stmt) return result.scalars().all() async def update_note( db: AsyncSession, note: KnowledgeNote, note_in: KnowledgeNoteUpdate ) -> KnowledgeNote: update_data = note_in.model_dump(exclude_unset=True) for key, value in update_data.items(): setattr(note, key, value) await db.commit() await db.refresh(note) return note async def delete_note(db: AsyncSession, note: KnowledgeNote) -> None: await db.delete(note) await db.commit()