fix(imap): IMAP/POP3-Import in korrekten Tenant-Index schreiben
IMAP- und POP3-Importer haben Mails immer nur in emails_global indexiert (TenantID nie gesetzt, idxMgr.Global() statt ForTenant(tenantID)). Dadurch fehlten neue Mails ab dem letzten Server-Neustart im Tenant-Index (Suche zeigte veraltete Ergebnisse). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -412,7 +412,7 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
defer imapSt.Close()
|
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
|
// PROJ-44: trigger OCR for IMAP-imported mails — without this every
|
||||||
// IMAP delivery would remain in ocr_status='pending' forever.
|
// IMAP delivery would remain in ocr_status='pending' forever.
|
||||||
if ocrWorker != nil {
|
if ocrWorker != nil {
|
||||||
@@ -433,7 +433,7 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
defer pop3St.Close()
|
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.
|
// PROJ-44: same OCR hook as the IMAP importer above.
|
||||||
if ocrWorker != nil {
|
if ocrWorker != nil {
|
||||||
pop3Imp.SetOCRSubmit(func(mailID string, tenantID *int64) {
|
pop3Imp.SetOCRSubmit(func(mailID string, tenantID *int64) {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ const batchSize = 50
|
|||||||
type Importer struct {
|
type Importer struct {
|
||||||
store *Store
|
store *Store
|
||||||
mailStore *storage.Store
|
mailStore *storage.Store
|
||||||
idx index.Indexer
|
idxMgr index.TenantIndexer
|
||||||
logger *slog.Logger
|
logger *slog.Logger
|
||||||
// PROJ-44: optional hook into the async OCR worker. Wired in main.go
|
// PROJ-44: optional hook into the async OCR worker. Wired in main.go
|
||||||
// via SetOCRSubmit so the imap package does not import internal/ocr.
|
// 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.
|
// 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{
|
return &Importer{
|
||||||
store: store,
|
store: store,
|
||||||
mailStore: mailStore,
|
mailStore: mailStore,
|
||||||
idx: idx,
|
idxMgr: idxMgr,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -274,9 +274,10 @@ func (imp *Importer) storeAndIndex(raw []byte, tenantID *int64, log *slog.Logger
|
|||||||
HasAttachment: len(pm.Attachments) > 0,
|
HasAttachment: len(pm.Attachments) > 0,
|
||||||
Date: pm.Date,
|
Date: pm.Date,
|
||||||
Size: int64(len(raw)),
|
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)
|
log.Warn("failed to index mail", "id", id, "err", err)
|
||||||
// Non-fatal: mail is stored, just not searchable yet
|
// Non-fatal: mail is stored, just not searchable yet
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import (
|
|||||||
type Importer struct {
|
type Importer struct {
|
||||||
store *Store
|
store *Store
|
||||||
mailStore *storage.Store
|
mailStore *storage.Store
|
||||||
idx index.Indexer
|
idxMgr index.TenantIndexer
|
||||||
logger *slog.Logger
|
logger *slog.Logger
|
||||||
TenantID *int64 // optional tenant assignment for stored mails
|
TenantID *int64 // optional tenant assignment for stored mails
|
||||||
// PROJ-44: optional OCR enqueue hook, wired from main.go.
|
// 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.
|
// 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{
|
return &Importer{
|
||||||
store: store,
|
store: store,
|
||||||
mailStore: mailStore,
|
mailStore: mailStore,
|
||||||
idx: idx,
|
idxMgr: idxMgr,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -167,9 +167,10 @@ func (imp *Importer) storeAndIndex(raw []byte, log *slog.Logger) error {
|
|||||||
HasAttachment: len(pm.Attachments) > 0,
|
HasAttachment: len(pm.Attachments) > 0,
|
||||||
Date: pm.Date,
|
Date: pm.Date,
|
||||||
Size: int64(len(raw)),
|
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)
|
log.Warn("failed to index mail", "id", id, "err", err)
|
||||||
// Non-fatal: mail is stored, just not searchable yet
|
// Non-fatal: mail is stored, just not searchable yet
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user