add go logr and move scheduler out
This commit is contained in:
@ -9,6 +9,7 @@ import (
|
||||
"go.balki.me/tss/log"
|
||||
"go.balki.me/tss/parser"
|
||||
"go.balki.me/tss/proxy"
|
||||
"go.balki.me/tss/schedule"
|
||||
"go.balki.me/tss/telegram"
|
||||
)
|
||||
|
||||
@ -19,7 +20,7 @@ func Run(configPath string) {
|
||||
log.Panic("failed to parse config", "path", configPath, "err", err)
|
||||
}
|
||||
|
||||
scheduler, err := NewScheduler(cfg.LastSuccessPath)
|
||||
scheduler, err := schedule.NewScheduler(cfg.LastSuccessPath)
|
||||
if err != nil {
|
||||
log.Panic("failed to create scheduler", "path", cfg.LastSuccessPath, "error", err)
|
||||
}
|
||||
@ -50,7 +51,7 @@ func Run(configPath string) {
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func ProcessFeed(feed *FeedCfg, scheduler Scheduler, dbDir string, tgram telegram.TelegramSender) {
|
||||
func ProcessFeed(feed *FeedCfg, scheduler schedule.Scheduler, dbDir string, tgram telegram.TelegramSender) {
|
||||
sd, err := scheduler.ShouldDownload(feed.Name, feed.Cron)
|
||||
if err != nil {
|
||||
log.Error("shouldDownload failed", "feed", feed.Name, "err", err)
|
||||
|
@ -1,78 +0,0 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/robfig/cron/v3"
|
||||
"go.balki.me/tss/log"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
type Scheduler interface {
|
||||
ShouldDownload(name string, scheduleSpec string) (bool, error)
|
||||
Save() error
|
||||
Good(name string)
|
||||
}
|
||||
|
||||
type scheduler struct {
|
||||
filePath string
|
||||
mutex sync.Mutex
|
||||
lastSuccessTime map[string]time.Time
|
||||
}
|
||||
|
||||
func NewScheduler(filePath string) (Scheduler, error) {
|
||||
s := scheduler{filePath: filePath, lastSuccessTime: map[string]time.Time{}}
|
||||
data, err := os.ReadFile(filePath)
|
||||
if err != nil {
|
||||
if !errors.Is(err, os.ErrNotExist) {
|
||||
return nil, err
|
||||
}
|
||||
f, err := os.Create(filePath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("path:%v does not exist and unable to create: err: %w", filePath, err)
|
||||
}
|
||||
f.Close()
|
||||
log.Info("scheduler file does not exist, will be created", "path", filePath)
|
||||
} else {
|
||||
err = yaml.Unmarshal(data, &s.lastSuccessTime)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return &s, nil
|
||||
}
|
||||
|
||||
func (s *scheduler) Save() error {
|
||||
s.mutex.Lock()
|
||||
defer s.mutex.Unlock()
|
||||
data, err := yaml.Marshal(&s.lastSuccessTime)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.WriteFile(s.filePath, data, 0644)
|
||||
}
|
||||
|
||||
func (s *scheduler) Good(name string) {
|
||||
s.mutex.Lock()
|
||||
defer s.mutex.Unlock()
|
||||
s.lastSuccessTime[name] = time.Now()
|
||||
}
|
||||
|
||||
func (s *scheduler) ShouldDownload(name string, scheduleSpec string) (bool, error) {
|
||||
s.mutex.Lock()
|
||||
defer s.mutex.Unlock()
|
||||
lastSuccess, ok := s.lastSuccessTime[name]
|
||||
if !ok {
|
||||
return true, nil
|
||||
}
|
||||
cron, err := cron.ParseStandard(scheduleSpec)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
n := cron.Next(lastSuccess)
|
||||
return n.Before(time.Now()), nil
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
func TestYamlMap(t *testing.T) {
|
||||
yesterday := time.Now().Add(-24 * time.Hour)
|
||||
m := map[string]time.Time{
|
||||
"Bala": time.Now(),
|
||||
"Linus": yesterday,
|
||||
}
|
||||
out, err := yaml.Marshal(&m)
|
||||
if err != nil {
|
||||
t.Fatalf("got err: %v", err)
|
||||
}
|
||||
// assert.Equal(t, nil, fmt.Sprintf("%s", out))
|
||||
var m2 map[string]time.Time
|
||||
err = yaml.Unmarshal(out, &m2)
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, "foobar", fmt.Sprint(m2["Bala"]))
|
||||
}
|
Reference in New Issue
Block a user