add go logr and move scheduler out

This commit is contained in:
2022-06-12 18:46:16 -04:00
parent 7b07cf2c7b
commit 27bea0c91b
7 changed files with 34 additions and 33 deletions

View File

@ -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)

View File

@ -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
}

View File

@ -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"]))
}