diff --git a/internal/httpapi/mail_sync.go b/internal/httpapi/mail_sync.go index e36ba10..9398b43 100644 --- a/internal/httpapi/mail_sync.go +++ b/internal/httpapi/mail_sync.go @@ -65,12 +65,19 @@ func syncProjectMail(ctx context.Context, db *gorm.DB, mailer *mailsync.Service, // AI 자동 요약: 아직 요약이 없는 메일에만 생성(긁어올 때마다 신규분에 채움). 비용·시간 // 폭주 방지로 회당 상한. + // 미생성 판정은 COALESCE(summary,'')='' — summary 컬럼 추가 이전에 저장된 행은 값이 + // NULL이라 `summary = ''`로는 영원히 안 잡혔다(SQL에서 NULL = '' 는 거짓). NULL·빈문자열 + // 둘 다 포함해야 기존 백로그도 채워진다. if cl := ai.New(aiKey); cl.Enabled() { var need []models.ProjectMailMsg - db.Where("project_id = ? AND summary = '' AND snippet <> ''", projectID).Limit(40).Find(&need) + db.Where("project_id = ? AND COALESCE(summary, '') = '' AND snippet <> ''", projectID).Limit(150).Find(&need) for _, row := range need { sum, err := cl.Summarize(ctx, row.Subject+"\n"+row.Snippet) - if err == nil && sum != "" { + if err != nil { + log.Printf("mailsync: AI 요약 실패 (project=%s msg=%s): %v", projectID, row.ID, err) + continue + } + if sum != "" { db.Model(&models.ProjectMailMsg{}).Where("id = ?", row.ID).Update("summary", sum) } }