Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow to patch the message of a trigger #4137

Merged
merged 1 commit into from
Sep 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/jobs.md
Original file line number Diff line number Diff line change
Expand Up @@ -795,7 +795,7 @@ Accept: application/vnd.api+json
### PATCH /jobs/triggers/:trigger-id

This route can be used to change the frequency of execution of a `@cron`
trigger.
trigger, or the message of any trigger.

#### Request

Expand Down
9 changes: 9 additions & 0 deletions model/job/mem_scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,15 @@ func (s *memScheduler) GetTrigger(db prefixer.Prefixer, id string) (Trigger, err
return t, nil
}

// UpdateMessage changes the message for the given trigger.
func (s *memScheduler) UpdateMessage(db prefixer.Prefixer, trigger Trigger, message json.RawMessage) error {
s.mu.RLock()
defer s.mu.RUnlock()
infos := trigger.Infos()
infos.Message = Message(message)
return couchdb.UpdateDoc(db, infos)
}

// UpdateCron will change the frequency of execution for the given trigger.
func (s *memScheduler) UpdateCron(db prefixer.Prefixer, trigger Trigger, arguments string) error {
s.mu.RLock()
Expand Down
7 changes: 7 additions & 0 deletions model/job/redis_scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,13 @@ func (s *redisScheduler) GetTrigger(db prefixer.Prefixer, id string) (Trigger, e
return t, nil
}

// UpdateMessage changes the message for the given trigger.
func (s *redisScheduler) UpdateMessage(db prefixer.Prefixer, trigger Trigger, message json.RawMessage) error {
infos := trigger.Infos()
infos.Message = Message(message)
return couchdb.UpdateDoc(db, infos)
}

// UpdateCron will change the frequency of execution for the given trigger.
func (s *redisScheduler) UpdateCron(db prefixer.Prefixer, trigger Trigger, arguments string) error {
if trigger.Type() != "@cron" {
Expand Down
2 changes: 2 additions & 0 deletions model/job/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package job

import (
"context"
"encoding/json"
"time"

"github.com/cozy/cozy-stack/model/permission"
Expand Down Expand Up @@ -48,6 +49,7 @@ type (
PollScheduler(now int64) error
AddTrigger(trigger Trigger) error
GetTrigger(db prefixer.Prefixer, id string) (Trigger, error)
UpdateMessage(db prefixer.Prefixer, trigger Trigger, message json.RawMessage) error
UpdateCron(db prefixer.Prefixer, trigger Trigger, arguments string) error
DeleteTrigger(db prefixer.Prefixer, id string) error
GetAllTriggers(db prefixer.Prefixer) ([]Trigger, error)
Expand Down
17 changes: 13 additions & 4 deletions web/jobs/jobs.go
Original file line number Diff line number Diff line change
Expand Up @@ -413,13 +413,22 @@ func patchTrigger(c echo.Context) error {
if _, err := jsonapi.Bind(c.Request().Body, &req); err != nil {
return wrapJobsError(err)
}
if req.Arguments == "" {
return jsonapi.BadRequest(errors.New("Only arguments can be patched"))
if req.Arguments == "" && len(req.Message) == 0 {
return jsonapi.BadRequest(errors.New("Only arguments and message can be patched"))
}

if err := sched.UpdateCron(inst, t, req.Arguments); err != nil {
return wrapJobsError(err)
if len(req.Message) > 0 {
if err := sched.UpdateMessage(inst, t, req.Message); err != nil {
return wrapJobsError(err)
}
}

if req.Arguments != "" {
if err := sched.UpdateCron(inst, t, req.Arguments); err != nil {
return wrapJobsError(err)
}
}

return jsonapi.Data(c, http.StatusOK, apiTrigger{infos, inst}, nil)
}

Expand Down
20 changes: 19 additions & 1 deletion web/jobs/jobs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ func TestJobs(t *testing.T) {
attrs.ValueEqual("worker", "print")
})

t.Run("PatchSuccess", func(t *testing.T) {
t.Run("PatchArgumentsSuccess", func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)

e.PATCH("/jobs/triggers/"+triggerID).
Expand All @@ -375,6 +375,24 @@ func TestJobs(t *testing.T) {
Expect().Status(200)
})

t.Run("PatchMessageSuccess", func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)

e.PATCH("/jobs/triggers/"+triggerID).
WithHeader("Authorization", "Bearer "+token).
WithHeader("Content-Type", "application/json").
WithBytes([]byte(`{
"data": {
"attributes": {
"message": {
"folder_to_save": "123"
}
}
}
}`)).
Expect().Status(200)
})

t.Run("GetSuccess", func(t *testing.T) {
e := testutils.CreateTestClient(t, ts.URL)

Expand Down
Loading