/
ensembler_service.go
109 lines (88 loc) · 3.08 KB
/
ensembler_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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package service
import (
"fmt"
"gorm.io/gorm"
"github.com/caraml-dev/turing/api/turing/models"
)
// EnsemblersService is the data access object for the Ensemblers from the db.
type EnsemblersService interface {
// FindByID Find an ensembler matching the given id and options
FindByID(id models.ID, options EnsemblersFindByIDOptions) (models.EnsemblerLike, error)
// List ensemblers
List(options EnsemblersListOptions) (*PaginatedResults, error)
// Save the given router to the db. Updates the existing record if already exists
Save(ensembler models.EnsemblerLike) (models.EnsemblerLike, error)
Delete(ensembler models.EnsemblerLike) error
}
type EnsemblersFindByIDOptions struct {
ProjectID *models.ID
}
// EnsemblersListOptions holds query parameters for EnsemblersService.List method
type EnsemblersListOptions struct {
PaginationOptions
ProjectID *models.ID `schema:"project_id" validate:"required"`
Search *string `schema:"search"`
EnsemblerType *models.EnsemblerType `schema:"type" validate:"omitempty,oneof=pyfunc docker"`
}
// NewEnsemblersService creates a new ensemblers service
func NewEnsemblersService(db *gorm.DB) EnsemblersService {
return &ensemblersService{db: db}
}
type ensemblersService struct {
db *gorm.DB
}
func (service *ensemblersService) FindByID(
id models.ID,
options EnsemblersFindByIDOptions,
) (models.EnsemblerLike, error) {
var ensembler models.GenericEnsembler
query := service.db.Where("id = ?", id)
if options.ProjectID != nil {
query = query.Where("project_id = ?", options.ProjectID)
}
result := query.First(&ensembler)
if err := result.Error; err != nil {
return nil, err
}
instance := ensembler.Instance()
result = query.Scopes(models.EnsemblerTable(&ensembler)).First(instance)
if err := result.Error; err != nil {
return nil, err
}
return instance, nil
}
func (service *ensemblersService) List(options EnsemblersListOptions) (*PaginatedResults, error) {
var results []*models.GenericEnsembler
var count int64
query := service.db
if options.ProjectID != nil {
query = query.Where("project_id = ?", options.ProjectID)
}
if options.Search != nil && len(*options.Search) > 0 {
query = query.Where("name ilike ?", fmt.Sprintf("%%%s%%", *options.Search))
}
if options.EnsemblerType != nil {
query = query.Where("type = ?", options.EnsemblerType)
}
query.Model(&results).Count(&count)
result := query.
Scopes(PaginationScope(options.PaginationOptions)).
Find(&results)
if err := result.Error; err != nil {
return nil, err
}
paginatedResults := createPaginatedResults(options.PaginationOptions, int(count), results)
return paginatedResults, nil
}
func (service *ensemblersService) Save(ensembler models.EnsemblerLike) (models.EnsemblerLike, error) {
result := service.db.
Scopes(models.EnsemblerTable(ensembler)).
Save(ensembler)
if err := result.Error; err != nil {
return nil, err
}
return service.FindByID(ensembler.GetID(), EnsemblersFindByIDOptions{})
}
func (service *ensemblersService) Delete(ensembler models.EnsemblerLike) error {
return service.db.Delete(ensembler).Error
}