/
service.go
143 lines (119 loc) · 3.72 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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package processes
import (
"errors"
"fmt"
"github.com/infinity-oj/server-v2/internal/lib/manager"
"github.com/google/uuid"
"github.com/infinity-oj/server-v2/pkg/models"
"go.uber.org/zap"
)
type Service interface {
GetProcesses(processType string) (process []*models.Process, err error)
GetProcess(processId string) (process *models.Process, err error)
UpdateProcess(processId, warning, error string, outputs *models.Slots) (process *models.Process, err error)
ReserveProcess(processId string) (token string, locked bool, err error)
}
type service struct {
logger *zap.Logger
manager manager.ProcessManager
}
func (d service) GetProcesses(processType string) (processes []*models.Process, err error) {
d.logger.Info("get process", zap.String("type", processType))
element := d.manager.Fetch("*", "*", processType, false)
if element != nil {
d.logger.Info("get processes", zap.String("process id", element.Process.JudgementId))
processes = []*models.Process{
element.Process,
}
} else {
d.logger.Info("get processes: nothing")
}
return
}
func (d service) GetProcess(processId string) (process *models.Process, err error) {
d.logger.Info("get process",
zap.String("process id", processId),
)
element := d.manager.Fetch("*", processId, "*", true)
if element != nil {
d.logger.Info("get process",
zap.String("judgement id", element.Process.JudgementId),
zap.String("process id", element.Process.ProcessId),
)
process = element.Process
} else {
d.logger.Debug("get processes: nothing")
}
return
}
func (d service) UpdateProcess(processId, warning, error string, outputs *models.Slots) (process *models.Process, err error) {
d.logger.Debug("update process", zap.String("process id", processId))
processElement := d.manager.Fetch("*", processId, "*", true)
if processElement == nil {
d.logger.Debug("invalid token: no such process",
zap.String("process id", processId),
)
//d.manager.UnlockProcess(processElement)
return nil, errors.New("invalid token")
}
process = processElement.Process
if process.ProcessId != processId {
d.logger.Debug("process mismatch",
zap.String("expected process id", process.ProcessId),
zap.String("actual process id", processId),
)
//d.manager.UnlockProcess(processElement)
return nil, errors.New("process mismatch")
}
d.logger.Info("update process",
zap.String("process id", processId),
)
if error != "" {
if err := d.manager.FinishWithError(
processElement,
fmt.Sprintf("warning: %s\nerror: %s\n", warning, error),
); err != nil {
d.logger.Error("finish process failed", zap.Error(err))
return nil, err
}
return process, nil
}
//update process
//err := d.repository.Update(element, outputs)
//if err != nil {
// d.logger.Error("update process", zap.Error(err))
// return nil, err
//}
err = d.manager.Finish(processElement, outputs)
// calculate next process
if err != nil {
d.logger.Error("update process: finish process failed",
zap.String("process id", processId),
zap.Error(err),
)
//d.manager.UnlockProcess(processElement)
return nil, err
}
return process, nil
}
func (d service) ReserveProcess(processId string) (token string, locked bool, err error) {
processElement := d.manager.Fetch("*", processId, "*", true)
if processElement == nil {
return "", false, errors.New("not found")
}
if !d.manager.Reserve(processElement) {
return "", false, errors.New("reserved")
}
token = uuid.New().String()
d.logger.Debug("reserve process",
zap.String("process id", processId),
zap.String("token", token),
)
return token, true, nil
}
func NewService(logger *zap.Logger, manager manager.ProcessManager) Service {
return &service{
logger: logger.With(zap.String("type", "Process service")),
manager: manager,
}
}