Skip to content

Commit

Permalink
Merge pull request #1 from limanmys/feature/cron-system
Browse files Browse the repository at this point in the history
  • Loading branch information
dogukanoksuz committed Nov 8, 2023
2 parents e8e6051 + 8f6a326 commit 1047b6f
Show file tree
Hide file tree
Showing 9 changed files with 383 additions and 109 deletions.
89 changes: 89 additions & 0 deletions app/handlers/cron_jobs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package handlers

import (
"errors"

"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/limanmys/render-engine/app/models"
"github.com/limanmys/render-engine/internal/database"
"github.com/limanmys/render-engine/pkg/cron_jobs"
)

func CreateCronJob(c *fiber.Ctx) error {
// Parse payload
var payload models.CronJob
if err := c.BodyParser(&payload); err != nil {
return err
}

extension_id, err := uuid.Parse(c.FormValue("extension_id"))
if err != nil {
return errors.New("invalid extension id")
}

user_id, err := uuid.Parse(c.FormValue("user_id"))
if err != nil {
return errors.New("invalid user id")
}

server_id, err := uuid.Parse(c.FormValue("server_id"))
if err != nil {
return errors.New("invalid server id")
}

// Fill default fields
cj := models.NewCronJob()
payload.ID = cj.ID
payload.Status = cj.Status
payload.Message = cj.Message

payload.BaseURL = "https://127.0.0.1"
payload.ExtensionID = &extension_id
payload.ServerID = &server_id
payload.UserID = &user_id

// Create cronjob rule on db
if err := database.Connection().Model(&models.CronJob{}).Create(&payload).Error; err != nil {
return err
}

// Register and run cronjob
if err := cron_jobs.RegisterAndRun(&payload); err != nil {
return err
}

return c.JSON("Cronjob registered successfully.")
}

func IndexCronJobs(c *fiber.Ctx) error {
// Set empty variable for later use
var cronjobs []*models.CronJob
// Get all cronjobs
if err := database.Connection().Model(&models.CronJob{}).Find(&cronjobs).Error; err != nil {
return err
}

return c.JSON(cronjobs)
}

func DeleteCronJob(c *fiber.Ctx) error {
// Parse uuid
uid_, err := uuid.Parse(c.Params("id"))
if err != nil {
return err
}

// Remove cronjob from global scheduler
if err := cron_jobs.Delete(&uid_); err != nil {
return err
}

// If cronjob successfully remove by scheduler, remove it from storage
if err := database.Connection().Model(&models.CronJob{}).
Where("id = ?", uid_).Delete(&models.CronJob{}).Error; err != nil {
return err
}

return c.JSON("Item deleted successfully.")
}
64 changes: 64 additions & 0 deletions app/models/cron_job.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package models

import (
"time"

"github.com/google/uuid"
"github.com/limanmys/render-engine/internal/database"
)

type CronJob struct {
ID *uuid.UUID `json:"id" gorm:"primary_key,type:uuid"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`

ExtensionID *uuid.UUID `json:"extension_id"`
UserID *uuid.UUID `json:"user_id"`
ServerID *uuid.UUID `json:"server_id"`
BaseURL string `json:"base_url"`

Payload string `json:"payload"`
Day int `json:"day"`
Time string `json:"time"`
Target string `json:"target"`

Message string `json:"message"` // Last run message
Status Status `json:"status"` // Last run status
Output string `json:"output"` // Last run output
}

func (CronJob) TableName() string {
return "cronjobs"
}

func NewCronJob() *CronJob {
id := uuid.New()

return &CronJob{
ID: &id,
Message: "Pending.",
Status: StatusPending,
}
}

func (cj *CronJob) UpdateAsProcessing() {
cj.Status = StatusProcessing
cj.Message = "Cronjob processing."
cj.Output = "-"

database.Connection().Model(cj).Save(cj)
}

func (cj *CronJob) UpdateAsFailed(message string) {
cj.Status = StatusFailed
cj.Message = message

database.Connection().Model(cj).Save(cj)
}

func (cj *CronJob) UpdateAsDone(output string) {
cj.Status = StatusDone
cj.Message = "CronJob completed successfully. Waiting for next run."

database.Connection().Model(cj).Save(cj)
}
5 changes: 5 additions & 0 deletions app/routes/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,9 @@ func Install(app *fiber.App) {
// queue handler
queueHandler := handlers.NewQueueHandler()
app.Post("/queue", queueHandler.Create)

// cronjob
app.Post("/cronjobs", handlers.CreateCronJob)
app.Get("/cronjobs", handlers.IndexCronJobs)
app.Delete("/cronjobs/:id", handlers.DeleteCronJob)
}
10 changes: 3 additions & 7 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ go 1.19

require (
github.com/Nerzal/gocloak/v13 v13.8.0
github.com/go-co-op/gocron v1.35.3
github.com/go-resty/resty/v2 v2.10.0
github.com/gofiber/fiber/v2 v2.50.0
github.com/gofiber/helmet/v2 v2.2.26
github.com/google/uuid v1.4.0
github.com/joho/godotenv v1.5.1
github.com/zekiahmetbayar/go-random v0.0.0-20221005103900-1d232ec5eff4
go.uber.org/zap v1.26.0
gorm.io/driver/mysql v1.5.2
gorm.io/driver/postgres v1.5.4
Expand All @@ -18,7 +20,6 @@ require (
require (
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
github.com/ChrisTrenkamp/goxpath v0.0.0-20210404020558-97928f7e12b6 // indirect
github.com/benbjohnson/clock v1.3.0 // indirect
github.com/geoffgarside/ber v1.1.0 // indirect
github.com/gofrs/uuid v4.4.0+incompatible // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
Expand All @@ -36,16 +37,11 @@ require (
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/philhofer/fwd v1.1.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
github.com/rogpeppe/go-internal v1.8.1 // indirect
github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 // indirect
github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect
github.com/robfig/cron/v3 v3.0.1 // indirect
github.com/segmentio/ksuid v1.0.4 // indirect
github.com/tinylib/msgp v1.1.8 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/goleak v1.2.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/net v0.17.0 // indirect
)
Expand Down
Loading

0 comments on commit 1047b6f

Please sign in to comment.