feat: implement Gmail API mail source with OAuth2, ingestion tracking, and UI

Agent-Logs-Url: https://github.com/christianlouis/dmarq/sessions/0c63851e-a69a-4a76-8dd8-25618e825b8c

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-03-29 19:34:03 +00:00
parent 2d32830270
commit 25b3567414
10 changed files with 1377 additions and 63 deletions
+12 -1
View File
@@ -15,7 +15,7 @@ class MailSource(Base):
- ``IMAP`` standard IMAP4 (over SSL/TLS or STARTTLS)
- ``POP3`` POP3 inbox (stub for future implementation)
- ``GMAIL_API`` Gmail API with OAuth 2.0 (stub for future implementation)
- ``GMAIL_API`` Gmail API with OAuth 2.0
"""
__tablename__ = "mail_sources"
@@ -38,6 +38,17 @@ class MailSource(Base):
use_ssl = Column(Boolean, default=True)
folder = Column(String, default="INBOX")
# Gmail API OAuth2 credentials (used by GMAIL_API method)
# NOTE: tokens stored in plaintext encrypt at the app layer in production.
gmail_client_id = Column(String, nullable=True)
gmail_client_secret = Column(Text, nullable=True)
gmail_access_token = Column(Text, nullable=True)
gmail_refresh_token = Column(Text, nullable=True)
# Email address of the authorised Gmail account
gmail_email = Column(String, nullable=True)
# JSON-encoded list of Gmail message IDs that have already been ingested
gmail_ingested_ids = Column(Text, nullable=True, default="[]")
# Polling behaviour
polling_interval = Column(Integer, default=60) # minutes