-
Notifications
You must be signed in to change notification settings - Fork 16
/
service.go
83 lines (69 loc) · 2.26 KB
/
service.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package datamodel
import (
"context"
"errors"
"fmt"
"github.com/Bio-OS/bioos/internal/context/workspace/infrastructure/eventbus"
apperrors "github.com/Bio-OS/bioos/pkg/errors"
applog "github.com/Bio-OS/bioos/pkg/log"
)
type Service interface {
Get(context.Context, string) (*DataModel, error)
Upsert(context.Context, *DataModel) error
Create(context.Context, *DataModel) error
Update(context.Context, *DataModel) error
Delete(context.Context, *DataModel) error
}
func NewService(repo Repository, eventbus eventbus.EventBus, factory *Factory) Service {
svc := &service{
repository: repo,
eventbus: eventbus,
factory: factory,
}
svc.subscribeEvents()
return svc
}
type service struct {
repository Repository
eventbus eventbus.EventBus
factory *Factory
}
func (s *service) Get(ctx context.Context, id string) (*DataModel, error) {
return s.repository.Get(ctx, id)
}
func (s *service) Upsert(ctx context.Context, dm *DataModel) error {
return s.repository.Save(ctx, dm)
}
func (s *service) Create(ctx context.Context, dm *DataModel) error {
if stored, err := s.repository.Get(ctx, dm.ID); err != nil {
var apperror apperrors.Error
if !(errors.As(err, &apperror) && (apperror.GetCode() == apperrors.NotFoundCode)) {
return err
}
} else if stored != nil {
return apperrors.NewAlreadyExistError("data model", dm.Name)
}
return s.Upsert(ctx, dm)
}
func (s *service) Update(ctx context.Context, dm *DataModel) error {
if stored, err := s.repository.Get(ctx, dm.ID); err != nil {
return apperrors.NewInternalError(fmt.Errorf("check data model exist fail: %w", err))
} else if stored == nil {
return apperrors.NewNotFoundError("data model", dm.Name)
}
return s.Upsert(ctx, dm)
}
func (s *service) Delete(ctx context.Context, dm *DataModel) error {
return s.repository.Delete(ctx, dm)
}
func (s *service) subscribeEvents() {
s.eventbus.Subscribe(ImportDataModels, eventbus.EventHandlerFunc(func(ctx context.Context, payload string) (err error) {
applog.Infow("start to consume import data-models event", "payload", payload)
event, err := NewImportDataModelsEventFromPayload([]byte(payload))
if err != nil {
return err
}
handler := NewImportDataModelsHandler(s.repository, s.eventbus, s.factory)
return handler.Handle(ctx, event)
}))
}