Skip to content

Commit 6311840

Browse files
Merge pull request #2 from limanmys/feature/report-queue-support
Feature/report queue support
2 parents 1047b6f + a670d15 commit 6311840

File tree

4 files changed

+213
-3
lines changed

4 files changed

+213
-3
lines changed

app/handlers/queue.go

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package handlers
22

33
import (
4+
"errors"
5+
46
"github.com/gofiber/fiber/v2"
7+
"github.com/google/uuid"
58
"github.com/limanmys/render-engine/app/models"
69
"github.com/limanmys/render-engine/internal/database"
710
"github.com/limanmys/render-engine/internal/liman"
811
"github.com/limanmys/render-engine/internal/process_queue"
12+
"github.com/limanmys/render-engine/pkg/helpers"
913
"github.com/limanmys/render-engine/pkg/logger"
1014
"gorm.io/gorm"
1115
)
@@ -21,9 +25,26 @@ func NewQueueHandler() *QueueHandler {
2125
}
2226

2327
func (h *QueueHandler) Create(c *fiber.Ctx) error {
28+
var formData map[string]string
2429
queue := &models.Queue{}
2530
if err := c.BodyParser(&queue); err != nil {
26-
return err
31+
formData = helpers.GetFormData(c)
32+
if formData == nil {
33+
return err
34+
}
35+
}
36+
37+
if queue.Type == "" {
38+
queue = &models.Queue{
39+
Type: models.Operation(formData["type"]),
40+
Data: map[string]interface{}{
41+
"extension_id": formData["extension_id"],
42+
"server_id": formData["server_id"],
43+
"user_id": formData["user_id"],
44+
"target": formData["target"],
45+
"payload": formData["payload"],
46+
},
47+
}
2748
}
2849

2950
if queue.Data["server_id"] == nil {
@@ -61,8 +82,85 @@ func (h *QueueHandler) Create(c *fiber.Ctx) error {
6182
DB: h.db,
6283
UserID: c.Locals("user_id").(string),
6384
}
85+
go processor.Process()
86+
case models.OperationReport:
87+
processor = &process_queue.CreateReport{
88+
Queue: queue,
89+
DB: h.db,
90+
}
91+
6492
go processor.Process()
6593
}
6694

6795
return c.JSON(queue)
6896
}
97+
98+
func (h *QueueHandler) Index(c *fiber.Ctx) error {
99+
extension_id, err := uuid.Parse(c.FormValue("extension_id"))
100+
if err != nil {
101+
return errors.New("invalid extension id")
102+
}
103+
104+
user_id, err := uuid.Parse(c.FormValue("user_id"))
105+
if err != nil {
106+
return errors.New("invalid user id")
107+
}
108+
109+
server_id, err := uuid.Parse(c.FormValue("server_id"))
110+
if err != nil {
111+
return errors.New("invalid server id")
112+
}
113+
114+
if c.FormValue("queue_type") == "" {
115+
return errors.New("invalid queue type")
116+
}
117+
118+
var queues []*models.Queue
119+
if err := h.db.Model(&models.Queue{}).
120+
Where("type = ?", c.Params("queue_type")).
121+
Where("data->>'extension_id' ?", extension_id).
122+
Where("data->>'server_id' ?", server_id).
123+
Where("data->>'user_id' ?", user_id).Find(&queues).Error; err != nil {
124+
return err
125+
}
126+
127+
return c.JSON(queues)
128+
}
129+
130+
func (h *QueueHandler) Delete(c *fiber.Ctx) error {
131+
// Parse uuid
132+
uid_, err := uuid.Parse(c.Params("id"))
133+
if err != nil {
134+
return err
135+
}
136+
137+
extension_id, err := uuid.Parse(c.FormValue("extension_id"))
138+
if err != nil {
139+
return errors.New("invalid extension id")
140+
}
141+
142+
user_id, err := uuid.Parse(c.FormValue("user_id"))
143+
if err != nil {
144+
return errors.New("invalid user id")
145+
}
146+
147+
server_id, err := uuid.Parse(c.FormValue("server_id"))
148+
if err != nil {
149+
return errors.New("invalid server id")
150+
}
151+
152+
if c.FormValue("queue_type") == "" {
153+
return errors.New("invalid queue type")
154+
}
155+
156+
if err := h.db.Model(&models.Queue{}).
157+
Where("type = ?", c.FormValue("queue_type")).
158+
Where("id = ?", uid_).
159+
Where("data->>'extension_id' ?", extension_id).
160+
Where("data->>'server_id' ?", server_id).
161+
Where("data->>'user_id' ?", user_id).Delete(models.Queue{}).Error; err != nil {
162+
return err
163+
}
164+
165+
return c.JSON("Item deleted successfully.")
166+
}

app/models/queue.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ type Operation string
1313
type Status string
1414

