summaryrefslogtreecommitdiff
diff options
from:
to:
context:
space:
mode:
authorGravatar SayaAndy <saya.andy@posteo.com> 2025-10-25 18:57:48 +0700
committerGravatar SayaAndy <saya.andy@posteo.com> 2025-10-25 18:57:48 +0700
commit249f73a7eff43994ed91fb1e1bef8edf5ac6c86a (patch)
tree9c646c0e0ba8b9a1486cfb7732c5db42fbe690a3
parent427ab1a9a4d6094d9f3a84e62f09cc396b49a09b (diff)
downloadweb-249f73a7eff43994ed91fb1e1bef8edf5ac6c86a.tar.gz
web-249f73a7eff43994ed91fb1e1bef8edf5ac6c86a.zip
feat: configurable cron for mail trigger
-rw-r--r--config/config.go19
-rw-r--r--config/config.local.yaml2
-rw-r--r--config/config.prod.yaml2
-rw-r--r--config/config.stage.yaml2
-rw-r--r--internal/blogtrigger/blogtrigger.go4
-rw-r--r--main.go2
6 files changed, 21 insertions, 10 deletions
diff --git a/config/config.go b/config/config.go
index d5dab2d..1393dd8 100644
--- a/config/config.go
+++ b/config/config.go
@@ -62,13 +62,18 @@ type Sqlite3Config struct {
}
type MailConfig struct {
- ClientHost string `json:"ClientHost" yaml:"clientHost" validate:"required"`
- MailHost string `json:"MailHost" yaml:"mailHost" validate:"required"`
- PublicName string `json:"PublicName" yaml:"publicName" validate:"required"`
- MailAddress string `json:"MailAddress" yaml:"mailAddress" validate:"required"`
- Username string `json:"Username" yaml:"username" validate:"required"`
- Password string `json:"Password" yaml:"password" validate:"required"`
- Salt string `json:"Salt" yaml:"salt" validate:"required"`
+ ClientHost string `json:"ClientHost" yaml:"clientHost" validate:"required"`
+ MailHost string `json:"MailHost" yaml:"mailHost" validate:"required"`
+ PublicName string `json:"PublicName" yaml:"publicName" validate:"required"`
+ MailAddress string `json:"MailAddress" yaml:"mailAddress" validate:"required"`
+ Username string `json:"Username" yaml:"username" validate:"required"`
+ Password string `json:"Password" yaml:"password" validate:"required"`
+ Salt string `json:"Salt" yaml:"salt" validate:"required"`
+ Trigger TriggerConfig `json:"Trigger" yaml:"trigger" validate:"required"`
+}
+
+type TriggerConfig struct {
+ OnNewPost string `json:"OnNewPost" yaml:"onNewPost" validate:"cron,required"`
}
func LoadConfig(path string, config *Config) error {
diff --git a/config/config.local.yaml b/config/config.local.yaml
index 008fa93..d40e8e9 100644
--- a/config/config.local.yaml
+++ b/config/config.local.yaml
@@ -42,3 +42,5 @@ mail:
username: '${MAIL_USERNAME}'
password: '${MAIL_PASSWORD}'
salt: '${MAIL_SALT}'
+ trigger:
+ onNewPost: "* * * * *"
diff --git a/config/config.prod.yaml b/config/config.prod.yaml
index 4c0f425..7a9e5ae 100644
--- a/config/config.prod.yaml
+++ b/config/config.prod.yaml
@@ -42,3 +42,5 @@ mail:
username: '${MAIL_USERNAME}'
password: '${MAIL_PASSWORD}'
salt: '${MAIL_SALT}'
+ trigger:
+ onNewPost: "0/5 * * * *"
diff --git a/config/config.stage.yaml b/config/config.stage.yaml
index 003ec05..8a5fde1 100644
--- a/config/config.stage.yaml
+++ b/config/config.stage.yaml
@@ -42,3 +42,5 @@ mail:
username: '${MAIL_USERNAME}'
password: '${MAIL_PASSWORD}'
salt: '${MAIL_SALT}'
+ trigger:
+ onNewPost: "0/3 * * * *"
diff --git a/internal/blogtrigger/blogtrigger.go b/internal/blogtrigger/blogtrigger.go
index ab66981..9b016e8 100644
--- a/internal/blogtrigger/blogtrigger.go
+++ b/internal/blogtrigger/blogtrigger.go
@@ -16,7 +16,7 @@ type BlogTriggerScheduler struct {
onTrigger func([]*b2.BlogPage) error
}
-func NewBlogTriggerScheduler(b2Client *b2.B2Client, availableLanguages []config.AvailableLanguageConfig, onTrigger func([]*b2.BlogPage) error) (*BlogTriggerScheduler, error) {
+func NewBlogTriggerScheduler(b2Client *b2.B2Client, availableLanguages []config.AvailableLanguageConfig, cron string, onTrigger func([]*b2.BlogPage) error) (*BlogTriggerScheduler, error) {
s, err := gocron.NewScheduler()
if err != nil {
return nil, fmt.Errorf("failed to create new scheduler: %w", err)
@@ -30,7 +30,7 @@ func NewBlogTriggerScheduler(b2Client *b2.B2Client, availableLanguages []config.
bts := &BlogTriggerScheduler{s, knownBlogPages, b2Client, onTrigger}
defer bts.s.Start()
- bts.s.NewJob(gocron.CronJob("0/5 * * * *", false), gocron.NewTask(func(bts *BlogTriggerScheduler) {
+ bts.s.NewJob(gocron.CronJob(cron, false), gocron.NewTask(func(bts *BlogTriggerScheduler) {
posts, err := bts.scan()
if err != nil {
slog.Error("failed to execute scanning new blog pages cron job", slog.String("error", err.Error()))
diff --git a/main.go b/main.go
index 9d80cee..bd552a1 100644
--- a/main.go
+++ b/main.go
@@ -153,7 +153,7 @@ func main() {
os.Exit(1)
}
- router.BlogTrigger, err = blogtrigger.NewBlogTriggerScheduler(b2Client, cfg.AvailableLanguages, func(bp []*b2.BlogPage) error {
+ router.BlogTrigger, err = blogtrigger.NewBlogTriggerScheduler(b2Client, cfg.AvailableLanguages, cfg.Mail.Trigger.OnNewPost, func(bp []*b2.BlogPage) error {
for _, post := range bp {
if err := router.Mailer.NewPost(post); err != nil {
return err