/
service.go
118 lines (101 loc) · 2.82 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
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
110
111
112
113
114
115
116
117
118
package services
import (
"github.com/Niromash/niromash-api/api"
"github.com/Niromash/niromash-api/services/database"
"github.com/Niromash/niromash-api/services/external_services"
"github.com/Niromash/niromash-api/services/http"
"sort"
)
var _ api.MainService = (*MainService)(nil)
type MainService struct {
database *database.DatabaseService
http *http.HttpService
projects *ProjectService
externalServices *external_services.ExternalServicesService
stats *StatsService
task *TaskService
messages *MessageService
users *UsersService
}
func NewMainService() *MainService {
return &MainService{
database: database.NewDatabaseService(),
http: http.NewHttpService(),
projects: NewProjectService(),
externalServices: external_services.NewExternalServicesService(),
stats: NewStatsService(),
task: NewTaskService(),
messages: NewMessageService(),
users: NewUsersService(),
}
}
func (m *MainService) Init() error {
for _, initializer := range m.getServicesInitializer() {
if err := initializer.Init(m); err != nil {
return err
}
}
return nil
}
func (m *MainService) Start(errCh chan error) {
go func() {
for _, service := range m.getServicesStarter() {
if service.Settings().MustWaitForStart {
err := service.Start()
if err != nil {
errCh <- err
}
} else {
go func(service api.ServiceStarter) {
err := service.Start()
if err != nil {
errCh <- err
}
}(service)
}
}
}()
}
func (m *MainService) Close() error {
for _, starter := range m.getServicesStarter() {
if err := starter.Close(); err != nil {
return err
}
}
return nil
}
func (m *MainService) getServicesInitializer() []api.ServiceInitializer {
return []api.ServiceInitializer{m.database, m.http, m.projects, m.externalServices, m.stats, m.task, m.messages, m.users}
}
func (m *MainService) getServicesStarter() []api.ServiceStarter {
starters := []api.ServiceStarter{m.database, m.http, m.task}
sort.SliceStable(starters, func(i, j int) bool {
// 0 is the highest priority
return starters[i].Settings().Priority < starters[j].Settings().Priority
})
return starters
}
func (m *MainService) Databases() api.DatabaseService {
return m.database
}
func (m *MainService) Http() api.HttpService {
return m.http
}
func (m *MainService) Projects() api.ProjectService {
return m.projects
}
func (m *MainService) ExternalServices() api.ExternalServicesService {
return m.externalServices
}
func (m *MainService) Stats() api.StatsService {
return m.stats
}
func (m *MainService) Tasks() api.TasksService {
return m.task
}
func (m *MainService) Messages() api.MessagesService {
return m.messages
}
func (m *MainService) Users() api.UsersService {
return m.users
}