Initial commit: email-openclaw bridge v1

Full pipeline: IMAP ingress -> OpenClaw dispatch -> callback -> SMTP reply.
SQLite stateful storage with idempotency, threading, and retry logic.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-27 18:16:57 +07:00
co-authored by Claude Opus 4.7
commit 8815c20c13
35 changed files with 2808 additions and 0 deletions
+35
View File
@@ -0,0 +1,35 @@
package database
import (
"os"
"path/filepath"
"testing"
"gorm.io/gorm"
)
// TestDB holds a test database instance with automatic cleanup.
type TestDB struct {
DB *gorm.DB
cleanup func()
}
// NewTestDB creates a temporary SQLite database for testing.
func NewTestDB(t *testing.T) *TestDB {
t.Helper()
dir := t.TempDir()
dbPath := filepath.Join(dir, "test.db")
db, err := Open(dbPath)
if err != nil {
t.Fatalf("open test db: %v", err)
}
return &TestDB{
DB: db,
cleanup: func() {
os.RemoveAll(dir)
},
}
}