1package cloudflare
2
3import (
4	"context"
5	"encoding/json"
6	"fmt"
7	"net/http"
8	"time"
9
10	"github.com/pkg/errors"
11)
12
13// WorkerCronTriggerResponse represents the response from the Worker cron trigger
14// API endpoint.
15type WorkerCronTriggerResponse struct {
16	Response
17	Result WorkerCronTriggerSchedules `json:"result"`
18}
19
20// WorkerCronTriggerSchedules contains the schedule of Worker cron triggers.
21type WorkerCronTriggerSchedules struct {
22	Schedules []WorkerCronTrigger `json:"schedules"`
23}
24
25// WorkerCronTrigger holds an individual cron schedule for a worker.
26type WorkerCronTrigger struct {
27	Cron       string     `json:"cron"`
28	CreatedOn  *time.Time `json:"created_on,omitempty"`
29	ModifiedOn *time.Time `json:"modified_on,omitempty"`
30}
31
32// ListWorkerCronTriggers fetches all available cron triggers for a single Worker
33// script.
34//
35// API reference: https://api.cloudflare.com/#worker-cron-trigger-get-cron-triggers
36func (api *API) ListWorkerCronTriggers(ctx context.Context, scriptName string) ([]WorkerCronTrigger, error) {
37	if err := api.checkAccountID(); err != nil {
38		return []WorkerCronTrigger{}, err
39	}
40
41	uri := fmt.Sprintf("/accounts/%s/workers/scripts/%s/schedules", api.AccountID, scriptName)
42	res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
43	if err != nil {
44		return []WorkerCronTrigger{}, err
45	}
46
47	result := WorkerCronTriggerResponse{}
48	if err := json.Unmarshal(res, &result); err != nil {
49		return []WorkerCronTrigger{}, errors.Wrap(err, errUnmarshalError)
50	}
51
52	return result.Result.Schedules, err
53}
54
55// UpdateWorkerCronTriggers updates a single schedule for a Worker cron trigger.
56//
57// API reference: https://api.cloudflare.com/#worker-cron-trigger-update-cron-triggers
58func (api *API) UpdateWorkerCronTriggers(ctx context.Context, scriptName string, crons []WorkerCronTrigger) ([]WorkerCronTrigger, error) {
59	if err := api.checkAccountID(); err != nil {
60		return []WorkerCronTrigger{}, err
61	}
62
63	uri := fmt.Sprintf("/accounts/%s/workers/scripts/%s/schedules", api.AccountID, scriptName)
64	res, err := api.makeRequestContext(ctx, http.MethodPut, uri, crons)
65	if err != nil {
66		return []WorkerCronTrigger{}, err
67	}
68
69	result := WorkerCronTriggerResponse{}
70	if err := json.Unmarshal(res, &result); err != nil {
71		return []WorkerCronTrigger{}, errors.Wrap(err, errUnmarshalError)
72	}
73
74	return result.Result.Schedules, err
75}
76