feat: added a cron service
This commit is contained in:
parent
5323e43bdb
commit
0eb6a9a3a3
|
@ -4,11 +4,13 @@ import (
|
||||||
"crypto/ed25519"
|
"crypto/ed25519"
|
||||||
"git.lumeweb.com/LumeWeb/portal/account"
|
"git.lumeweb.com/LumeWeb/portal/account"
|
||||||
"git.lumeweb.com/LumeWeb/portal/api"
|
"git.lumeweb.com/LumeWeb/portal/api"
|
||||||
|
"git.lumeweb.com/LumeWeb/portal/cron"
|
||||||
"git.lumeweb.com/LumeWeb/portal/db"
|
"git.lumeweb.com/LumeWeb/portal/db"
|
||||||
"git.lumeweb.com/LumeWeb/portal/interfaces"
|
"git.lumeweb.com/LumeWeb/portal/interfaces"
|
||||||
"git.lumeweb.com/LumeWeb/portal/protocols"
|
"git.lumeweb.com/LumeWeb/portal/protocols"
|
||||||
"git.lumeweb.com/LumeWeb/portal/storage"
|
"git.lumeweb.com/LumeWeb/portal/storage"
|
||||||
"github.com/casbin/casbin/v2"
|
"github.com/casbin/casbin/v2"
|
||||||
|
"github.com/go-co-op/gocron/v2"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
@ -29,13 +31,7 @@ type PortalImpl struct {
|
||||||
database interfaces.Database
|
database interfaces.Database
|
||||||
casbin *casbin.Enforcer
|
casbin *casbin.Enforcer
|
||||||
accounts interfaces.AccountService
|
accounts interfaces.AccountService
|
||||||
}
|
cron interfaces.CronService
|
||||||
|
|
||||||
func (p *PortalImpl) DatabaseService() interfaces.Database {
|
|
||||||
return p.database
|
|
||||||
}
|
|
||||||
func (p *PortalImpl) Database() *gorm.DB {
|
|
||||||
return p.database.Get()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPortal() interfaces.Portal {
|
func NewPortal() interfaces.Portal {
|
||||||
|
@ -49,13 +45,29 @@ func NewPortal() interfaces.Portal {
|
||||||
storageServ := storage.NewStorageService(portal)
|
storageServ := storage.NewStorageService(portal)
|
||||||
database := db.NewDatabase(portal)
|
database := db.NewDatabase(portal)
|
||||||
accountService := account.NewAccountService(portal)
|
accountService := account.NewAccountService(portal)
|
||||||
|
cronService := cron.NewCronServiceImpl(portal)
|
||||||
portal.storage = storageServ
|
portal.storage = storageServ
|
||||||
portal.database = database
|
portal.database = database
|
||||||
portal.accounts = accountService
|
portal.accounts = accountService
|
||||||
|
portal.cron = cronService
|
||||||
|
|
||||||
return portal
|
return portal
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *PortalImpl) DatabaseService() interfaces.Database {
|
||||||
|
return p.database
|
||||||
|
}
|
||||||
|
func (p *PortalImpl) Database() *gorm.DB {
|
||||||
|
return p.database.Get()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PortalImpl) Cron() gocron.Scheduler {
|
||||||
|
return p.cron.Scheduler()
|
||||||
|
}
|
||||||
|
func (p *PortalImpl) CronService() interfaces.CronService {
|
||||||
|
return p.cron
|
||||||
|
}
|
||||||
|
|
||||||
func (p *PortalImpl) Initialize() error {
|
func (p *PortalImpl) Initialize() error {
|
||||||
for _, initFunc := range getInitList() {
|
for _, initFunc := range getInitList() {
|
||||||
if err := initFunc(p); err != nil {
|
if err := initFunc(p); err != nil {
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
package cron
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.lumeweb.com/LumeWeb/portal/interfaces"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
|
||||||
|
"github.com/go-co-op/gocron/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ interfaces.CronService = (*CronServiceImpl)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
type CronServiceImpl struct {
|
||||||
|
scheduler gocron.Scheduler
|
||||||
|
services []interfaces.CronableService
|
||||||
|
portal interfaces.Portal
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CronServiceImpl) Scheduler() gocron.Scheduler {
|
||||||
|
return c.scheduler
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCronServiceImpl(portal interfaces.Portal) interfaces.CronService {
|
||||||
|
return &CronServiceImpl{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CronServiceImpl) Init() error {
|
||||||
|
s, err := gocron.NewScheduler()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c.scheduler = s
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CronServiceImpl) Start() error {
|
||||||
|
for _, service := range c.services {
|
||||||
|
err := service.LoadInitialTasks(c)
|
||||||
|
if err != nil {
|
||||||
|
c.portal.Logger().Fatal("Failed to load initial tasks for service", zap.Error(err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CronServiceImpl) RegisterService(service interfaces.CronableService) {
|
||||||
|
c.services = append(c.services, service)
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package interfaces
|
||||||
|
|
||||||
|
import "github.com/go-co-op/gocron/v2"
|
||||||
|
|
||||||
|
type CronService interface {
|
||||||
|
Scheduler() gocron.Scheduler
|
||||||
|
Service
|
||||||
|
}
|
||||||
|
|
||||||
|
type CronableService interface {
|
||||||
|
LoadInitialTasks(cron CronService) error
|
||||||
|
Service
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ package interfaces
|
||||||
import (
|
import (
|
||||||
"crypto/ed25519"
|
"crypto/ed25519"
|
||||||
"github.com/casbin/casbin/v2"
|
"github.com/casbin/casbin/v2"
|
||||||
|
"github.com/go-co-op/gocron/v2"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
@ -24,4 +25,6 @@ type Portal interface {
|
||||||
Casbin() *casbin.Enforcer
|
Casbin() *casbin.Enforcer
|
||||||
SetCasbin(e *casbin.Enforcer)
|
SetCasbin(e *casbin.Enforcer)
|
||||||
Accounts() AccountService
|
Accounts() AccountService
|
||||||
|
CronService() CronService
|
||||||
|
Cron() gocron.Scheduler
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue