Ajout d'une newsletter basique
La newsletter effectue une collecte des évènements sur une période de temps donné et envoi un récapitulatif à l'ensemble des utilisateurs de Daddy. Actuellement, sont collectés et présentés: - Les créations de groupes de travail - Les créations de dossiers d'aide à la décision - Les dossiers dont le statut à été modifié et prêt à voté
This commit is contained in:
@ -5,6 +5,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"forge.cadoles.com/Cadoles/daddy/internal/mail"
|
||||
"forge.cadoles.com/Cadoles/daddy/internal/model"
|
||||
"forge.cadoles.com/Cadoles/daddy/internal/voter"
|
||||
|
||||
@ -108,5 +109,11 @@ func getServiceContainer(ctx context.Context, conf *config.Config) (*service.Con
|
||||
model.NewWorkgroupVoter(),
|
||||
))
|
||||
|
||||
ctn.Provide(mail.ServiceName, mail.ServiceProvider(
|
||||
mail.WithServer(conf.SMTP.Host, conf.SMTP.Port),
|
||||
mail.WithCredentials(conf.SMTP.User, conf.SMTP.Password),
|
||||
mail.WithTLS(conf.SMTP.UseStartTLS, conf.SMTP.InsecureSkipVerify),
|
||||
))
|
||||
|
||||
return ctn, nil
|
||||
}
|
||||
|
@ -153,6 +153,8 @@ func main() {
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
go runTaskScheduler(ctx, conf)
|
||||
|
||||
r := chi.NewRouter()
|
||||
|
||||
// Define base middlewares
|
||||
|
85
cmd/server/scheduler.go
Normal file
85
cmd/server/scheduler.go
Normal file
@ -0,0 +1,85 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"gitlab.com/wpetit/goweb/logger"
|
||||
|
||||
"forge.cadoles.com/Cadoles/daddy/internal/config"
|
||||
"forge.cadoles.com/Cadoles/daddy/internal/task"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/robfig/cron/v3"
|
||||
)
|
||||
|
||||
type cronLogger struct {
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
func (l *cronLogger) Info(msg string, keysAndValues ...interface{}) {
|
||||
fields := l.createFields(keysAndValues)
|
||||
logger.Info(l.ctx, msg, fields...)
|
||||
}
|
||||
|
||||
func (l *cronLogger) Error(err error, msg string, keysAndValues ...interface{}) {
|
||||
fields := l.createFields(keysAndValues)
|
||||
fields = append(fields, logger.E(err))
|
||||
logger.Error(l.ctx, msg, fields...)
|
||||
}
|
||||
|
||||
func (l *cronLogger) createFields(keysAndValues ...interface{}) []logger.Field {
|
||||
fields := make([]logger.Field, 0)
|
||||
|
||||
var key string
|
||||
|
||||
for _, v := range keysAndValues {
|
||||
children, ok := v.([]interface{})
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
for i, vv := range children {
|
||||
if i%2 == 0 {
|
||||
key = fmt.Sprintf("%v", vv)
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
fields = append(fields, logger.F(key, vv))
|
||||
}
|
||||
}
|
||||
|
||||
return fields
|
||||
}
|
||||
|
||||
func runTaskScheduler(ctx context.Context, conf *config.Config) {
|
||||
c := cron.New(
|
||||
cron.WithLogger(&cronLogger{ctx}),
|
||||
)
|
||||
|
||||
tasks := map[string]task.Task{
|
||||
conf.Task.Newsletter.CronSpec: task.NewNewsletter(
|
||||
ctx,
|
||||
conf.Task.Newsletter.TimeRange,
|
||||
conf.Task.Newsletter.BaseURL,
|
||||
conf.Task.Newsletter.ContentTemplate,
|
||||
conf.Task.Newsletter.SubjectTemplate,
|
||||
conf.SMTP.SenderAddress,
|
||||
),
|
||||
}
|
||||
|
||||
for spec, task := range tasks {
|
||||
if _, err := c.AddFunc(spec, task.Run); err != nil {
|
||||
logger.Fatal(
|
||||
ctx,
|
||||
"could not schedule task",
|
||||
logger.F("task", task.Name()),
|
||||
logger.E(errors.WithStack(err)),
|
||||
)
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
c.Start()
|
||||
}
|
Reference in New Issue
Block a user