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

69 lines
2.8 KiB
Python

from fastapi import HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from job.candidate.models import Notes
from job.history.enums import HistoryEvent
from job.history.views import HistoryRecorder
from job.notes.serializers import serialize_note
class Note:
def __init__(self,session:AsyncSession):
self.session=session
async def _load(self,record_id):
return await Notes.get_note_by_id(self.session,record_id)
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")
rows=await Notes.get_notes_by_user(self.session,uid)
return [serialize_note(r) for r in rows]
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)
await HistoryRecorder(self.session).record(
HistoryEvent.NOTE_CREATED.value,
current_user=current_user,user_id=row.user_id,
entity_type="note",entity_id=row.id,
to_value=(row.note or "")[:120],commit=True,
)
row=await self._load(row.id)
return serialize_note(row)
async def update_note(self,note_id,payload,current_user=None):
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")
before=await self._load(note_id)
if not before:
raise HTTPException(status_code=404,detail="Note not found")
old_note=before.note or ""
row=await Notes.update_note(self.session,note_id,fields)
if not row:
raise HTTPException(status_code=404,detail="Note not found")
new_note=row.note or ""
await HistoryRecorder(self.session).record(
HistoryEvent.NOTE_UPDATED.value,
current_user=current_user,user_id=row.user_id,
entity_type="note",entity_id=row.id,
from_value=old_note[:120],to_value=new_note[:120],commit=True,
)
row=await self._load(row.id)
return serialize_note(row)