diff --git a/modules/database/database.go b/modules/database/database.go index 1a0de6c..a94032d 100644 --- a/modules/database/database.go +++ b/modules/database/database.go @@ -32,6 +32,7 @@ func InitDatabase() { db.AutoMigrate(&structs.UserSession{}) db.AutoMigrate(&structs.GroupTasks{}) db.AutoMigrate(&structs.GroupTaskSteps{}) + db.AutoMigrate(&structs.Scanner{}) //createUser() } diff --git a/modules/structs/scanner.go b/modules/structs/scanner.go new file mode 100644 index 0000000..e28ab69 --- /dev/null +++ b/modules/structs/scanner.go @@ -0,0 +1,22 @@ +package structs + +import "time" + +type Scanner struct { + Id string // this id is used for ui + Session string // this session is used for api calls + Name string + UsedByUserId string + UserAgent string + LastUsed time.Time + RegisteredAt time.Time +} + +type ScannerRequest struct { + ScannerName string +} + +type ScannerResponse struct { + Id string + Session string +} diff --git a/modules/utils/globals.go b/modules/utils/globals.go index d3cf491..69d1557 100644 --- a/modules/utils/globals.go +++ b/modules/utils/globals.go @@ -1,12 +1,14 @@ package utils const ( - minUsername = "2" - maxUsername = "20" - minPassword = "6" - MinPassword = 6 - maxPassword = "64" - MaxPassword = 64 + minUsername = "2" + maxUsername = "20" + minPassword = "6" + MinPassword = 6 + maxPassword = "64" + MaxPassword = 64 + minScannerName = "3" + maxScannerName = "16" LenHeaderXAuthorization = 36 lenHeaderXAuthorization = "36" @@ -41,8 +43,9 @@ const ( var ( generalRules = map[string]string{ - "Username": "required,min=" + minUsername + ",max=" + maxUsername, - "Password": "required", // length is checked later because sent in base64 - "SessionId": "required,len" + lenHeaderXAuthorization, + "Username": "required,min=" + minUsername + ",max=" + maxUsername, + "Password": "required", // length is checked later because sent in base64 + "SessionId": "required,len=" + lenHeaderXAuthorization, + "ScannerName": "required,min=" + minScannerName + ",max=" + maxScannerName, } ) diff --git a/modules/utils/validator.go b/modules/utils/validator.go index cc4361e..f1eec29 100644 --- a/modules/utils/validator.go +++ b/modules/utils/validator.go @@ -30,5 +30,8 @@ func ValidateStruct(event interface{}) []*ErrorResponse { } func ValidatorInit() { - Validate.RegisterStructValidationMapRules(generalRules, structs.UserLoginRequest{}, structs.UserSignOutSessionRequest{}) + Validate.RegisterStructValidationMapRules(generalRules, + structs.UserLoginRequest{}, + structs.UserSignOutSessionRequest{}, + structs.ScannerRequest{}) } diff --git a/routers/router/api/v1/jxscanner/scanner.go b/routers/router/api/v1/jxscanner/scanner.go new file mode 100644 index 0000000..78e0b37 --- /dev/null +++ b/routers/router/api/v1/jxscanner/scanner.go @@ -0,0 +1,45 @@ +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" + "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) + } + + database.DB.Create(&structs.Scanner{ + Id: id, + Session: session, + Name: body.ScannerName, + UserAgent: string(c.Context().UserAgent()), + RegisteredAt: time.Now(), + }) + + return c.JSON(structs.ScannerResponse{Id: id, Session: session}) +} diff --git a/routers/router/api/v1/user/auth.go b/routers/router/api/v1/user/auth.go index 978ccda..abceb8a 100644 --- a/routers/router/api/v1/user/auth.go +++ b/routers/router/api/v1/user/auth.go @@ -53,7 +53,7 @@ func UserLogin(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusBadRequest) } - session, err := generateSession() + session, err := GenerateSession() if err != nil { return c.SendStatus(fiber.StatusInternalServerError) @@ -97,7 +97,7 @@ func validatePasswordLength(password string) bool { return true } -func generateSession() (string, error) { +func GenerateSession() (string, error) { var letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" r := make([]byte, 36) diff --git a/routers/router/router.go b/routers/router/router.go index c788e88..d085640 100644 --- a/routers/router/router.go +++ b/routers/router/router.go @@ -4,6 +4,7 @@ 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/jxscanner" "janex/admin-dashboard-backend/routers/router/api/v1/user" "github.com/gofiber/fiber/v2" @@ -18,6 +19,9 @@ func SetupRoutes(app *fiber.App) { u.Delete("/session/:idForDeletion", userSessionValidation, user.SignOutSession) u.Post("/avatar", userSessionValidation, user.UpdateAvatar) + s := v1.Group("/scanner") + s.Post("/", jxscanner.AddScanner) + app.Static("/", "./public") }