126 lines
2.8 KiB
Go
126 lines
2.8 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/titpetric/factory"
|
|
|
|
"github.com/crusttech/crust/compose/internal/repository"
|
|
"github.com/crusttech/crust/compose/types"
|
|
)
|
|
|
|
type (
|
|
trigger struct {
|
|
db *factory.DB
|
|
ctx context.Context
|
|
|
|
prmSvc PermissionsService
|
|
|
|
triggerRepo repository.TriggerRepository
|
|
}
|
|
|
|
TriggerService interface {
|
|
With(ctx context.Context) TriggerService
|
|
|
|
FindByID(namespaceID, triggerID uint64) (*types.Trigger, error)
|
|
Find(filter types.TriggerFilter) (set types.TriggerSet, f types.TriggerFilter, err error)
|
|
|
|
Create(trigger *types.Trigger) (*types.Trigger, error)
|
|
Update(trigger *types.Trigger) (*types.Trigger, error)
|
|
DeleteByID(namespaceID, triggerID uint64) error
|
|
}
|
|
)
|
|
|
|
func Trigger() TriggerService {
|
|
return (&trigger{
|
|
prmSvc: DefaultPermissions,
|
|
}).With(context.Background())
|
|
}
|
|
|
|
func (svc trigger) With(ctx context.Context) TriggerService {
|
|
db := repository.DB(ctx)
|
|
return &trigger{
|
|
db: db,
|
|
ctx: ctx,
|
|
|
|
prmSvc: svc.prmSvc.With(ctx),
|
|
|
|
triggerRepo: repository.Trigger(ctx, db),
|
|
}
|
|
}
|
|
|
|
func (svc trigger) FindByID(namespaceID, triggerID uint64) (c *types.Trigger, err error) {
|
|
if namespaceID == 0 {
|
|
return nil, ErrNamespaceRequired
|
|
}
|
|
|
|
if c, err = svc.triggerRepo.FindByID(namespaceID, triggerID); err != nil {
|
|
return
|
|
} else if !svc.prmSvc.CanReadTrigger(c) {
|
|
return nil, ErrNoReadPermissions.withStack()
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (svc trigger) Find(filter types.TriggerFilter) (set types.TriggerSet, f types.TriggerFilter, err error) {
|
|
set, f, err = svc.triggerRepo.Find(filter)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
set, _ = set.Filter(func(m *types.Trigger) (bool, error) {
|
|
return svc.prmSvc.CanReadTrigger(m), nil
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
func (svc trigger) Create(mod *types.Trigger) (c *types.Trigger, err error) {
|
|
if !svc.prmSvc.CanCreateTrigger(crmNamespace()) {
|
|
return nil, ErrNoCreatePermissions.withStack()
|
|
}
|
|
|
|
return svc.triggerRepo.Create(mod)
|
|
}
|
|
|
|
func (svc trigger) Update(mod *types.Trigger) (c *types.Trigger, err error) {
|
|
if mod.ID == 0 {
|
|
return nil, ErrInvalidID.withStack()
|
|
}
|
|
|
|
if c, err = svc.triggerRepo.FindByID(mod.NamespaceID, mod.ID); err != nil {
|
|
return
|
|
}
|
|
|
|
if isStale(mod.UpdatedAt, c.UpdatedAt, c.CreatedAt) {
|
|
return nil, ErrStaleData.withStack()
|
|
}
|
|
|
|
if !svc.prmSvc.CanUpdateTrigger(c) {
|
|
return nil, ErrNoUpdatePermissions.withStack()
|
|
}
|
|
|
|
c.Name = mod.Name
|
|
c.ModuleID = mod.ModuleID
|
|
c.Source = mod.Source
|
|
c.Actions = mod.Actions
|
|
c.Enabled = mod.Enabled
|
|
|
|
return svc.triggerRepo.Update(c)
|
|
}
|
|
|
|
func (svc trigger) DeleteByID(namespaceID, triggerID uint64) error {
|
|
if namespaceID == 0 {
|
|
return ErrNamespaceRequired.withStack()
|
|
}
|
|
|
|
if c, err := svc.triggerRepo.FindByID(namespaceID, triggerID); err != nil {
|
|
return err
|
|
} else if !svc.prmSvc.CanDeleteTrigger(c) {
|
|
return ErrNoDeletePermissions.withStack()
|
|
}
|
|
|
|
return svc.triggerRepo.DeleteByID(namespaceID, triggerID)
|
|
}
|