Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 89 additions & 13 deletions ControlAcceso.Tests/Data/PermissionsDbContextTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,42 +18,64 @@ public PermissionsDbContextTests()
}

[Fact]
public void GetGroupedPermissions_ReturnsDictionaryOfPermissions()
public void GetGroupedPermissions_ShouldReturnPermissions_WhenDataExists()
{
// Arrange
var roleId = 1;
var userId = 2;

var mockData = new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
{ "entity", "users" },
{ "permissions", new List<string> { "Read", "Write" } }
{ "entity", "Users" },
{ "permissions", new string[] { "Read", "Write" } }
},
new Dictionary<string, object>
{
{ "entity", "package" },
{ "permissions", new List<string> { "Delete" } }
{ "entity", "Orders" },
{ "permissions", new string[] { "Execute" } }
}
};

_mockDbService.Setup(x => x.ExecuteReader(It.IsAny<string>(), It.IsAny<Dictionary<string, dynamic>>() ))
.Returns(mockData);
_mockDbService.Setup(db => db.ExecuteReader(
It.IsAny<string>(),
It.IsAny<Dictionary<string, dynamic>>()
)).Returns(mockData);

// Act
var result = _dbContext.GetGroupedPermissions(1, 1);
var result = _dbContext.GetGroupedPermissions(roleId, userId);

// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Count);

Assert.True(result.ContainsKey("users"));
Assert.Contains("Read", (List<string>)result["users"]);
Assert.Contains("Write", (List<string>)result["users"]);
Assert.True(result.ContainsKey("Users"));
Assert.Equal(new List<string> { "Read", "Write" }, result["Users"]);

Assert.True(result.ContainsKey("package"));
Assert.Contains("Delete", (List<string>)result["package"]);
Assert.True(result.ContainsKey("Orders"));
Assert.Equal(new List<string> { "Execute" }, result["Orders"]);
}

[Fact]
public void GetGroupedPermissions_ShouldReturnEmptyDictionary_WhenNoDataExists()
{
// Arrange
var roleId = 3;
var userId = 4;

_mockDbService.Setup(db => db.ExecuteReader(
It.IsAny<string>(),
It.IsAny<Dictionary<string, dynamic>>()
)).Returns(new List<Dictionary<string, object>>());

// Act
var result = _dbContext.GetGroupedPermissions(roleId, userId);

// Assert
Assert.NotNull(result);
Assert.Empty(result);
}

[Fact]
public void GetGroupedPermissions_ReturnsEmptyDictionary_WhenNoPermissions()
Expand Down Expand Up @@ -82,5 +104,59 @@ public void GetGroupedPermissions_HandlesException_Gracefully()

Assert.Equal("SqlState: Database connection failed", exception.Message);
}

[Fact]
public void GetRolePermissions_ShouldReturnGroupedPermissions_WhenDataExists()
{
// Arrange
var roleId = 1;
var mockData = new List<Dictionary<string, object>>
{
new Dictionary<string, object>
{
{ "entity", "Users" },
{ "permissions", new string[] { "Read", "Write" } }
},
new Dictionary<string, object>
{
{ "entity", "Orders" },
{ "permissions", new string[] { "Execute" } }
}
};

_mockDbService.Setup(db => db.ExecuteReader(
It.IsAny<string>(),
It.IsAny<Dictionary<string, dynamic>>()
)).Returns(mockData);

// Act
var result = _dbContext.GetRolePermissions(roleId);

// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Count);
Assert.True(result.ContainsKey("Users"));
Assert.Equal(new List<string> { "Read", "Write" }, result["Users"]);
Assert.True(result.ContainsKey("Orders"));
Assert.Equal(new List<string> { "Execute" }, result["Orders"]);
}

[Fact]
public void GetRolePermissions_ShouldReturnEmptyDictionary_WhenNoDataExists()
{
// Arrange
var roleId = 2;
_mockDbService.Setup(db => db.ExecuteReader(
It.IsAny<string>(),
It.IsAny<Dictionary<string, dynamic>>()
)).Returns(new List<Dictionary<string, object>>());

// Act
var result = _dbContext.GetRolePermissions(roleId);

// Assert
Assert.NotNull(result);
Assert.Empty(result);
}
}
}
10 changes: 6 additions & 4 deletions ControlAcceso/Data/Model/PermissionModel.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
namespace ControlAcceso.Data.Model;
public class GroupedPermission
namespace ControlAcceso.Data.Model
{
public string Entity { get; set; } = string.Empty;
public List<string> Permissions { get; set; } = new();
public class PermissionModel
{
public string Entity { get; set; } = string.Empty;
public List<string> Permissions { get; set; } = new();
}
}
1 change: 1 addition & 0 deletions ControlAcceso/Data/Permissions/IPermissionsDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@

namespace ControlAcceso.Data.Permissions;
public interface IPermissionsDbContext{
public Dictionary<string,List<string>> GetRolePermissions(int roleId);
public Dictionary<string,List<string>> GetGroupedPermissions(int roleId, int userId);
}
26 changes: 23 additions & 3 deletions ControlAcceso/Data/Permissions/PermissionsDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,27 @@ public PermissionsDbContext(IDbService dbService)
DbService = dbService;
}

public Dictionary<string, List<string>> GetRolePermissions(int roleId)
{
var query = @"
SELECT entity, ARRAY_AGG(DISTINCT permission) AS permissions
FROM role_permissions
WHERE role_id = @RoleId
GROUP BY entity";

var parameters = new Dictionary<string, dynamic> { { "@RoleId", roleId } };
var rows = DbService.ExecuteReader(query, parameters);

var groupedPermissions = rows.Select(row => new PermissionModel
{
Entity = row["entity"]?.ToString()!,
Permissions = (((string[])row["permissions"]) ?? Array.Empty<string>())
.ToList()
}).ToList();

return groupedPermissions.ToDictionary(gp => gp.Entity, gp => gp.Permissions);
}

public Dictionary<string,List<string>> GetGroupedPermissions(int roleId, int userId)
{
var query = @"
Expand All @@ -36,11 +57,10 @@ FROM user_permissions

var rows = DbService.ExecuteReader(query, parameters);

var groupedPermissions = rows.Select(row => new GroupedPermission
var groupedPermissions = rows.Select(row => new PermissionModel
{
Entity = row["entity"]?.ToString()!,
Permissions = ((List<string>)row["permissions"]!)
.Select(permission => permission.ToString()!)
Permissions = (((string[])row["permissions"]) ?? Array.Empty<string>())
.ToList()
}).ToList();

Expand Down
7 changes: 7 additions & 0 deletions ControlAcceso/Endpoints/Roles/Endpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,5 +72,12 @@ public IActionResult GetPermissions(int idRole, int idUser)

return Ok(new PermissionsResponse { Message = "OK", Permissions = groupedPermissions });
}
[HttpGet("{idRole}/nodes")]
public IActionResult GetRolePermissions(int idRole)
{
var permissions = _permissions?.GetRolePermissions(idRole);
return Ok(new PermissionsResponse {Message = "OK", Permissions=permissions});

}
}
}
8 changes: 0 additions & 8 deletions init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,3 @@ create table role_permissions (
entity VARCHAR NOT NULL,
permission VARCHAR NOT NULL
);
create table user_permissions (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL
CONSTRAINT fk_user_permission_user
REFERENCES users(id) ON DELETE CASCADE,
entity VARCHAR NOT NULL,
permission VARCHAR NOT NULL
);