admin-dashboard-backend/routers/router/api/v1/jnxscanner/scanner.go

121 lines
3.0 KiB
Go

package jxscanner
import (
"jannex/admin-dashboard-backend/modules/database"
"jannex/admin-dashboard-backend/modules/logger"
"jannex/admin-dashboard-backend/modules/structs"
"jannex/admin-dashboard-backend/modules/utils"
"jannex/admin-dashboard-backend/socketclients"
"time"
"git.ex.umbach.dev/Alex/roese-utils/rsutils"
"git.ex.umbach.dev/Alex/roese-utils/rsvalidator"
"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 := rsvalidator.ValidateStruct(body); err != nil {
log.Error().Msgf("Failed to validate body, err: %v", err)
return c.SendStatus(fiber.StatusBadRequest)
}
id := uuid.V4()
session, err := rsutils.GenerateSession()
if err != nil {
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,
})
logger.AddSystemLog("Scanner %s %s was registered", scanner.Id, scanner.Name)
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,
})
logger.AddSystemLog("Scanner %s has scanned %s", scannerId, body.ScanResult)
return c.SendStatus(fiber.StatusOK)
}
func DeleteScanner(c *fiber.Ctx) error {
session := utils.GetXAuhorizationHeader(c)
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,
},
})
logger.AddSystemLog("Scanner %s was deleted", scanner.Id)
return c.SendStatus(fiber.StatusOK)
}