82 lines
3.2 KiB
Python
82 lines
3.2 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.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):
|
|
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)
|
|
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)
|