show-rss/src/cmd/cron/main.go

65 lines
1.3 KiB
Go

package cron
import (
"context"
"fmt"
"show-rss/src/feeds"
"time"
"github.com/robfig/cron/v3"
)
func Main(ctx context.Context) error {
c := time.NewTicker(time.Minute)
defer c.Stop()
for {
if err := One(ctx); err != nil {
return err
}
select {
case <-ctx.Done():
case <-c.C:
}
}
return ctx.Err()
}
func One(ctx context.Context) error {
f, err := feeds.New(ctx)
if err != nil {
return err
}
return f.ForEach(ctx, func(feed feeds.Feed) error {
if err := one(ctx, feed); err != nil {
return fmt.Errorf("failed to cron %s (%+v): %w", feed.Entry.ID, feed.Version, err)
}
return nil
})
}
func one(ctx context.Context, feed feeds.Feed) error {
if schedule, err := cron.NewParser(
cron.SecondOptional |
cron.Minute |
cron.Hour |
cron.Dom |
cron.Month |
cron.Dow |
cron.Descriptor,
).Parse(feed.Version.Cron); err != nil {
return fmt.Errorf("illegal cron %q", feed.Version.Cron)
} else if next := schedule.Next(feed.Execution.Executed); time.Now().Before(next) {
return nil
}
return fmt.Errorf("should GET %s", feed.Version.URL)
f, err := feeds.New(ctx)
if err != nil {
return fmt.Errorf("failed new feeds to executed %s: %w", feed.Entry.ID, err)
}
return f.Executed(ctx, feed.Entry.ID, feed.Version.Created)
}