from fastapi import HTTPException from sqlalchemy.ext.asyncio import AsyncSession from inbox.models import Inbox from job.candidate.models import Activity from job.activity.serializers import serialize_activity class ActivityLog: def __init__(self,session:AsyncSession): self.session=session async def _resolve_inbox(self,payload): if payload.get("inbox_id") is not None: row=await Inbox.get_inbox_by_id(self.session,payload["inbox_id"]) if not row: raise HTTPException(status_code=404,detail="Inbox not found") return row if payload.get("message_id"): row=await Inbox.get_inbox_by_message_id(self.session,payload["message_id"]) if not row: raise HTTPException(status_code=404,detail="Inbox not found for message_id") return row if payload.get("user_id"): row=await Inbox.get_inbox_by_user_id(self.session,payload["user_id"]) if not row: raise HTTPException(status_code=404,detail="Inbox not found for user_id") return row return None async def get_activity(self,activity_id=None,inbox_id=None,top=None,skip=0): if activity_id: row=await Activity.get_activity_by_id(self.session,activity_id) if not row: raise HTTPException(status_code=404,detail="Activity not found") return serialize_activity(row) if inbox_id is not None: rows=await Activity.get_activity_by_inbox(self.session,int(inbox_id)) return [serialize_activity(r) for r in rows] if top is not None: return await self.get_activity_feed(top=top,skip=skip) raise HTTPException(status_code=400,detail="activity_id or inbox_id is required") async def get_activity_feed(self,top,skip=0): rows,total=await Activity.get_activity_feed(self.session,top=top,skip=skip) items=[] for r in rows: data=serialize_activity(r) actor_name=None if r.inbox_id is not None: inbox=await Inbox.get_inbox_by_id(self.session,r.inbox_id) if inbox and getattr(inbox,"user",None): actor_name=inbox.user.name data["actor_name"]=actor_name items.append(data) return items,total async def create_activity(self,payload): link=await self._resolve_inbox(payload) fields={ "activity_type":payload.get("activity_type") or "", "activity_status":payload.get("activity_status") or "", "description":payload.get("description"), "inbox_id":link.id if link else None, } if payload.get("activity_date") is not None: fields["activity_date"]=payload["activity_date"] if payload.get("activity_time") is not None: fields["activity_time"]=payload["activity_time"] row=await Activity.insert_activity(self.session,fields) return serialize_activity(row)