79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
package api
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/stephenafamo/bob"
|
|
"github.com/tigorlazuardi/redmage/models"
|
|
"github.com/tigorlazuardi/redmage/pkg/errs"
|
|
)
|
|
|
|
type ScheduleStatus int8
|
|
|
|
const (
|
|
ScheduleStatusDisabled ScheduleStatus = iota
|
|
ScheduleStatusEnabled
|
|
ScheduleStatusStandby
|
|
ScheduleStatusEnqueued
|
|
ScheduleStatusDownloading
|
|
ScheduleStatusError
|
|
)
|
|
|
|
func (ss ScheduleStatus) String() string {
|
|
switch ss {
|
|
case ScheduleStatusDisabled:
|
|
return "Disabled"
|
|
case ScheduleStatusEnabled:
|
|
return "Enabled"
|
|
case ScheduleStatusStandby:
|
|
return "Standby"
|
|
case ScheduleStatusEnqueued:
|
|
return "Enqueued"
|
|
case ScheduleStatusDownloading:
|
|
return "Downloading"
|
|
case ScheduleStatusError:
|
|
return "Error"
|
|
}
|
|
return "Unknown"
|
|
}
|
|
|
|
func (ss ScheduleStatus) Int8() int8 {
|
|
return int8(ss)
|
|
}
|
|
|
|
type ScheduleSetParams struct {
|
|
Subreddit string
|
|
Status ScheduleStatus
|
|
ErrorMessage string
|
|
}
|
|
|
|
func (api *API) ScheduleSet(ctx context.Context, params ScheduleSetParams) (schedule *models.ScheduleStatus, err error) {
|
|
ctx, span := tracer.Start(ctx, "*API.ScheduleSet")
|
|
defer span.End()
|
|
|
|
errTx := api.withTransaction(ctx, func(exec bob.Executor) error {
|
|
schedule, err = api.scheduleSet(ctx, exec, params)
|
|
return err
|
|
})
|
|
|
|
return schedule, errTx
|
|
}
|
|
|
|
func (api *API) scheduleSet(ctx context.Context, exec bob.Executor, params ScheduleSetParams) (schedule *models.ScheduleStatus, err error) {
|
|
ctx, span := tracer.Start(ctx, "*API.scheduleSet")
|
|
defer span.End()
|
|
|
|
schedule, err = api.scheduleStatusUpsert(ctx, exec, params)
|
|
if err != nil {
|
|
return schedule, errs.Wrapw(err, "failed to set schedule status", "params", params)
|
|
}
|
|
|
|
_, err = api.scheduleHistoryInsert(ctx, exec, params)
|
|
if err != nil {
|
|
return schedule, errs.Wrapw(err, "failed to insert schedule history", "params", params)
|
|
}
|
|
|
|
// TODO: Create cron job schedule rebalancing if schedule is set to disabled.
|
|
return schedule, nil
|
|
}
|