fix missing gin context (fixes #1)
This commit is contained in:
265
handlers/role.go
265
handlers/role.go
@@ -2,45 +2,17 @@ package handlers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"gitea.tecamino.com/paadi/access-handler/models"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// AddRoleTable
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Creates a new database table for storing role definitions if it does not already exist.
|
||||
//
|
||||
// Behavior:
|
||||
// - Uses the DBHandler to add a table based on the `models.Role` struct.
|
||||
// - Returns an error if table creation fails.
|
||||
//
|
||||
// Returns:
|
||||
// - error: Any database error encountered.
|
||||
func (aH *AccessHandler) AddRoleTable() error {
|
||||
return aH.dbHandler.AddNewTable(models.Role{})
|
||||
}
|
||||
|
||||
// AddDefaultRole
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Ensures that a default administrative role exists in the database.
|
||||
// If a role named "admin" is already present, it logs and skips creation.
|
||||
//
|
||||
// Behavior:
|
||||
// 1. Checks for an existing "admin" role.
|
||||
// 2. If not found, initializes default permissions using
|
||||
// `models.Permissions.DefaultPermissions()`.
|
||||
// 3. Creates a new role record with those permissions.
|
||||
//
|
||||
// Default Role:
|
||||
// - Role: "admin"
|
||||
// - Permissions: all default permissions defined in `models.Permissions`.
|
||||
//
|
||||
// Returns:
|
||||
// - error: Any database or creation error encountered.
|
||||
func (aH *AccessHandler) AddDefaultRole() (err error) {
|
||||
role := "admin"
|
||||
|
||||
@@ -64,134 +36,135 @@ func (aH *AccessHandler) AddDefaultRole() (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// AddNewRole
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Adds a new role with a specific set of permissions to the database.
|
||||
//
|
||||
// Behavior:
|
||||
// 1. Checks whether a role with the same name already exists.
|
||||
// 2. If it does not exist, creates a new role record.
|
||||
//
|
||||
// Parameters:
|
||||
// - role: The role name (e.g., "manager", "viewer").
|
||||
// - permissions: A `models.Permissions` struct defining allowed actions.
|
||||
//
|
||||
// Returns:
|
||||
// - error: If the role already exists or insertion fails.
|
||||
func (aH *AccessHandler) AddNewRole(role string, permissions models.Permissions) (err error) {
|
||||
func (aH *AccessHandler) AddRole(c *gin.Context) {
|
||||
var role models.Role
|
||||
err := c.BindJSON(&role)
|
||||
if err != nil {
|
||||
aH.logger.Error("AddRole", err)
|
||||
c.JSON(http.StatusBadRequest, models.NewJsonErrorResponse(err))
|
||||
return
|
||||
}
|
||||
|
||||
if !role.IsValid() {
|
||||
aH.logger.Error("AddRole", "user empty")
|
||||
c.JSON(http.StatusBadRequest, models.NewJsonMessageResponse("user empty"))
|
||||
return
|
||||
}
|
||||
|
||||
// Check if a role with this name already exists
|
||||
if err := aH.dbHandler.Exists(&models.Role{}, "role", role, false); err == nil {
|
||||
// Found a role → skip creation
|
||||
return fmt.Errorf("role with name %s already exists", role)
|
||||
if err := aH.dbHandler.Exists(&models.Role{}, "role", role.Role, false); err == nil {
|
||||
aH.logger.Error("AddRole", fmt.Sprintf("role with name %s already exists", role.Role))
|
||||
c.JSON(http.StatusBadRequest, models.NewJsonMessageResponse(fmt.Sprintf("role with name %s already exists", role.Role)))
|
||||
}
|
||||
|
||||
// Insert new role with provided permissions
|
||||
aH.dbHandler.AddNewColum(&models.Role{
|
||||
Role: role,
|
||||
Permissions: permissions,
|
||||
Role: role.Role,
|
||||
Permissions: role.Permissions,
|
||||
})
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": fmt.Sprintf("role '%s' successfully added", role.Role),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// GetRoleById
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Retrieves a role record from the database by its numeric ID.
|
||||
//
|
||||
// Parameters:
|
||||
// - id: The unique ID of the role.
|
||||
//
|
||||
// Returns:
|
||||
// - roles: A slice containing the matched role (usually length 1).
|
||||
// - err: Any database error encountered.
|
||||
func (aH *AccessHandler) GetRoleById(id uint) (roles []models.Role, err error) {
|
||||
err = aH.dbHandler.GetById(&roles, id)
|
||||
return
|
||||
func (aH *AccessHandler) GetRole(c *gin.Context) {
|
||||
var i int
|
||||
var err error
|
||||
var roles []models.Role
|
||||
|
||||
role := c.Query("role")
|
||||
id := c.Query("id")
|
||||
|
||||
if role != "" {
|
||||
err = aH.dbHandler.GetByKey(&roles, "role", role, false)
|
||||
} else if id != "" {
|
||||
i, err = strconv.Atoi(id)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"message": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
err = aH.dbHandler.GetById(&roles, uint(i))
|
||||
} else {
|
||||
err = aH.dbHandler.GetById(&roles, 0)
|
||||
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
aH.logger.Error("GetRole", err)
|
||||
c.JSON(http.StatusInternalServerError, nil)
|
||||
return
|
||||
}
|
||||
c.JSON(http.StatusOK, roles)
|
||||
}
|
||||
|
||||
// GetRoleByKey
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Retrieves one or more roles based on a key/value query.
|
||||
//
|
||||
// Parameters:
|
||||
// - key: The column name to search by (e.g., "role").
|
||||
// - value: The value to match (e.g., "admin").
|
||||
// - likeSearch: Whether to use SQL LIKE for partial matches.
|
||||
//
|
||||
// Returns:
|
||||
// - roles: A list of matched roles.
|
||||
// - err: Any database error encountered.
|
||||
func (aH *AccessHandler) GetRoleByKey(key string, value any, likeSearch bool) (roles []models.Role, err error) {
|
||||
err = aH.dbHandler.GetByKey(&roles, key, value, likeSearch)
|
||||
return
|
||||
func (aH *AccessHandler) UpdateRole(c *gin.Context) {
|
||||
var role models.Role
|
||||
if err := c.BindJSON(&role); err != nil {
|
||||
aH.logger.Error("UpdateRole", err)
|
||||
c.JSON(http.StatusInternalServerError, nil)
|
||||
return
|
||||
}
|
||||
err := aH.dbHandler.UpdateValuesById(&role, role.Id)
|
||||
if err != nil {
|
||||
aH.logger.Error("UpdateRole", err)
|
||||
c.JSON(http.StatusInternalServerError, nil)
|
||||
return
|
||||
}
|
||||
c.JSON(http.StatusOK, models.NewJsonMessageResponse("successfully updated role '"+role.Role+"'"))
|
||||
}
|
||||
|
||||
// UpdateRoleById
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Updates a role record identified by its numeric ID.
|
||||
//
|
||||
// Parameters:
|
||||
// - id: The ID of the role to update.
|
||||
// - role: A struct containing updated role data.
|
||||
//
|
||||
// Returns:
|
||||
// - error: Any database error encountered.
|
||||
func (aH *AccessHandler) UpdateRoleById(id uint, role models.Role) error {
|
||||
return aH.dbHandler.UpdateValuesById(&role, id)
|
||||
}
|
||||
func (aH *AccessHandler) DeleteRole(c *gin.Context) {
|
||||
queryRole := c.Query("role")
|
||||
if queryRole == "" || queryRole == "null" || queryRole == "undefined" {
|
||||
aH.logger.Error("DeleteRole", "id query missing or wrong value: "+queryRole)
|
||||
c.JSON(http.StatusInternalServerError, nil)
|
||||
return
|
||||
}
|
||||
|
||||
// UpdateRoleByKey
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Updates a role record using a column key/value lookup.
|
||||
//
|
||||
// Parameters:
|
||||
// - role: The updated role data.
|
||||
// - key: The column name to search by.
|
||||
// - value: The value to match against the key column.
|
||||
//
|
||||
// Returns:
|
||||
// - error: Any database error encountered.
|
||||
func (aH *AccessHandler) UpdateRoleByKey(role models.Role, key string, value any) error {
|
||||
return aH.dbHandler.UpdateValuesByKey(&role, key, value)
|
||||
}
|
||||
var request struct {
|
||||
Roles []string `json:"roles"`
|
||||
}
|
||||
|
||||
// DeleteRoleById
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Deletes a role record from the database by its numeric ID.
|
||||
//
|
||||
// Parameters:
|
||||
// - id: The ID of the role to delete.
|
||||
//
|
||||
// Returns:
|
||||
// - error: Any database error encountered during deletion.
|
||||
func (aH *AccessHandler) DeleteRoleById(id uint) (err error) {
|
||||
return aH.dbHandler.DeleteById(&models.Role{}, id)
|
||||
}
|
||||
err := c.BindJSON(&request)
|
||||
if err != nil {
|
||||
aH.logger.Error("DeleteRole", err)
|
||||
c.JSON(http.StatusBadRequest, nil)
|
||||
return
|
||||
}
|
||||
|
||||
// DeleteRoleByKey
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Deletes one or more roles from the database matching a given key/value pair.
|
||||
//
|
||||
// Parameters:
|
||||
// - key: The column name used for filtering (e.g., "role").
|
||||
// - value: The matching value (e.g., "admin").
|
||||
// - likeSearch: If true, performs a LIKE (partial) match.
|
||||
//
|
||||
// Returns:
|
||||
// - error: Any database error encountered.
|
||||
func (aH *AccessHandler) DeleteRoleByKey(key string, value any, likeSearch bool) (err error) {
|
||||
return aH.dbHandler.DeleteByKey(&models.Role{}, key, value, likeSearch)
|
||||
if len(request.Roles) == 0 {
|
||||
aH.logger.Error("DeleteRole", "no ids given to be deleted")
|
||||
c.JSON(http.StatusBadRequest, models.NewJsonMessageResponse("no roles given to be deleted"))
|
||||
return
|
||||
}
|
||||
|
||||
var ownRole string
|
||||
|
||||
for _, role := range request.Roles {
|
||||
if queryRole == role {
|
||||
ownRole = role
|
||||
continue
|
||||
}
|
||||
err = aH.dbHandler.DeleteByKey(&models.Role{}, "role", role, false)
|
||||
if err != nil {
|
||||
aH.logger.Error("DeleteRole", err)
|
||||
c.JSON(http.StatusInternalServerError, nil)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if ownRole != "" {
|
||||
aH.logger.Error("DeleteRole", "can not delete logged in role id: "+ownRole)
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"message": "can not delete logged in role id: " + ownRole,
|
||||
"role": ownRole,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "role(s) deleted",
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user