@@ -14,8 +14,10 @@ import (
1414 "time"
1515
1616 "github.com/bravo1goingdark/mailgrid/config"
17+ "github.com/bravo1goingdark/mailgrid/database"
1718 "github.com/bravo1goingdark/mailgrid/email"
1819 "github.com/bravo1goingdark/mailgrid/internal/types"
20+ "github.com/bravo1goingdark/mailgrid/logger"
1921 "github.com/bravo1goingdark/mailgrid/monitor"
2022 "github.com/bravo1goingdark/mailgrid/offset"
2123 "github.com/bravo1goingdark/mailgrid/parser"
@@ -51,6 +53,16 @@ func Run(args CLIArgs) error {
5153 }
5254 }()
5355
56+ // Handle --jobs-list flag
57+ if args .ListJobs {
58+ return listScheduledJobs (args .EnvPath )
59+ }
60+
61+ // Handle --jobs-cancel flag
62+ if args .CancelJobID != "" {
63+ return cancelScheduledJob (args .EnvPath , args .CancelJobID )
64+ }
65+
5466 // Run scheduler dispatcher in foreground
5567 if args .SchedulerRun {
5668 // Load SMTP config for the scheduler
@@ -460,3 +472,68 @@ func Run(args CLIArgs) error {
460472
461473 return nil
462474}
475+
476+ // listScheduledJobs lists all scheduled jobs from the database
477+ func listScheduledJobs (envPath string ) error {
478+ if envPath == "" {
479+ return fmt .Errorf ("config file required (--env)" )
480+ }
481+
482+ db , err := database .NewDB ("mailgrid.db" )
483+ if err != nil {
484+ return fmt .Errorf ("failed to open database: %w" , err )
485+ }
486+ defer db .Close ()
487+
488+ log := logger .New ("scheduler" )
489+ sched := scheduler .NewScheduler (db , log )
490+
491+ jobs , err := sched .ListJobs ()
492+ if err != nil {
493+ return fmt .Errorf ("failed to list jobs: %w" , err )
494+ }
495+
496+ if len (jobs ) == 0 {
497+ fmt .Println ("No scheduled jobs found." )
498+ return nil
499+ }
500+
501+ fmt .Printf ("Found %d job(s):\n \n " , len (jobs ))
502+ fmt .Printf ("%-30s %-15s %-20s %s\n " , "JOB ID" , "STATUS" , "RUN AT" , "CREATED AT" )
503+ fmt .Println ("--------------------------------------------------------------------" )
504+
505+ for _ , job := range jobs {
506+ runAt := job .RunAt .Format ("2006-01-02 15:04:05" )
507+ createdAt := job .CreatedAt .Format ("2006-01-02 15:04:05" )
508+ fmt .Printf ("%-30s %-15s %-20s %s\n " , job .ID , job .Status , runAt , createdAt )
509+ }
510+
511+ return nil
512+ }
513+
514+ // cancelScheduledJob cancels a scheduled job by ID
515+ func cancelScheduledJob (envPath , jobID string ) error {
516+ if envPath == "" {
517+ return fmt .Errorf ("config file required (--env)" )
518+ }
519+ if jobID == "" {
520+ return fmt .Errorf ("job ID required (--jobs-cancel)" )
521+ }
522+
523+ db , err := database .NewDB ("mailgrid.db" )
524+ if err != nil {
525+ return fmt .Errorf ("failed to open database: %w" , err )
526+ }
527+ defer db .Close ()
528+
529+ log := logger .New ("scheduler" )
530+ sched := scheduler .NewScheduler (db , log )
531+
532+ success := sched .CancelJob (jobID )
533+ if ! success {
534+ return fmt .Errorf ("job not found or could not be cancelled: %s" , jobID )
535+ }
536+
537+ fmt .Printf ("Job %s cancelled successfully.\n " , jobID )
538+ return nil
539+ }
0 commit comments