90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
package middlewares
|
|
|
|
import (
|
|
"nearle/db"
|
|
"nearle/models"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type RolePayload struct {
|
|
Roleid int `json:"roleid"`
|
|
|
|
|
|
|
|
}
|
|
|
|
func RoleCheckMiddleware(allowedRoles ...int) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
var user models.User
|
|
|
|
if err := c.BodyParser(&user); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"status": false,
|
|
"code": 400,
|
|
"message": "Invalid request body",
|
|
})
|
|
}
|
|
|
|
var uid, dbRoleId int
|
|
var status, dbPassword string
|
|
var query string
|
|
|
|
if user.Authname != "" {
|
|
query = `SELECT userid, password, status, roleid FROM app_users WHERE authname = ? AND configid = ?`
|
|
db.DB.Raw(query, user.Authname, user.Configid).Row().Scan(&uid, &dbPassword, &status, &dbRoleId)
|
|
} else if user.Contactno != "" {
|
|
query = `SELECT userid, password, status, roleid FROM app_users WHERE contactno = ? AND configid = ?`
|
|
db.DB.Raw(query, user.Contactno, user.Configid).Row().Scan(&uid, &dbPassword, &status, &dbRoleId)
|
|
} else {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"status": false,
|
|
"code": 400,
|
|
"message": "authname or contactno required",
|
|
})
|
|
}
|
|
|
|
// No user found
|
|
if uid == 0 {
|
|
return c.Status(fiber.StatusOK).JSON(fiber.Map{
|
|
"status": false,
|
|
"code": 409,
|
|
"message": "Invalid Email",
|
|
"tenantform": true,
|
|
})
|
|
}
|
|
|
|
// Inactive user
|
|
if status == "InActive" {
|
|
return c.Status(fiber.StatusOK).JSON(fiber.Map{
|
|
"status": false,
|
|
"code": 403,
|
|
"message": "Inactive Account. Contact admin.",
|
|
})
|
|
}
|
|
|
|
// Check allowed role
|
|
allowed := false
|
|
for _, r := range allowedRoles {
|
|
if dbRoleId == r {
|
|
allowed = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !allowed {
|
|
return c.Status(fiber.StatusOK).JSON(fiber.Map{
|
|
"status": false,
|
|
"code": 403,
|
|
"message": "Unauthorized role",
|
|
})
|
|
}
|
|
|
|
// Store user data in context
|
|
c.Locals("uid", uid)
|
|
c.Locals("password", dbPassword)
|
|
|
|
return c.Next()
|
|
}
|
|
}
|