admin-dashboard-backend/routers/router/api/v1/jxscanner/scanner.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: %v", 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)
}