diff --git a/cmd/archivmail/main.go b/cmd/archivmail/main.go index a700fd9..b7f4dae 100644 --- a/cmd/archivmail/main.go +++ b/cmd/archivmail/main.go @@ -412,7 +412,7 @@ func main() { os.Exit(1) } defer imapSt.Close() - imapImp := imapstore.NewImporter(imapSt, mailStore, idx, logger) + imapImp := imapstore.NewImporter(imapSt, mailStore, idxMgr, logger) // PROJ-44: trigger OCR for IMAP-imported mails — without this every // IMAP delivery would remain in ocr_status='pending' forever. if ocrWorker != nil { @@ -433,7 +433,7 @@ func main() { os.Exit(1) } defer pop3St.Close() - pop3Imp := pop3store.NewImporter(pop3St, mailStore, idx, logger) + pop3Imp := pop3store.NewImporter(pop3St, mailStore, idxMgr, logger) // PROJ-44: same OCR hook as the IMAP importer above. if ocrWorker != nil { pop3Imp.SetOCRSubmit(func(mailID string, tenantID *int64) { diff --git a/internal/imap/importer.go b/internal/imap/importer.go index 3b6e17e..5dfa19d 100644 --- a/internal/imap/importer.go +++ b/internal/imap/importer.go @@ -21,7 +21,7 @@ const batchSize = 50 type Importer struct { store *Store mailStore *storage.Store - idx index.Indexer + idxMgr index.TenantIndexer logger *slog.Logger // PROJ-44: optional hook into the async OCR worker. Wired in main.go // via SetOCRSubmit so the imap package does not import internal/ocr. @@ -29,11 +29,11 @@ type Importer struct { } // NewImporter creates a new Importer wired to the storage and index backends. -func NewImporter(store *Store, mailStore *storage.Store, idx index.Indexer, logger *slog.Logger) *Importer { +func NewImporter(store *Store, mailStore *storage.Store, idxMgr index.TenantIndexer, logger *slog.Logger) *Importer { return &Importer{ store: store, mailStore: mailStore, - idx: idx, + idxMgr: idxMgr, logger: logger, } } @@ -274,9 +274,10 @@ func (imp *Importer) storeAndIndex(raw []byte, tenantID *int64, log *slog.Logger HasAttachment: len(pm.Attachments) > 0, Date: pm.Date, Size: int64(len(raw)), + TenantID: tenantID, } - if err := imp.idx.IndexSync(doc); err != nil { + if err := imp.idxMgr.ForTenant(tenantID).IndexSync(doc); err != nil { log.Warn("failed to index mail", "id", id, "err", err) // Non-fatal: mail is stored, just not searchable yet } diff --git a/internal/pop3/importer.go b/internal/pop3/importer.go index 409c2d9..a109b90 100644 --- a/internal/pop3/importer.go +++ b/internal/pop3/importer.go @@ -16,7 +16,7 @@ import ( type Importer struct { store *Store mailStore *storage.Store - idx index.Indexer + idxMgr index.TenantIndexer logger *slog.Logger TenantID *int64 // optional tenant assignment for stored mails // PROJ-44: optional OCR enqueue hook, wired from main.go. @@ -24,11 +24,11 @@ type Importer struct { } // NewImporter creates a new Importer wired to the storage and index backends. -func NewImporter(store *Store, mailStore *storage.Store, idx index.Indexer, logger *slog.Logger) *Importer { +func NewImporter(store *Store, mailStore *storage.Store, idxMgr index.TenantIndexer, logger *slog.Logger) *Importer { return &Importer{ store: store, mailStore: mailStore, - idx: idx, + idxMgr: idxMgr, logger: logger, } } @@ -167,9 +167,10 @@ func (imp *Importer) storeAndIndex(raw []byte, log *slog.Logger) error { HasAttachment: len(pm.Attachments) > 0, Date: pm.Date, Size: int64(len(raw)), + TenantID: imp.TenantID, } - if err := imp.idx.IndexSync(doc); err != nil { + if err := imp.idxMgr.ForTenant(imp.TenantID).IndexSync(doc); err != nil { log.Warn("failed to index mail", "id", id, "err", err) // Non-fatal: mail is stored, just not searchable yet }