Skip to content

Commit 1047b6f

Browse files
authored
Merge pull request #1 from limanmys/feature/cron-system
2 parents e8e6051 + 8f6a326 commit 1047b6f

File tree

9 files changed

+383
-109
lines changed

9 files changed

+383
-109
lines changed

app/handlers/cron_jobs.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package handlers
2+
3+
import (
4+
"errors"
5+
6+
"github.com/gofiber/fiber/v2"
7+
"github.com/google/uuid"
8+
"github.com/limanmys/render-engine/app/models"
9+
"github.com/limanmys/render-engine/internal/database"
10+
"github.com/limanmys/render-engine/pkg/cron_jobs"
11+
)
12+
13+
func CreateCronJob(c *fiber.Ctx) error {
14+
// Parse payload
15+
var payload models.CronJob
16+
if err := c.BodyParser(&payload); err != nil {
17+
return err
18+
}
19+
20+
extension_id, err := uuid.Parse(c.FormValue("extension_id"))
21+
if err != nil {
22+
return errors.New("invalid extension id")
23+
}
24+
25+
user_id, err := uuid.Parse(c.FormValue("user_id"))
26+
if err != nil {
27+
return errors.New("invalid user id")
28+
}
29+
30+
server_id, err := uuid.Parse(c.FormValue("server_id"))
31+
if err != nil {
32+
return errors.New("invalid server id")
33+
}
34+
35+
// Fill default fields
36+
cj := models.NewCronJob()
37+
payload.ID = cj.ID
38+
payload.Status = cj.Status
39+
payload.Message = cj.Message
40+
41+
payload.BaseURL = "https://127.0.0.1"
42+
payload.ExtensionID = &extension_id
43+
payload.ServerID = &server_id
44+
payload.UserID = &user_id
45+
46+
// Create cronjob rule on db
47+
if err := database.Connection().Model(&models.CronJob{}).Create(&payload).Error; err != nil {
48+
return err
49+
}
50+
51+
// Register and run cronjob
52+
if err := cron_jobs.RegisterAndRun(&payload); err != nil {
53+
return err
54+
}
55+
56+
return c.JSON("Cronjob registered successfully.")
57+
}
58+
59+
func IndexCronJobs(c *fiber.Ctx) error {
60+
// Set empty variable for later use
61+
var cronjobs []*models.CronJob
62+
// Get all cronjobs
63+
if err := database.Connection().Model(&models.CronJob{}).Find(&cronjobs).Error; err != nil {
64+
return err
65+
}
66+
67+
return c.JSON(cronjobs)
68+
}
69+
70+
func DeleteCronJob(c *fiber.Ctx) error {
71+
// Parse uuid
72+
uid_, err := uuid.Parse(c.Params("id"))
73+
if err != nil {
74+
return err
75+
}
76+
77+
// Remove cronjob from global scheduler
78+
if err := cron_jobs.Delete(&uid_); err != nil {
79+
return err
80+
}
81+
82+
// If cronjob successfully remove by scheduler, remove it from storage
83+
if err := database.Connection().Model(&models.CronJob{}).
84+
Where("id = ?", uid_).Delete(&models.CronJob{}).Error; err != nil {
85+
return err
86+
}
87+
88+
return c.JSON("Item deleted successfully.")
89+
}