1515
const (
16+
OperationReport Operation = "report"
1617
OperationCreate Operation = "create"
1718
OperationUpdate Operation = "update"
1819
OperationInstall Operation = "install"
@@ -26,12 +27,13 @@ const (
2627
// Queue structure of Queue object
2728
type Queue struct {
2829
ID string `json:"id"`
30+
CreatedAt time.Time `json:"created_at"`
31+
UpdatedAt time.Time `json:"updated_at"`
2932
Type Operation `json:"type"`
3033
Status Status `json:"status"`
3134
Data gormjsonb.JSONB `json:"data" gorm:"type:jsonb;index,type:gin"`
35+
Path string `json:"path"`
3236
Error string `json:"error"`
33-
CreatedAt time.Time `json:"created_at"`
34-
UpdatedAt time.Time `json:"updated_at"`
3537
}
3638

3739
func (Queue) TableName() string {
@@ -62,3 +64,9 @@ func (q *Queue) UpdateError(err string) {
6264
q.Status = StatusFailed
6365
database.Connection().Model(q).Save(q)
6466
}
67+
68+
func (q *Queue) UpdateAsDone(path string) {
69+
q.Path = path
70+
q.Status = StatusDone
71+
database.Connection().Model(q).Save(q)
72+
}

app/routes/index.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ func Install(app *fiber.App) {
4848
// queue handler
4949
queueHandler := handlers.NewQueueHandler()
5050
app.Post("/queue", queueHandler.Create)
51+
app.Get("/queue", queueHandler.Index)
52+
app.Delete("/queue/:id", queueHandler.Delete)
5153

5254
// cronjob
5355
app.Post("/cronjobs", handlers.CreateCronJob)
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package process_queue
2+
3+
import (
4+
b64 "encoding/base64"
5+
"strings"
6+
7+
"github.com/google/uuid"
8+
"github.com/limanmys/render-engine/app/models"
9+
"github.com/limanmys/render-engine/internal/liman"
10+
"github.com/limanmys/render-engine/internal/sandbox"
11+
"github.com/limanmys/render-engine/internal/user_token"
12+
"github.com/limanmys/render-engine/pkg/helpers"
13+
"github.com/limanmys/render-engine/pkg/linux"
14+
"gorm.io/gorm"
15+
)
16+
17+
type CreateReport struct {
18+
Queue *models.Queue
19+
DB *gorm.DB
20+
}
21+
22+
func (c CreateReport) Process() error {
23+
// Update cronjob as processing
24+
c.Queue.UpdateStatus(models.StatusProcessing)
25+
// Check extension
26+
extension, err := liman.GetExtension(&models.Extension{
27+
ID: c.Queue.Data["extension_id"].(string),
28+
})
29+
if err != nil {
30+
// Update job as failed
31+
c.Queue.UpdateError(err.Error())
32+
return err
33+
}
34+
// Check extension status
35+
if extension.Status == "0" {
36+
// Update job as failed
37+
c.Queue.UpdateError("extension is unavailable")
38+
return err
39+
}
40+
41+
// Get credentials
42+
credentials := &models.Credentials{}
43+
if extension.RequireKey == "true" {
44+
credentials, err = liman.GetCredentials(
45+
&models.User{
46+
ID: c.Queue.Data["user_id"].(string),
47+
},
48+
&models.Server{
49+
ID: c.Queue.Data["server_id"].(string),
50+
},
51+
)
52+
// Check errors and username is valid
53+
if err != nil || len(credentials.Username) < 1 {
54+
// Update job as failed
55+
c.Queue.UpdateError("you need a key to use this extension")
56+
return err
57+
}
58+
}
59+
60+
// Encode to b64 and set as form value
61+
formValues := make(map[string]string)
62+
formValues["data"] = b64.StdEncoding.EncodeToString([]byte(c.Queue.Data["payload"].(string)))
63+
64+
// Generate token for user
65+
token, err := user_token.Create(c.Queue.Data["user_id"].(string))
66+
if err != nil {
67+
// Update job as failed
68+
c.Queue.UpdateError(err.Error())
69+
return err
70+
}
71+
72+
// Generate new id for logs
73+
log_id := uuid.New()
74+
75+
// Generate command
76+
command, err := sandbox.GenerateCommand(
77+
extension,
78+
credentials,
79+
&models.CommandParams{
80+
TargetFunction: c.Queue.Data["target"].(string),
81+
Locale: helpers.Env("APP_LANG", "tr"),
82+
Extension: c.Queue.Data["extension_id"].(string),
83+
Server: c.Queue.Data["server_id"].(string),
84+
User: c.Queue.Data["user_id"].(string),
85+
LogID: log_id.String(),
86+
RequestData: formValues,
87+
BaseURL: "https://127.0.0.1",
88+
Token: token,
89+
},
90+
)
91+
if err != nil {
92+
// Update job as failed
93+
c.Queue.UpdateError(err.Error())
94+
95+
return err
96+
}
97+
98+
output := linux.Execute(command)
99+
100+
c.Queue.UpdateAsDone(strings.TrimSpace(strings.ReplaceAll(output, "\"", "")))
101+
return nil
102+
}

0 commit comments

Comments
 (0)