142 lines
3.5 KiB
Go
142 lines
3.5 KiB
Go
package jxscanner
|
|
|
|
import (
|
|
"janex/admin-dashboard-backend/modules/database"
|
|
"janex/admin-dashboard-backend/modules/structs"
|
|
"janex/admin-dashboard-backend/modules/utils"
|
|
"janex/admin-dashboard-backend/routers/router/api/v1/user"
|
|
"janex/admin-dashboard-backend/socketclients"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/rs/zerolog/log"
|
|
"github.com/savsgio/gotils/uuid"
|
|
)
|
|
|
|
func AddScanner(c *fiber.Ctx) error {
|
|
var body structs.ScannerRequest
|
|
|
|
if err := c.BodyParser(&body); err != nil {
|
|
log.Error().Msg("Failed to parse body, err: " + err.Error())
|
|
return c.Status(fiber.StatusBadRequest).JSON(err)
|
|
}
|
|
|
|
if err := utils.ValidateStruct(body); err != nil {
|
|
log.Error().Msgf("Failed to validate body, err: %s", err)
|
|
return c.SendStatus(fiber.StatusBadRequest)
|
|
}
|
|
|
|
id := uuid.V4()
|
|
session, err := user.GenerateSession()
|
|
|
|
if err != nil {
|
|
log.Error().Msgf("Failed to create session for scanner: %v", err)
|
|
return c.SendStatus(fiber.StatusInternalServerError)
|
|
}
|
|
|
|
scanner := &structs.Scanner{
|
|
Id: id,
|
|
Session: session,
|
|
Name: body.ScannerName,
|
|
UserAgent: string(c.Context().UserAgent()),
|
|
RegisteredAt: time.Now(),
|
|
}
|
|
|
|
database.DB.Create(scanner)
|
|
|
|
// clear session to prevent leaking and sending to ui
|
|
scanner.Session = ""
|
|
|
|
socketclients.BroadcastMessage(structs.SendSocketMessage{
|
|
Cmd: utils.SentCmdNewScanner,
|
|
Body: scanner,
|
|
})
|
|
|
|
return c.JSON(structs.ScannerResponse{Id: id, Session: session})
|
|
}
|
|
|
|
func ScanResult(c *fiber.Ctx) error {
|
|
var body structs.ScanResultRequest
|
|
|
|
if err := c.BodyParser(&body); err != nil {
|
|
log.Error().Msg("Failed to parse body, err: " + err.Error())
|
|
return c.Status(fiber.StatusBadRequest).JSON(err)
|
|
}
|
|
|
|
if body.ScanResult == "" {
|
|
return c.SendStatus(fiber.StatusBadRequest)
|
|
}
|
|
|
|
scannerId := c.Locals("scannerId").(string)
|
|
lastUsed := time.Now()
|
|
|
|
database.DB.Model(&structs.Scanner{}).Where("id = ?", scannerId).Updates(&structs.Scanner{LastUsed: lastUsed})
|
|
|
|
socketclients.BroadcastMessage(structs.SendSocketMessage{
|
|
Cmd: utils.SentCmdUpdateScannerLastUsed,
|
|
Body: struct {
|
|
ScannerId string
|
|
LastUsed time.Time
|
|
}{
|
|
ScannerId: scannerId,
|
|
LastUsed: lastUsed,
|
|
},
|
|
})
|
|
|
|
socketclients.SendMessageToUser(c.Locals("usedByUserId").(string), "", structs.SendSocketMessage{
|
|
Cmd: utils.SentCmdScanResult,
|
|
Body: body.ScanResult,
|
|
})
|
|
|
|
return c.SendStatus(fiber.StatusOK)
|
|
}
|
|
|
|
func DeleteScanner(c *fiber.Ctx) error {
|
|
session := utils.GetXAuhorizationHeader(c)
|
|
|
|
log.Info().Msgf("scanner session %v", session)
|
|
|
|
var scanner structs.Scanner
|
|
|
|
database.DB.First(&scanner, "session = ?", session)
|
|
|
|
database.DB.Delete(&structs.Scanner{}, "session = ?", session)
|
|
|
|
socketclients.BroadcastMessage(structs.SendSocketMessage{
|
|
Cmd: utils.SentCmdDeleteScanner,
|
|
Body: struct {
|
|
Id string
|
|
}{
|
|
Id: scanner.Id,
|
|
},
|
|
})
|
|
|
|
return c.SendStatus(fiber.StatusOK)
|
|
}
|
|
|
|
func UpdateScannerUsedByUserId(c *fiber.Ctx) error {
|
|
scannerId := c.Params("scannerId")
|
|
|
|
if len(scannerId) != 36 {
|
|
log.Error().Msgf("Error parsing scanner id: %v", scannerId)
|
|
return c.SendStatus(fiber.StatusBadRequest)
|
|
}
|
|
|
|
usedByUserId := c.Locals("userId").(string)
|
|
|
|
database.DB.Model(&structs.Scanner{}).Where("id = ?", scannerId).Updates(structs.Scanner{UsedByUserId: usedByUserId})
|
|
|
|
socketclients.BroadcastMessage(structs.SendSocketMessage{
|
|
Cmd: utils.SentCmdUpdateScannerUsedBy,
|
|
Body: struct {
|
|
ScannerId string
|
|
UsedByUserId string
|
|
}{
|
|
ScannerId: scannerId,
|
|
UsedByUserId: usedByUserId,
|
|
},
|
|
})
|
|
|
|
return c.SendStatus(fiber.StatusOK)
|
|
}
|