Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
95155a9
feat(email): implement email attachment handling and retrieval features
tlavu2004 Apr 11, 2026
c0506e2
fix(docker-compose): update network configuration for app service to …
tlavu2004 Apr 11, 2026
eec56f0
fix(email): enhance email processing and synchronization features, in…
tlavu2004 Apr 12, 2026
f27d2b7
feat(email): add attachment download functionality to EmailController…
tlavu2004 Apr 12, 2026
88da771
fix(dockerfile): remove cache bust comment to streamline build process
tlavu2004 Apr 12, 2026
f774d4c
fix(email): optimize attachment retrieval in ImapService with recursi…
tlavu2004 Apr 13, 2026
cc8d836
feat(email): add external URL field to attachments and update related…
tlavu2004 Apr 13, 2026
e9f7800
fix(email): enhance EmailEntityDto and MailMessageDto to include clou…
tlavu2004 Apr 13, 2026
baad635
fix(logging): uncomment log file configuration in application.yaml
tlavu2004 Apr 13, 2026
d97ebe0
fix(database): recreate email_attachments table with external_url for…
tlavu2004 Apr 13, 2026
4bba173
fix(email): replace flawed multipart parsing with robust recursive co…
tlavu2004 Apr 13, 2026
cb73637
docs(readme): update ER diagram and migration count for email attachm…
tlavu2004 Apr 13, 2026
f4dd408
fix(config): add MAIL_SYNC_BATCH_SIZE to .env.example and application…
tlavu2004 Apr 14, 2026
c25b016
fix(sync): enhance email synchronization with batch size configuratio…
tlavu2004 Apr 14, 2026
efb73da
fix(email): enhance attachment handling in ImapService with content t…
tlavu2004 Apr 14, 2026
518d004
fix(email): add recipient fields and enhance email entity structure f…
tlavu2004 Apr 14, 2026
c504553
fix(email): enhance plain-text email handling by converting legacy fo…
tlavu2004 Apr 15, 2026
9d83574
fix(gmail): improve WebSocket notification payload structure for emai…
tlavu2004 Apr 15, 2026
b701943
fix(email): enhance email synchronization and notification handling f…
tlavu2004 Apr 15, 2026
c6a8439
fix(email): update Gmail link generation to include authuser paramete…
tlavu2004 Apr 15, 2026
174d87b
fix(email): standardize date handling and update Gmail URL generation…
tlavu2004 Apr 16, 2026
1e34e8c
fix(ai): enhance local LLM integration and API key management for imp…
tlavu2004 Apr 17, 2026
ae4ece2
fix(email): implement pagination for email retrieval in LegacyDashboa…
tlavu2004 Apr 17, 2026
061a183
fix(email): enhance notification handling for unsnoozed emails with e…
tlavu2004 Apr 17, 2026
66bcade
fix(email): enhance HTML injection for premium experience with improv…
tlavu2004 Apr 20, 2026
1c777e7
fix(email): add support for CC recipients in email DTO mapping
tlavu2004 Apr 22, 2026
b44ecd1
fix(notification): implement raw notification sending to improve fron…
tlavu2004 Apr 22, 2026
fc24555
fix(email): enhance email label management with Message-ID based oper…
tlavu2004 Apr 24, 2026
9c1b86c
fix(email): synchronize email status with provider and enhance label …
tlavu2004 Apr 24, 2026
bace197
fix(email): enhance email synchronization with Gmail using history AP…
tlavu2004 Apr 25, 2026
b74a13a
fix(email): enhance EmailEntityDto with additional properties and imp…
tlavu2004 Apr 25, 2026
c24301d
fix(email): enhance draft management by adding support for Gmail draf…
tlavu2004 Apr 26, 2026
9ab50f2
fix(email): implement draft cleanup logic and enhance draft count log…
tlavu2004 Apr 26, 2026
0dea4b7
fix(email): enhance draft deletion logic and improve email synchroniz…
tlavu2004 Apr 26, 2026
3bf9132
feat(email): implement EmailSender entity and repository for enhanced…
tlavu2004 Apr 28, 2026
eedce5c
fix(email): enhance sorting and filtering logic in LegacyDashboardCon…
tlavu2004 Apr 28, 2026
8b8d8ef
feat(navigation): Implement trash management and cleanup for emails
tlavu2004 Apr 30, 2026
0cdd86f
fix(email): update response messages to indicate background processin…
tlavu2004 Apr 30, 2026
dfc7b14
fix(email): treat NULL status as INBOX in email filtering logic
tlavu2004 Apr 30, 2026
f7ab842
fix(email): add @Async annotation to syncEmailsForUser method for asy…
tlavu2004 Apr 30, 2026
3332f91
fix(email): enhance WebSocket notifications and update email status q…
tlavu2004 May 1, 2026
5dc5f87
fix(email): enhance WebSocket notification handling and improve snipp…
tlavu2004 May 1, 2026
62d79b2
feat(email): add endpoint to retrieve all known email contacts and im…
tlavu2004 May 2, 2026
7b8f3b2
fix(email): add bulk modify and bulk delete endpoints for email manag…
tlavu2004 May 2, 2026
57061d1
fix(email): optimize bulk email synchronization and notification hand…
tlavu2004 May 2, 2026
294883f
fix(email): simplify unread and starred count queries and update bulk…
tlavu2004 May 3, 2026
b39cc28
fix(email): add threadId, gmailMessageId, gmailDraftId, and isStarred…
tlavu2004 May 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,7 @@ GMAIL_PUBSUB_TOPIC=projects/{PROJECT_ID}/topics/gmail-notifications

