package jobs import ( "context" "time" "github.com/treytartt/honeydue-api/internal/models" "github.com/treytartt/honeydue-api/internal/repositories" ) // TaskRepo defines task query operations needed by job handlers. type TaskRepo interface { GetOverdueTasks(now time.Time, opts repositories.TaskFilterOptions) ([]models.Task, error) GetDueSoonTasks(now time.Time, daysThreshold int, opts repositories.TaskFilterOptions) ([]models.Task, error) GetActiveTasksForUsers(now time.Time, opts repositories.TaskFilterOptions) ([]models.Task, error) } // ResidenceRepo defines residence query operations needed by job handlers. type ResidenceRepo interface { FindResidenceIDsByUser(userID uint) ([]uint, error) } // ReminderRepo defines reminder log operations needed by job handlers. type ReminderRepo interface { HasSentReminderBatch(keys []repositories.ReminderKey) (map[int]bool, error) LogReminder(taskID, userID uint, dueDate time.Time, stage models.ReminderStage, notificationID *uint) (*models.TaskReminderLog, error) CleanupOldLogs(daysOld int) (int64, error) } // NotificationRepo defines notification preference operations needed by job handlers. type NotificationRepo interface { FindPreferencesByUser(userID uint) (*models.NotificationPreference, error) GetActiveTokensForUser(userID uint) ([]string, []string, error) } // NotificationSender creates and sends task notifications. type NotificationSender interface { CreateAndSendTaskNotification(ctx context.Context, userID uint, notificationType models.NotificationType, task *models.Task) error } // PushSender sends push notifications to device tokens. type PushSender interface { SendToAll(ctx context.Context, iosTokens, androidTokens []string, title, message string, data map[string]string) error } // EmailSender sends emails. type EmailSender interface { SendEmail(to, subject, htmlBody, textBody string) error } // OnboardingEmailSender sends onboarding campaign emails. type OnboardingEmailSender interface { CheckAndSendNoResidenceEmails() (int, error) CheckAndSendNoTasksEmails() (int, error) }