summaryrefslogtreecommitdiff
path: root/srv/cmd/mailinglist-cli/main.go
blob: ca4ccd612343ba56fa2c9bae86b64e37738a318f (plain)
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
package main

import (
	"context"
	"errors"
	"fmt"
	"io"
	"path"

	"github.com/mediocregopher/blog.mediocregopher.com/srv/cfg"
	"github.com/mediocregopher/blog.mediocregopher.com/srv/mailinglist"
	"github.com/mediocregopher/mediocre-go-lib/v2/mctx"
	"github.com/mediocregopher/mediocre-go-lib/v2/mlog"
	"github.com/tilinna/clock"
)

func loggerFatalErr(ctx context.Context, logger *mlog.Logger, descr string, err error) {
	logger.Fatal(ctx, fmt.Sprintf("%s: %v", descr, err))
}

func main() {
	ctx := context.Background()
	cfg := cfg.New()

	dataDir := cfg.String("data-dir", ".", "Directory to use for long term storage")

	var mailerParams mailinglist.MailerParams
	mailerParams.SetupCfg(cfg)
	ctx = mctx.WithAnnotator(ctx, &mailerParams)

	var mlParams mailinglist.Params
	mlParams.SetupCfg(cfg)
	ctx = mctx.WithAnnotator(ctx, &mlParams)

	// initialization
	err := cfg.Init(ctx)

	logger := mlog.NewLogger(nil)
	defer logger.Close()

	logger.Info(ctx, "process started")
	defer logger.Info(ctx, "process exiting")

	if err != nil {
		loggerFatalErr(ctx, logger, "initializing", err)
	}

	clock := clock.Realtime()

	var mailer mailinglist.Mailer
	if mailerParams.SMTPAddr == "" {
		logger.Info(ctx, "-smtp-addr not given, using NullMailer")
		mailer = mailinglist.NullMailer
	} else {
		mailer = mailinglist.NewMailer(mailerParams)
	}

	mlStore, err := mailinglist.NewStore(path.Join(*dataDir, "mailinglist.sqlite3"))
	if err != nil {
		loggerFatalErr(ctx, logger, "initializing mailing list storage", err)
	}
	defer mlStore.Close()

	mlParams.Store = mlStore
	mlParams.Mailer = mailer
	mlParams.Clock = clock

	ml := mailinglist.New(mlParams)
	_ = ml

	args := cfg.Args()
	if len(args) == 0 {
		args = append(args, "")
	}

	action, args := args[0], args[1:]

	switch action {
	case "list":
		for it := mlStore.GetAll(); ; {
			email, err := it()
			if errors.Is(err, io.EOF) {
				break
			} else if err != nil {
				loggerFatalErr(ctx, logger, "retrieving next email", err)
			}

			ctx := mctx.Annotate(context.Background(),
				"email", email.Email,
				"createdAt", email.CreatedAt,
				"verifiedAt", email.VerifiedAt,
			)

			logger.Info(ctx, "next")
		}

	default:
		logger.Fatal(ctx, "invalid action")
	}
}