from fastapi import HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload from sqlmodel import select from job.candidate.models import Notes from job.notes.serializers import serialize_note class Note: def __init__(self,session:AsyncSession): self.session=session async def _load(self,record_id): uid=Notes._as_uuid(record_id) if uid is None: return None result=await self.session.execute( select(Notes).options(selectinload(Notes.author)).where(Notes.id==uid) ) return result.scalars().first() async def get_note(self,note_id=None,user_id=None): if note_id: row=await self._load(note_id) if not row: raise HTTPException(status_code=404,detail="Note not found") return serialize_note(row) if not user_id: raise HTTPException(status_code=400,detail="note_id or user_id is required") uid=Notes._as_uuid(user_id) if uid is None: raise HTTPException(status_code=400,detail="Invalid user_id") result=await self.session.execute( select(Notes) .options(selectinload(Notes.author)) .where(Notes.user_id==uid) .order_by(Notes.created_at.desc()) ) return [serialize_note(r) for r in result.scalars().all()] async def create_note(self,payload,current_user): fields={ "note":payload.get("note") or "", "user_id":payload.get("user_id"), "created_by":current_user.get("id") if isinstance(current_user,dict) else None, } if not fields["user_id"]: raise HTTPException(status_code=400,detail="user_id is required") row=await Notes.insert_note(self.session,fields) row=await self._load(row.id) return serialize_note(row) async def update_note(self,note_id,payload): fields={k:v for k,v in payload.items() if v is not None and k in ("note",)} if not fields: raise HTTPException(status_code=400,detail="No fields to update") row=await Notes.update_note(self.session,note_id,fields) if not row: raise HTTPException(status_code=404,detail="Note not found") row=await self._load(row.id) return serialize_note(row)