72 lines
3.0 KiB
Python
72 lines
3.0 KiB
Python
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)
|