HR-ATS-Portal/backend/inbox/models.py

104 lines
3.7 KiB
Python

import uuid
from datetime import datetime
from typing import Any, Optional
from sqlalchemy import Column
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.ext.asyncio import AsyncSession
from sqlmodel import Field, Relationship, SQLModel
from users.models import Users
class Inbox(SQLModel, table=True):
__tablename__ = "inbox"
id: int | None = Field(default=None, primary_key=True)
user_id: uuid.UUID | None = Field(default=None, foreign_key="users.id")
alert_id: uuid.UUID | None = Field(default=None, foreign_key="inbox_alerts.id")
alerts: Optional["Inbox_Alerts"] = Relationship(back_populates="inbox")
message_id: uuid.UUID | None = Field(default=None, foreign_key="inbox_messages.id")
messages: Optional["Inbox_Messages"] = Relationship(back_populates="inbox")
created_at: datetime = Field(default_factory=datetime.now)
updated_at: datetime = Field(default_factory=datetime.now)
# is_active: bool = Field(default=True)
# is_deleted: bool = Field(default=False)
# user: Users | None = Relationship(back_populates="inbox")
class Inbox_Alerts(SQLModel, table=True):
__tablename__ = "inbox_alerts"
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
alert_sender_name: str
alert_sender_email: str
is_read: bool = Field(default=False)
recieve_time: datetime = Field(default_factory=datetime.now)
inbox: list[Inbox] = Relationship(back_populates="alerts")
class Inbox_Messages(SQLModel, table=True):
__tablename__ = "inbox_messages"
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
full_email_response: dict[str, Any] | None = Field(
default=None, sa_column=Column(JSONB)
)
message_subject: str
message_body: str
message_sent_time: str
message_received_time: str
message_from: str
message_to: str
message_cc: str | None = Field(default=None)
message_bcc: str | None = Field(default=None)
message_read: bool = Field(default=False)
attachment: bool = Field(default=False)
message_reply: str | None = Field(default=None)
file_path: str | None = Field(default=None)
inbox: list[Inbox] = Relationship(back_populates="messages")
@staticmethod
def _body_text(email_data: dict) -> str:
body = email_data.get("body")
if isinstance(body, dict):
return body.get("content") or ""
if isinstance(body, str):
return body
return email_data.get("bodyPreview") or ""
@classmethod
async def insert_email(cls, session: AsyncSession, email_data: dict):
email = cls(
message_subject=email_data.get("subject") or "",
message_body=cls._body_text(email_data),
message_sent_time=email_data.get("sentDateTime") or "",
message_read=bool(email_data.get("isRead")),
message_received_time=email_data.get("receivedDateTime") or "",
message_from=email_data.get("from", {})
.get("emailAddress", {})
.get("address", ""),
message_to=",".join(
[r["emailAddress"]["address"] for r in email_data.get("toRecipients", [])]
),
message_cc=",".join(
[r["emailAddress"]["address"] for r in email_data.get("ccRecipients", [])]
),
message_bcc=",".join(
[r["emailAddress"]["address"] for r in email_data.get("bccRecipients", [])]
),
attachment=bool(email_data.get("hasAttachments")),
message_reply=",".join(
[r["emailAddress"]["address"] for r in email_data.get("replyTo", [])]
),
full_email_response=email_data,
)
session.add(email)
await session.commit()
return email