app/models/cron_job.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package models
2+
3+
import (
4+
"time"
5+
6+
"github.com/google/uuid"
7+
"github.com/limanmys/render-engine/internal/database"
8+
)
9+
10+
type CronJob struct {
11+
ID *uuid.UUID `json:"id" gorm:"primary_key,type:uuid"`
12+
CreatedAt time.Time `json:"created_at"`
13+
UpdatedAt time.Time `json:"updated_at"`
14+
15+
ExtensionID *uuid.UUID `json:"extension_id"`
16+
UserID *uuid.UUID `json:"user_id"`
17+
ServerID *uuid.UUID `json:"server_id"`
18+
BaseURL string `json:"base_url"`
19+
20+
Payload string `json:"payload"`
21+
Day int `json:"day"`
22+
Time string `json:"time"`
23+
Target string `json:"target"`
24+
25+
Message string `json:"message"` // Last run message
26+
Status Status `json:"status"` // Last run status
27+
Output string `json:"output"` // Last run output
28+
}
29+
30+
func (CronJob) TableName() string {
31+
return "cronjobs"
32+
}
33+
34+
func NewCronJob() *CronJob {
35+
id := uuid.New()
36+
37+
return &CronJob{
38+
ID: &id,
39+
Message: "Pending.",
40+
Status: StatusPending,
41+
}
42+
}
43+
44+
func (cj *CronJob) UpdateAsProcessing() {
45+
cj.Status = StatusProcessing
46+
cj.Message = "Cronjob processing."
47+
cj.Output = "-"
48+
49+
database.Connection().Model(cj).Save(cj)
50+
}
51+
52+
func (cj *CronJob) UpdateAsFailed(message string) {
53+
cj.Status = StatusFailed
54+
cj.Message = message
55+
56+
database.Connection().Model(cj).Save(cj)
57+
}
58+
59+
func (cj *CronJob) UpdateAsDone(output string) {
60+
cj.Status = StatusDone
61+
cj.Message = "CronJob completed successfully. Waiting for next run."
62+
63+
database.Connection().Model(cj).Save(cj)
64+
}

app/routes/index.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,9 @@ func Install(app *fiber.App) {
4848
// queue handler
4949
queueHandler := handlers.NewQueueHandler()
5050
app.Post("/queue", queueHandler.Create)
51+
52+
// cronjob
53+
app.Post("/cronjobs", handlers.CreateCronJob)
54+
app.Get("/cronjobs", handlers.IndexCronJobs)
55+
app.Delete("/cronjobs/:id", handlers.DeleteCronJob)
5156
}

go.mod

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ go 1.19
44

55
require (
66
github.com/Nerzal/gocloak/v13 v13.8.0
7+
github.com/go-co-op/gocron v1.35.3
78
github.com/go-resty/resty/v2 v2.10.0
89
github.com/gofiber/fiber/v2 v2.50.0
910
github.com/gofiber/helmet/v2 v2.2.26
1011
github.com/google/uuid v1.4.0
1112
github.com/joho/godotenv v1.5.1
13+
github.com/zekiahmetbayar/go-random v0.0.0-20221005103900-1d232ec5eff4
1214
go.uber.org/zap v1.26.0
1315
gorm.io/driver/mysql v1.5.2
1416
gorm.io/driver/postgres v1.5.4
@@ -18,7 +20,6 @@ require (
1820
require (
1921
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
2022
github.com/ChrisTrenkamp/goxpath v0.0.0-20210404020558-97928f7e12b6 // indirect
21-
github.com/benbjohnson/clock v1.3.0 // indirect
2223
github.com/geoffgarside/ber v1.1.0 // indirect
2324
github.com/gofrs/uuid v4.4.0+incompatible // indirect
2425
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
@@ -36,16 +37,11 @@ require (
3637
github.com/mattn/go-isatty v0.0.20 // indirect
3738
github.com/mattn/go-runewidth v0.0.15 // indirect
3839
github.com/opentracing/opentracing-go v1.2.0 // indirect
39-
github.com/philhofer/fwd v1.1.2 // indirect
4040
github.com/pkg/errors v0.9.1 // indirect
4141
github.com/rivo/uniseg v0.4.4 // indirect
42-
github.com/rogpeppe/go-internal v1.8.1 // indirect
43-
github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 // indirect
44-
github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect
42+
github.com/robfig/cron/v3 v3.0.1 // indirect
4543
github.com/segmentio/ksuid v1.0.4 // indirect
46-
github.com/tinylib/msgp v1.1.8 // indirect
4744
go.uber.org/atomic v1.11.0 // indirect
48-
go.uber.org/goleak v1.2.0 // indirect
4945
go.uber.org/multierr v1.11.0 // indirect
5046
golang.org/x/net v0.17.0 // indirect
5147
)

0 commit comments

Comments
 (0)