-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.go
128 lines (113 loc) · 3.53 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package main
import (
"context"
"flag"
"fmt"
"io"
"net/http"
"os"
"strings"
"time"
"go.uber.org/zap"
"github.com/oinume/lekcije/backend/cli"
"github.com/oinume/lekcije/backend/domain/config"
model_email "github.com/oinume/lekcije/backend/domain/model/email"
"github.com/oinume/lekcije/backend/infrastructure/send_grid"
"github.com/oinume/lekcije/backend/logger"
"github.com/oinume/lekcije/backend/model"
"github.com/oinume/lekcije/backend/model2"
)
func main() {
m := &followReminderMain{
outStream: os.Stdout,
errStream: os.Stderr,
}
if err := m.run(os.Args); err != nil {
cli.WriteError(m.errStream, err)
os.Exit(cli.ExitError)
}
os.Exit(cli.ExitOK)
}
type followReminderMain struct {
outStream io.Writer
errStream io.Writer
}
func (m *followReminderMain) run(args []string) error {
flagSet := flag.NewFlagSet("follow_reminder", flag.ContinueOnError)
flagSet.SetOutput(m.errStream)
var (
dryRun = flagSet.Bool("dry-run", false, "Don't update database with fetched lessons")
targetDate = flagSet.String("target-date", "", "Specify registration date of users")
logLevel = flagSet.String("log-level", "info", "Log level")
)
if err := flagSet.Parse(args[1:]); err != nil {
return err
}
config.MustProcessDefault()
startedAt := time.Now().UTC()
appLogger := logger.NewAppLogger(os.Stderr, logger.NewLevel(*logLevel))
appLogger.Info("follow_reminder started")
defer func() {
elapsed := time.Now().UTC().Sub(startedAt) / time.Millisecond
appLogger.Info("follow_reminder finished", zap.Int("elapsed", int(elapsed)))
}()
db, err := model.OpenDB(config.DefaultVars.DBURL(), 1, config.DefaultVars.DebugSQL)
if err != nil {
return err
}
defer func() { _ = db.Close() }()
ctx := context.Background()
var date time.Time
if *targetDate == "" {
date = time.Now().UTC().Add(-1 * 24 * time.Hour)
} else {
date, err = time.Parse("2006-01-02", *targetDate)
if err != nil {
return fmt.Errorf("failed to parse 'target-date': %v", *targetDate)
}
}
users, err := model.NewUserService(db).FindAllFollowedTeacherAtIsNull(date)
if err != nil {
return err
}
sender := send_grid.NewEmailSender(http.DefaultClient, appLogger)
templateText := getEmailTemplate()
for _, user := range users {
t := model_email.NewTemplate("follow_reminder", templateText)
data := struct {
To string
Name string
}{
To: user.Email,
Name: user.Name,
}
mail, err := model_email.NewFromTemplate(t, data)
if err != nil {
return err
}
mail.SetCustomArg("email_type", model2.EmailTypeFollowReminder)
mail.SetCustomArg("user_id", fmt.Sprint(user.ID))
if !*dryRun {
if err := sender.Send(ctx, mail); err != nil {
return err
}
}
appLogger.Info("followReminder", zap.Uint("userID", uint(user.ID)), zap.String("email", user.Email))
}
return nil
}
func getEmailTemplate() string {
return strings.TrimSpace(`
From: lekcije@lekcije.com
To: {{ .To }}
Subject: lekcijeでお気に入りの講師をフォローしましょう
Body: text/html
<a href="https://www.lekcije.com/">lekcije</a>をご利用いただきありがとうございます。
lekcijeでお気入りのDMM英会話の講師をフォローしてみましょう。
フォローすると、講師の空きレッスンが登録された時にメールでお知らせが届きます。
フォローの仕方がわからない場合は下記をチェック!
<a href="https://lekcije.amebaownd.com/posts/2044879">PC</a>
<a href="https://lekcije.amebaownd.com/posts/1577091">Mobile</a>
今後ともlekcijeをよろしくお願いいたします。
`)
}