Files
2026-08-05 21:15:14 +03:00

132 lines
4.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Auth.Domain.Entities.HR;
using Auth.Domain.Entities;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Auth.Contracts.DTOs.Users;
using System.Security.Claims;
namespace Auth.API.Endpoints.v1.UserEndpoints;
public static class RoleMap
{
public static RouteGroupBuilder RoleEndpoints(this RouteGroupBuilder group)
{
group.MapPost(
"role-management/{role}/user/{userId}",
async ([FromRoute] string userId, [FromRoute] string role, UserManager<AppUser> userManager) =>
{
try
{
var user = await userManager.Users.FirstOrDefaultAsync(x => x.Id == userId);
if (user is null)
return Results.BadRequest();
var result = await userManager.AddToRoleAsync(user, role);
if (!result.Succeeded)
return Results.BadRequest();
return Results.Ok();
}
catch
{
return Results.StatusCode(500);
}
}
);
group.MapDelete(
"role-management/{role}/user/{userid}",
async (string role, string userId, UserManager<AppUser> userManager) =>
{
try
{
var user = await userManager.Users.FirstOrDefaultAsync(x => x.Id == userId);
if (user is null)
return Results.BadRequest();
var result = await userManager.RemoveFromRoleAsync(user, role);
if (!result.Succeeded)
return Results.BadRequest();
return Results.Ok();
}
catch
{
return Results.StatusCode(500);
}
}
);
group.MapGet(
"role-management/roles",
async (RoleManager<IdentityRole> roleManager) =>
{
var roles = await roleManager.Roles.ToListAsync();
return Results.Ok(roles);
}
).RequireAuthorization();
group.MapPost(
"role-management/roles",
async ([FromBody] RoleVM roleVM, RoleManager<IdentityRole> roleManager) =>
{
if (string.IsNullOrEmpty(roleVM.Name)) return Results.BadRequest("Role Name is required.");
var roleExists = await roleManager.RoleExistsAsync(roleVM.Name);
if (roleExists) return Results.Conflict("Role already exists.");
var result = await roleManager.CreateAsync(new IdentityRole(roleVM.Name));
return result.Succeeded ? Results.Ok() : Results.BadRequest(result.Errors);
}
).RequireAuthorization();
group.MapDelete(
"role-management/roles/{id}",
async (string id, RoleManager<IdentityRole> roleManager) =>
{
var role = await roleManager.FindByIdAsync(id);
if (role == null) return Results.NotFound();
var result = await roleManager.DeleteAsync(role);
return result.Succeeded ? Results.Ok() : Results.BadRequest(result.Errors);
}
).RequireAuthorization();
group.MapGet("role-management/roles/{id}/permissions", async (string id, RoleManager<IdentityRole> roleManager) =>
{
var role = await roleManager.FindByIdAsync(id);
if (role == null) return Results.NotFound("Role not found.");
var claims = await roleManager.GetClaimsAsync(role);
return Results.Ok(claims.Select(c => c.Value));
}).RequireAuthorization();
group.MapPost("role-management/roles/{id}/permissions", async (string id, [FromBody] string permission, RoleManager<IdentityRole> roleManager) =>
{
var role = await roleManager.FindByIdAsync(id);
if (role == null) return Results.NotFound("Role not found.");
var result = await roleManager.AddClaimAsync(role, new Claim("Permission", permission));
return result.Succeeded ? Results.Ok() : Results.BadRequest(result.Errors);
}).RequireAuthorization();
group.MapDelete("role-management/roles/{id}/permissions", async (string id, [FromBody] string permission, RoleManager<IdentityRole> roleManager) =>
{
var role = await roleManager.FindByIdAsync(id);
if (role == null) return Results.NotFound("Role not found.");
var result = await roleManager.RemoveClaimAsync(role, new Claim("Permission", permission));
return result.Succeeded ? Results.Ok() : Results.BadRequest(result.Errors);
}).RequireAuthorization();
return group;
}
}