# Ngrok Auth Token (for Dockerized tunnel)
NGROK_AUTHTOKEN=

# Syncing Configuration
MAIL_SYNC_BATCH_SIZE=

16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ erDiagram
USERS ||--o{ EMAIL_ACCOUNTS : owns
USERS ||--o{ REFRESH_TOKENS : has
EMAIL_ACCOUNTS ||--o{ EMAILS : syncs
EMAILS ||--o{ EMAIL_ATTACHMENTS : contains
KANBAN_COLUMNS }o--|| USERS : "belongs to"

USERS {
Expand Down Expand Up @@ -159,6 +160,7 @@ erDiagram
text body
string status
double kanban_order
timestamp received_date
timestamp snoozed_until
text summary
string summary_source
Expand All @@ -169,6 +171,18 @@ erDiagram
vector embedding_384
}

EMAIL_ATTACHMENTS {
bigint id PK
bigint email_id FK
string filename
string content_type
bigint size
string server_attachment_id
string content_id
string external_url
boolean inline
}

KANBAN_COLUMNS {
bigint id PK
bigint user_id FK
Expand All @@ -189,7 +203,7 @@ erDiagram

- **Vector Indexes**: HNSW indexes on `embedding_768` and `embedding_384` for sub-second semantic search.
- **Trigram Indexes**: GIN trigram indexes on `subject` and `sender` for fast fuzzy text matching.
- **Migrations**: 6 Flyway migrations managing schema evolution from extensions to Kanban columns.
- **Migrations**: 7 Flyway migrations managing schema evolution from extensions to email attachments.

---

Expand Down
4 changes: 3 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ services:
depends_on:
- postgresql
networks:
- mailboard-network
mailboard-network:
aliases:
- app

ngrok:
image: ngrok/ngrok:latest
Expand Down
8 changes: 8 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,14 @@
</dependencies>

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/scripts/tests/.venv/**</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
Expand Down
34 changes: 34 additions & 0 deletions src/main/java/DbCheck.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import java.sql.*;
import java.util.*;

public class DbCheck {
public static void main(String[] args) throws Exception {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost:5432/mailboard";
Properties props = new Properties();
props.setProperty("user", "postgres");
props.setProperty("password", "postgres");

try (Connection conn = DriverManager.getConnection(url, props)) {
System.out.println("--- EMAIL STATUS DUMP ---");
String sql = "SELECT id, subject, status, account_id FROM emails ORDER BY id DESC LIMIT 50";
try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
System.out.printf("ID: %d | Subject: %s | Status: [%s] | Account: %d%n",
rs.getLong("id"),
rs.getString("subject"),
rs.getString("status"),
rs.getLong("account_id"));
}
}

System.out.println("\n--- STATUS COUNTS ---");
sql = "SELECT status, COUNT(*) as count FROM emails GROUP BY status";
try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
System.out.printf("Status: [%s] | Count: %d%n", rs.getString("status"), rs.getInt("count"));
}
}
}
}
}
Loading
Loading