mirror of
https://github.com/pocketbase/pocketbase.git
synced 2025-03-18 13:47:47 +02:00
60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package apis
|
|
|
|
import (
|
|
"net/http"
|
|
"slices"
|
|
"strings"
|
|
|
|
"github.com/pocketbase/pocketbase/core"
|
|
"github.com/pocketbase/pocketbase/tools/cron"
|
|
"github.com/pocketbase/pocketbase/tools/router"
|
|
"github.com/pocketbase/pocketbase/tools/routine"
|
|
)
|
|
|
|
// bindCronApi registers the crons api endpoint.
|
|
func bindCronApi(app core.App, rg *router.RouterGroup[*core.RequestEvent]) {
|
|
subGroup := rg.Group("/crons").Bind(RequireSuperuserAuth())
|
|
subGroup.GET("", cronsList)
|
|
subGroup.POST("/{id}", cronRun)
|
|
}
|
|
|
|
func cronsList(e *core.RequestEvent) error {
|
|
jobs := e.App.Cron().Jobs()
|
|
|
|
slices.SortStableFunc(jobs, func(a, b *cron.Job) int {
|
|
if strings.HasPrefix(a.Id(), "__pb") {
|
|
return 1
|
|
}
|
|
if strings.HasPrefix(b.Id(), "__pb") {
|
|
return -1
|
|
}
|
|
return strings.Compare(a.Id(), b.Id())
|
|
})
|
|
|
|
return e.JSON(http.StatusOK, jobs)
|
|
}
|
|
|
|
func cronRun(e *core.RequestEvent) error {
|
|
cronId := e.Request.PathValue("id")
|
|
|
|
var foundJob *cron.Job
|
|
|
|
jobs := e.App.Cron().Jobs()
|
|
for _, j := range jobs {
|
|
if j.Id() == cronId {
|
|
foundJob = j
|
|
break
|
|
}
|
|
}
|
|
|
|
if foundJob == nil {
|
|
return e.NotFoundError("Missing or invalid cron job", nil)
|
|
}
|
|
|
|
routine.FireAndForget(func() {
|
|
foundJob.Run()
|
|
})
|
|
|
|
return e.NoContent(http.StatusNoContent)
|
|
}
|