|
@@ -1,12 +1,11 @@
|
|
|
from dataclasses import dataclass
|
|
|
|
|
|
-from sqlalchemy import or_
|
|
|
-from sqlalchemy.orm import joinedload
|
|
|
+from arrow import Arrow
|
|
|
+from sqlalchemy import or_, func, case
|
|
|
|
|
|
from app.config import PAGE_LIMIT
|
|
|
from app.extensions import db
|
|
|
-
|
|
|
-from app.models import Alias, Mailbox, Contact, EmailLog
|
|
|
+from app.models import Alias, Contact, EmailLog, Mailbox
|
|
|
|
|
|
|
|
|
@dataclass
|
|
@@ -17,6 +16,9 @@ class AliasInfo:
|
|
|
nb_blocked: int
|
|
|
nb_reply: int
|
|
|
|
|
|
+ latest_email_log: EmailLog = None
|
|
|
+ latest_contact: Contact = None
|
|
|
+
|
|
|
|
|
|
def serialize_alias_info(alias_info: AliasInfo) -> dict:
|
|
|
return {
|
|
@@ -34,6 +36,36 @@ def serialize_alias_info(alias_info: AliasInfo) -> dict:
|
|
|
}
|
|
|
|
|
|
|
|
|
+def serialize_alias_info_v2(alias_info: AliasInfo) -> dict:
|
|
|
+ res = {
|
|
|
+ # Alias field
|
|
|
+ "id": alias_info.alias.id,
|
|
|
+ "email": alias_info.alias.email,
|
|
|
+ "creation_date": alias_info.alias.created_at.format(),
|
|
|
+ "creation_timestamp": alias_info.alias.created_at.timestamp,
|
|
|
+ "enabled": alias_info.alias.enabled,
|
|
|
+ "note": alias_info.alias.note,
|
|
|
+ # activity
|
|
|
+ "nb_forward": alias_info.nb_forward,
|
|
|
+ "nb_block": alias_info.nb_blocked,
|
|
|
+ "nb_reply": alias_info.nb_reply,
|
|
|
+ }
|
|
|
+ if alias_info.latest_email_log:
|
|
|
+ email_log = alias_info.latest_email_log
|
|
|
+ contact = alias_info.latest_contact
|
|
|
+ # latest activity
|
|
|
+ res["latest_activity"] = {
|
|
|
+ "timestamp": email_log.created_at.timestamp,
|
|
|
+ "action": email_log.get_action(),
|
|
|
+ "contact": {
|
|
|
+ "email": contact.website_email,
|
|
|
+ "name": contact.name,
|
|
|
+ "reverse_alias": contact.website_send_to(),
|
|
|
+ },
|
|
|
+ }
|
|
|
+ return res
|
|
|
+
|
|
|
+
|
|
|
def serialize_contact(contact: Contact) -> dict:
|
|
|
res = {
|
|
|
"id": contact.id,
|
|
@@ -74,6 +106,40 @@ def get_alias_infos_with_pagination(user, page_id=0, query=None) -> [AliasInfo]:
|
|
|
return ret
|
|
|
|
|
|
|
|
|
+def get_alias_infos_with_pagination_v2(user, page_id=0, query=None) -> [AliasInfo]:
|
|
|
+ ret = []
|
|
|
+ latest_activity = func.max(
|
|
|
+ case(
|
|
|
+ [
|
|
|
+ (Alias.created_at > EmailLog.created_at, Alias.created_at),
|
|
|
+ (Alias.created_at < EmailLog.created_at, EmailLog.created_at),
|
|
|
+ ],
|
|
|
+ else_=Alias.created_at,
|
|
|
+ )
|
|
|
+ ).label("latest")
|
|
|
+
|
|
|
+ q = (
|
|
|
+ db.session.query(Alias, latest_activity)
|
|
|
+ .join(Contact, Alias.id == Contact.alias_id, isouter=True)
|
|
|
+ .join(EmailLog, Contact.id == EmailLog.contact_id, isouter=True)
|
|
|
+ .filter(Alias.user_id == user.id)
|
|
|
+ .group_by(Alias.id)
|
|
|
+ .order_by(latest_activity.desc())
|
|
|
+ )
|
|
|
+
|
|
|
+ if query:
|
|
|
+ q = q.filter(
|
|
|
+ or_(Alias.email.ilike(f"%{query}%"), Alias.note.ilike(f"%{query}%"))
|
|
|
+ )
|
|
|
+
|
|
|
+ q = q.limit(PAGE_LIMIT).offset(page_id * PAGE_LIMIT)
|
|
|
+
|
|
|
+ for alias, latest_activity in q:
|
|
|
+ ret.append(get_alias_info_v2(alias))
|
|
|
+
|
|
|
+ return ret
|
|
|
+
|
|
|
+
|
|
|
def get_alias_info(alias: Alias) -> AliasInfo:
|
|
|
q = (
|
|
|
db.session.query(Contact, EmailLog)
|
|
@@ -94,6 +160,38 @@ def get_alias_info(alias: Alias) -> AliasInfo:
|
|
|
return alias_info
|
|
|
|
|
|
|
|
|
+def get_alias_info_v2(alias: Alias) -> AliasInfo:
|
|
|
+ q = (
|
|
|
+ db.session.query(Contact, EmailLog)
|
|
|
+ .filter(Contact.alias_id == alias.id)
|
|
|
+ .filter(EmailLog.contact_id == Contact.id)
|
|
|
+ )
|
|
|
+
|
|
|
+ latest_activity: Arrow = alias.created_at
|
|
|
+ latest_email_log = None
|
|
|
+ latest_contact = None
|
|
|
+
|
|
|
+ alias_info = AliasInfo(alias=alias, nb_blocked=0, nb_forward=0, nb_reply=0,)
|
|
|
+
|
|
|
+ for contact, email_log in q:
|
|
|
+ if email_log.is_reply:
|
|
|
+ alias_info.nb_reply += 1
|
|
|
+ elif email_log.blocked:
|
|
|
+ alias_info.nb_blocked += 1
|
|
|
+ else:
|
|
|
+ alias_info.nb_forward += 1
|
|
|
+
|
|
|
+ if email_log.created_at > latest_activity:
|
|
|
+ latest_activity = email_log.created_at
|
|
|
+ latest_email_log = email_log
|
|
|
+ latest_contact = contact
|
|
|
+
|
|
|
+ alias_info.latest_contact = latest_contact
|
|
|
+ alias_info.latest_email_log = latest_email_log
|
|
|
+
|
|
|
+ return alias_info
|
|
|
+
|
|
|
+
|
|
|
def get_alias_contacts(alias, page_id: int) -> [dict]:
|
|
|
q = (
|
|
|
Contact.query.filter_by(alias_id=alias.id)
|