HR-ATS-Portal/backend/job/notes/views.py

63 lines
2.3 KiB
Python

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)