github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/cmd/daily_reporter/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "io" 7 "os" 8 "time" 9 10 "github.com/jinzhu/gorm" 11 12 "github.com/oinume/lekcije/backend/cli" 13 "github.com/oinume/lekcije/backend/domain/config" 14 "github.com/oinume/lekcije/backend/model" 15 ) 16 17 func main() { 18 m := &dailyReporterMain{ 19 outStream: os.Stdout, 20 errStream: os.Stderr, 21 } 22 if err := m.run(os.Args); err != nil { 23 cli.WriteError(m.errStream, err) 24 os.Exit(cli.ExitError) 25 } 26 os.Exit(cli.ExitOK) 27 } 28 29 type dailyReporterMain struct { 30 outStream io.Writer 31 errStream io.Writer 32 db *gorm.DB 33 } 34 35 func (m *dailyReporterMain) run(args []string) error { 36 flagSet := flag.NewFlagSet("daily_reporter", flag.ContinueOnError) 37 flagSet.SetOutput(m.errStream) 38 var ( 39 targetDate = flagSet.String("target-date", time.Now().UTC().Format("2006-01-02"), "Target date (YYYY-MM-DD)") 40 //logLevel = flagSet.String("log-level", "info", "Log level") // TODO: Move to config 41 ) 42 if err := flagSet.Parse(args[1:]); err != nil { 43 return err 44 } 45 46 if *targetDate == "" { 47 return fmt.Errorf("-target-date is required") 48 } 49 date, err := time.Parse("2006-01-02", *targetDate) 50 if err != nil { 51 return fmt.Errorf("invalid date format: %s", *targetDate) 52 } 53 54 config.MustProcessDefault() 55 db, err := model.OpenDB(config.DefaultVars.DBURL(), 1, config.DefaultVars.DebugSQL) 56 if err != nil { 57 cli.WriteError(os.Stderr, err) 58 os.Exit(1) 59 } 60 defer func() { _ = db.Close() }() 61 m.db = db 62 63 if err := m.createStatNewLessonNotifier(date); err != nil { 64 return err 65 } 66 if err := m.createStatDailyUserNotificationEvent(date); err != nil { 67 return err 68 } 69 70 return nil 71 } 72 73 func (m *dailyReporterMain) createStatNewLessonNotifier(date time.Time) error { 74 service := model.NewEventLogEmailService(m.db) 75 stats, err := service.FindStatDailyNotificationEventByDate(date) 76 if err != nil { 77 return err 78 } 79 statUUs, err := service.FindStatDailyNotificationEventUUCountByDate(date) 80 if err != nil { 81 return err 82 } 83 84 values := make(map[string]*model.StatDailyNotificationEvent, 100) 85 for _, s := range stats { 86 values[s.Event] = s 87 } 88 89 statDailyNotificationEventService := model.NewStatDailyNotificationEventService(m.db) 90 for _, s := range statUUs { 91 v := values[s.Event] 92 v.UUCount = s.UUCount 93 if err := statDailyNotificationEventService.CreateOrUpdate(v); err != nil { 94 return err 95 } 96 } 97 98 //statsNewLessonNotifierService := model.NewStatsNewLessonNotifierService(m.GormDB) 99 //for _, s := range statUUs { 100 // v := values[s.Event] 101 // v.UUCount = s.UUCount 102 // if err := statsNewLessonNotifierService.CreateOrUpdate(v); err != nil { 103 // return err 104 // } 105 //} 106 return nil 107 } 108 109 func (m *dailyReporterMain) createStatDailyUserNotificationEvent(date time.Time) error { 110 service := model.NewStatDailyUserNotificationEventService(m.db) 111 return service.CreateOrUpdate(date) 112 }