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  }