Skip to content

Commit 1351cbe

Browse files
committed
First review round.
1 parent 4f1783d commit 1351cbe

File tree

14 files changed

+260
-173
lines changed

14 files changed

+260
-173
lines changed

api/handle_workflows.go

Lines changed: 96 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,30 @@ import (
1111
"github.com/google/uuid"
1212
)
1313

14+
type ScenarioWorkflowParams struct {
15+
ScenarioId dto.UriUuid `uri:"scenarioId"`
16+
}
17+
18+
type WorkflowRuleParams struct {
19+
RuleId dto.UriUuid `uri:"ruleId"`
20+
Id dto.UriUuid `uri:"id"`
21+
}
22+
1423
func handleListWorkflowsForScenario(uc usecases.Usecases) func(c *gin.Context) {
1524
return func(c *gin.Context) {
1625
ctx := c.Request.Context()
17-
scenarioId := c.Param("scenarioId")
26+
27+
var uri ScenarioWorkflowParams
28+
29+
if err := c.ShouldBindUri(&uri); presentError(ctx, c, err) {
30+
c.Status(http.StatusBadRequest)
31+
return
32+
}
1833

1934
uc := usecasesWithCreds(ctx, uc)
2035
workflowUsecase := uc.NewWorkflowUsecase()
2136

22-
rules, err := workflowUsecase.ListWorkflowsForScenario(ctx, scenarioId)
37+
rules, err := workflowUsecase.ListWorkflowsForScenario(ctx, uri.ScenarioId.Uuid())
2338
if presentError(ctx, c, err) {
2439
return
2540
}
@@ -59,10 +74,16 @@ func handleCreateWorkflowRule(uc usecases.Usecases) func(c *gin.Context) {
5974
func handleUpdateWorkflowRule(uc usecases.Usecases) func(c *gin.Context) {
6075
return func(c *gin.Context) {
6176
ctx := c.Request.Context()
62-
ruleId := c.Param("ruleId")
6377

64-
var payload dto.UpdateWorkflowRuleDto
78+
var (
79+
uri WorkflowRuleParams
80+
payload dto.UpdateWorkflowRuleDto
81+
)
6582

83+
if err := c.ShouldBindUri(&uri); presentError(ctx, c, err) {
84+
c.Status(http.StatusBadRequest)
85+
return
86+
}
6687
if err := c.ShouldBindJSON(&payload); presentError(ctx, c, err) {
6788
c.Status(http.StatusBadRequest)
6889
return
@@ -72,7 +93,7 @@ func handleUpdateWorkflowRule(uc usecases.Usecases) func(c *gin.Context) {
7293
workflowUsecase := uc.NewWorkflowUsecase()
7394

7495
params := models.WorkflowRule{
75-
Id: ruleId,
96+
Id: uri.RuleId.Uuid(),
7697
Name: payload.Name,
7798
}
7899

@@ -88,12 +109,18 @@ func handleUpdateWorkflowRule(uc usecases.Usecases) func(c *gin.Context) {
88109
func handleDeleteWorkflowRule(uc usecases.Usecases) func(c *gin.Context) {
89110
return func(c *gin.Context) {
90111
ctx := c.Request.Context()
91-
ruleId := c.Param("ruleId")
112+
113+
var uri WorkflowRuleParams
114+
115+
if err := c.ShouldBindUri(&uri); presentError(ctx, c, err) {
116+
c.Status(http.StatusBadRequest)
117+
return
118+
}
92119

93120
uc := usecasesWithCreds(ctx, uc)
94121
workflowUsecase := uc.NewWorkflowUsecase()
95122

96-
if err := workflowUsecase.DeleteWorkflowRule(ctx, ruleId); presentError(ctx, c, err) {
123+
if err := workflowUsecase.DeleteWorkflowRule(ctx, uri.RuleId.Uuid()); presentError(ctx, c, err) {
97124
return
98125
}
99126

@@ -104,20 +131,26 @@ func handleDeleteWorkflowRule(uc usecases.Usecases) func(c *gin.Context) {
104131
func handleCreateWorkflowCondition(uc usecases.Usecases) func(c *gin.Context) {
105132
return func(c *gin.Context) {
106133
ctx := c.Request.Context()
107-
ruleId := c.Param("ruleId")
108134

109-
var payload dto.PostWorkflowConditionDto
135+
var (
136+
uri WorkflowRuleParams
137+
payload dto.PostWorkflowConditionDto
138+
)
110139

111140
if err := c.ShouldBindJSON(&payload); presentError(ctx, c, err) {
112141
c.Status(http.StatusBadRequest)
113142
return
114143
}
144+
if err := c.ShouldBindUri(&uri); presentError(ctx, c, err) {
145+
c.Status(http.StatusBadRequest)
146+
return
147+
}
115148

116149
uc := usecasesWithCreds(ctx, uc)
117150
workflowUsecase := uc.NewWorkflowUsecase()
118151

119152
params := models.WorkflowCondition{
120-
RuleId: ruleId,
153+
RuleId: uri.RuleId.Uuid(),
121154
Function: payload.Function,
122155
Params: payload.Params,
123156
}
@@ -134,11 +167,16 @@ func handleCreateWorkflowCondition(uc usecases.Usecases) func(c *gin.Context) {
134167
func handleUpdateWorkflowCondition(uc usecases.Usecases) func(c *gin.Context) {
135168
return func(c *gin.Context) {
136169
ctx := c.Request.Context()
137-
ruleId := c.Param("ruleId")
138-
conditionId := c.Param("conditionId")
139170

140-
var payload dto.PostWorkflowConditionDto
171+
var (
172+
uri WorkflowRuleParams
173+
payload dto.PostWorkflowConditionDto
174+
)
141175

176+
if err := c.ShouldBindUri(&uri); presentError(ctx, c, err) {
177+
c.Status(http.StatusBadRequest)
178+
return
179+
}
142180
if err := c.ShouldBindJSON(&payload); presentError(ctx, c, err) {
143181
c.Status(http.StatusBadRequest)
144182
return
@@ -148,8 +186,8 @@ func handleUpdateWorkflowCondition(uc usecases.Usecases) func(c *gin.Context) {
148186
workflowUsecase := uc.NewWorkflowUsecase()
149187

150188
params := models.WorkflowCondition{
151-
Id: conditionId,
152-
RuleId: ruleId,
189+
Id: uri.Id.Uuid(),
190+
RuleId: uri.RuleId.Uuid(),
153191
Function: payload.Function,
154192
Params: payload.Params,
155193
}
@@ -166,13 +204,18 @@ func handleUpdateWorkflowCondition(uc usecases.Usecases) func(c *gin.Context) {
166204
func handleDeleteWorkflowCondition(uc usecases.Usecases) func(c *gin.Context) {
167205
return func(c *gin.Context) {
168206
ctx := c.Request.Context()
169-
ruleId := c.Param("ruleId")
170-
conditionId := c.Param("conditionId")
207+
208+
var uri WorkflowRuleParams
209+
210+
if err := c.ShouldBindUri(&uri); presentError(ctx, c, err) {
211+
c.Status(http.StatusBadRequest)
212+
return
213+
}
171214

172215
uc := usecasesWithCreds(ctx, uc)
173216
workflowUsecase := uc.NewWorkflowUsecase()
174217

175-
if err := workflowUsecase.DeleteWorkflowCondition(ctx, ruleId, conditionId); presentError(ctx, c, err) {
218+
if err := workflowUsecase.DeleteWorkflowCondition(ctx, uri.RuleId.Uuid(), uri.Id.Uuid()); presentError(ctx, c, err) {
176219
return
177220
}
178221

@@ -183,23 +226,25 @@ func handleDeleteWorkflowCondition(uc usecases.Usecases) func(c *gin.Context) {
183226
func handleCreateWorkflowAction(uc usecases.Usecases) func(c *gin.Context) {
184227
return func(c *gin.Context) {
185228
ctx := c.Request.Context()
186-
ruleId := c.Param("ruleId")
187229

188-
var payload dto.PostWorkflowActionDto
230+
var (
231+
uri WorkflowRuleParams
232+
payload dto.PostWorkflowActionDto
233+
)
189234

190-
if err := c.ShouldBindJSON(&payload); presentError(ctx, c, err) {
235+
if err := c.ShouldBindUri(&uri); presentError(ctx, c, err) {
236+
c.Status(http.StatusBadRequest)
191237
return
192238
}
193-
if err := dto.ValidateWorkflowAction(payload); presentError(ctx, c, err) {
194-
c.Status(http.StatusBadRequest)
239+
if err := c.ShouldBindJSON(&payload); presentError(ctx, c, err) {
195240
return
196241
}
197242

198243
uc := usecasesWithCreds(ctx, uc)
199244
workflowUsecase := uc.NewWorkflowUsecase()
200245

201246
params := models.WorkflowAction{
202-
RuleId: ruleId,
247+
RuleId: uri.RuleId.Uuid(),
203248
Action: payload.Action,
204249
Params: payload.Params,
205250
}
@@ -216,25 +261,26 @@ func handleCreateWorkflowAction(uc usecases.Usecases) func(c *gin.Context) {
216261
func handleUpdateWorkflowAction(uc usecases.Usecases) func(c *gin.Context) {
217262
return func(c *gin.Context) {
218263
ctx := c.Request.Context()
219-
ruleId := c.Param("ruleId")
220-
actionId := c.Param("actionId")
221264

222-
var payload dto.PostWorkflowActionDto
265+
var (
266+
uri WorkflowRuleParams
267+
payload dto.PostWorkflowActionDto
268+
)
223269

224-
if err := c.ShouldBindJSON(&payload); presentError(ctx, c, err) {
270+
if err := c.ShouldBindUri(&uri); presentError(ctx, c, err) {
271+
c.Status(http.StatusBadRequest)
225272
return
226273
}
227-
if err := dto.ValidateWorkflowAction(payload); presentError(ctx, c, err) {
228-
c.Status(http.StatusBadRequest)
274+
if err := c.ShouldBindJSON(&payload); presentError(ctx, c, err) {
229275
return
230276
}
231277

232278
uc := usecasesWithCreds(ctx, uc)
233279
workflowUsecase := uc.NewWorkflowUsecase()
234280

235281
params := models.WorkflowAction{
236-
Id: actionId,
237-
RuleId: ruleId,
282+
Id: uri.Id.Uuid(),
283+
RuleId: uri.RuleId.Uuid(),
238284
Action: payload.Action,
239285
Params: payload.Params,
240286
}
@@ -247,16 +293,22 @@ func handleUpdateWorkflowAction(uc usecases.Usecases) func(c *gin.Context) {
247293
c.JSON(http.StatusCreated, dto.AdaptWorkflowAction(action))
248294
}
249295
}
296+
250297
func handleDeleteWorkflowAction(uc usecases.Usecases) func(c *gin.Context) {
251298
return func(c *gin.Context) {
252299
ctx := c.Request.Context()
253-
ruleId := c.Param("ruleId")
254-
actionId := c.Param("actionId")
300+
301+
var uri WorkflowRuleParams
302+
303+
if err := c.ShouldBindUri(&uri); presentError(ctx, c, err) {
304+
c.Status(http.StatusBadRequest)
305+
return
306+
}
255307

256308
uc := usecasesWithCreds(ctx, uc)
257309
workflowUsecase := uc.NewWorkflowUsecase()
258310

259-
if err := workflowUsecase.DeleteWorkflowAction(ctx, ruleId, actionId); presentError(ctx, c, err) {
311+
if err := workflowUsecase.DeleteWorkflowAction(ctx, uri.RuleId.Uuid(), uri.Id.Uuid()); presentError(ctx, c, err) {
260312
return
261313
}
262314

@@ -267,18 +319,24 @@ func handleDeleteWorkflowAction(uc usecases.Usecases) func(c *gin.Context) {
267319
func handleReorderWorkflowRules(uc usecases.Usecases) func(c *gin.Context) {
268320
return func(c *gin.Context) {
269321
ctx := c.Request.Context()
270-
scenarioId := c.Param("scenarioId")
271322

272-
var ids []uuid.UUID
323+
var (
324+
uri ScenarioWorkflowParams
325+
ids []uuid.UUID
326+
)
273327

328+
if err := c.ShouldBindUri(&uri); presentError(ctx, c, err) {
329+
c.Status(http.StatusBadRequest)
330+
return
331+
}
274332
if err := c.ShouldBindJSON(&ids); presentError(ctx, c, err) {
275333
return
276334
}
277335

278336
uc := usecasesWithCreds(ctx, uc)
279337
workflowUsecase := uc.NewWorkflowUsecase()
280338

281-
if err := workflowUsecase.ReorderWorkflowRules(ctx, scenarioId, ids); presentError(ctx, c, err) {
339+
if err := workflowUsecase.ReorderWorkflowRules(ctx, uri.ScenarioId.Uuid(), ids); presentError(ctx, c, err) {
282340
return
283341
}
284342

api/routes.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -294,9 +294,9 @@ func addRoutes(r *gin.Engine, conf Configuration, uc usecases.Usecases, auth uti
294294
router.PUT("/workflows/rule/:ruleId", tom, handleUpdateWorkflowRule(uc))
295295
router.DELETE("/workflows/rule/:ruleId", tom, handleDeleteWorkflowRule(uc))
296296
router.POST("/workflows/rule/:ruleId/condition", tom, handleCreateWorkflowCondition(uc))
297-
router.PUT("/workflows/rule/:ruleId/condition/:conditionId", tom, handleUpdateWorkflowCondition(uc))
298-
router.DELETE("/workflows/rule/:ruleId/condition/:conditionId", tom, handleDeleteWorkflowCondition(uc))
297+
router.PUT("/workflows/rule/:ruleId/condition/:id", tom, handleUpdateWorkflowCondition(uc))
298+
router.DELETE("/workflows/rule/:ruleId/condition/:id", tom, handleDeleteWorkflowCondition(uc))
299299
router.POST("/workflows/rule/:ruleId/action", tom, handleCreateWorkflowAction(uc))
300-
router.PUT("/workflows/rule/:ruleId/action/:actionId", tom, handleUpdateWorkflowAction(uc))
301-
router.DELETE("/workflows/rule/:ruleId/action/:actionId", tom, handleDeleteWorkflowAction(uc))
300+
router.PUT("/workflows/rule/:ruleId/action/:id", tom, handleUpdateWorkflowAction(uc))
301+
router.DELETE("/workflows/rule/:ruleId/action/:id", tom, handleDeleteWorkflowAction(uc))
302302
}

dto/workflows.go

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,25 @@ import (
55

66
"github.com/checkmarble/marble-backend/models"
77
"github.com/checkmarble/marble-backend/pure_utils"
8-
"github.com/cockroachdb/errors"
9-
"github.com/gin-gonic/gin/binding"
10-
"github.com/go-playground/validator/v10"
8+
"github.com/google/uuid"
119
)
1210

1311
type WorkflowRuleDto struct {
14-
Id string `json:"id"`
15-
Name string `json:"name"`
12+
Id uuid.UUID `json:"id"`
13+
Name string `json:"name"`
1614
}
1715

1816
type CreateWorkflowRuleDto struct {
19-
ScenarioId string `json:"scenario_id" binding:"required,uuid"`
20-
Name string `json:"name" binding:"required"`
17+
ScenarioId uuid.UUID `json:"scenario_id" binding:"required,uuid"`
18+
Name string `json:"name" binding:"required"`
2119
}
2220

2321
type UpdateWorkflowRuleDto struct {
2422
Name string `json:"name" binding:"required"`
2523
}
2624

2725
type WorkflowConditionDto struct {
28-
Id string `json:"id"`
26+
Id uuid.UUID `json:"id"`
2927
Function models.WorkflowConditionType `json:"function"`
3028
Params json.RawMessage `json:"params,omitempty"`
3129
}
@@ -36,19 +34,19 @@ type PostWorkflowConditionDto struct {
3634
}
3735

3836
type WorkflowConditionRuleHitParams struct {
39-
RuleId string `json:"rule_id" binding:"required,uuid"`
37+
RuleId uuid.UUID `json:"rule_id" binding:"required,uuid"`
4038
}
4139

4240
type WorkflowConditionScreeningHitParams struct {
43-
ScreeningId string `json:"screening_id" binding:"required,uuid"`
41+
ScreeningId uuid.UUID `json:"screening_id" binding:"required,uuid"`
4442
}
4543

4644
type WorkflowConditionEvaluatesParams struct {
4745
Expression NodeDto `json:"expression" binding:"required"`
4846
}
4947

5048
type WorkflowActionDto struct {
51-
Id string `json:"id"`
49+
Id uuid.UUID `json:"id"`
5250
Action string `json:"action"`
5351
Params json.RawMessage `json:"params,omitempty"`
5452
}
@@ -58,6 +56,12 @@ type PostWorkflowActionDto struct {
5856
Params json.RawMessage `json:"params"`
5957
}
6058

59+
type WorkflowActionCaseParams struct {
60+
InboxId uuid.UUID `json:"inbox_id" binding:"required,uuid"`
61+
AnyInbox bool `json:"any_inbox"`
62+
TitleTemplate *NodeDto `json:"title_template"`
63+
}
64+
6165
type WorkflowDto struct {
6266
WorkflowRuleDto
6367

@@ -95,21 +99,3 @@ func AdaptWorkflowAction(m models.WorkflowAction) WorkflowActionDto {
9599
Params: m.Params,
96100
}
97101
}
98-
99-
func ValidateWorkflowAction(cond PostWorkflowActionDto) error {
100-
switch cond.Action {
101-
case models.WorkflowCreateCase, models.WorkflowAddToCaseIfPossible:
102-
var params models.WorkflowCaseParams
103-
104-
if err := json.Unmarshal(cond.Params, &params); err != nil {
105-
return errors.Join(models.BadParameterError, json.Unmarshal(cond.Params, new(models.WorkflowCaseParams)))
106-
}
107-
if err := binding.Validator.Engine().(*validator.Validate).Struct(params); err != nil {
108-
return errors.Join(models.BadParameterError, err)
109-
}
110-
default:
111-
return errors.Wrapf(models.BadParameterError, "unknown workflow action type: %s", cond.Action)
112-
}
113-
114-
return nil
115-
}

0 commit comments

Comments
 (0)