first commit

This commit is contained in:
2025-02-26 23:42:19 +01:00
commit 777ea98be1
283 changed files with 88266 additions and 0 deletions
@@ -0,0 +1,15 @@
using OpenWarehouse.auth.lib.Model.Role;
using OpenWarehouse.auth.lib.Model.Service;
namespace OpenWarehouse.auth.api.Common.ServiceManager;
public interface IServiceManager
{
public Task<bool> CheckIfServiceUserExist(string serviceName);
public Task<bool> CreateServiceUserResult(string serviceName, bool serviceIsAdmin = false);
public Task<bool> AddAdminToServiceUser(string serviceName);
public Task<List<CreateServiceRoleResult>> CreateServiceRoles(List<RoleModel> serviceRoles, bool forcePrivilages = false);
public Task<List<CreateServicePrivilageResult>> CreateServicesPrivilage(List<string> servicePrivilages);
}
@@ -0,0 +1,161 @@
using Kafka.Lib.Auth;
using MassTransit;
using OpenWarehouse.auth.api.Common.CustomIdentifyManager;
using OpenWarehouse.auth.api.Common.Exemptions;
using OpenWarehouse.auth.lib.Model.Role;
using OpenWarehouse.auth.lib.Model.Service;
namespace OpenWarehouse.auth.api.Common.ServiceManager;
public class ServiceManager(
UserManager<ApplicationUser> userManager, RoleManager<ApplicationRole> roleManager,
PrivilageManager.PrivilegeManager privilegeManager, ILogger<ServiceManager> logger,
ITopicProducer<UserChangeMessageType> userTopic) : IServiceManager
{
public async Task<bool> CheckIfServiceUserExist(string serviceName)
{
return await userManager.FindByNameAsync($"Service-{serviceName}") != null;
}
public async Task<bool> CreateServiceUserResult(string serviceName, bool serviceIsAdmin = false)
{
var serviceUser = new ApplicationUser()
{
UserName = $"Service-{serviceName}",
Email = $"service-{serviceName}@service.local", LockoutEnabled = true,
};
var result = await userManager.CreateAsync(serviceUser);
if (!result.Succeeded) throw new Exception(result.ToString());
if (serviceIsAdmin) await AddAdminToServiceUser(serviceName);
var addClaim = await userManager.AddClaimAsync(serviceUser, AccountType.Service.Claim());
var topic = new UserChangeMessageType()
{
UserId = serviceUser.Id,
Changes = new Dictionary<string, string>()
{
{"Username", $"Service-{serviceName}"},
{"AccountType", AccountType.Service.GetValue()},
{"IsGlobalAdmin", serviceIsAdmin.ToString()}
}
};
_ = userTopic.Produce(topic);
return result.Succeeded && addClaim.Succeeded;
}
public async Task<bool> AddAdminToServiceUser(string serviceName)
{
var roleName = $"Service-{serviceName}";
var user = await userManager.FindByNameAsync(roleName) ?? throw new AccountExemptions(false, "Account not found");
var isAllready = await privilegeManager.UserHasGlobalPrivilage(user, GlobalPrivilage.Privilege.GlobalAdmin);
if (isAllready) return true;
isAllready = await roleManager.FindByNameAsync(roleName) != null;
if (!isAllready)
{
var serviceRole = new ApplicationRole()
{
IsGlobalAdmin = true,
Name = roleName
};
var serviceRoleResult = await roleManager.CreateAsync(serviceRole);
if (!serviceRoleResult.Succeeded)
{
throw new RoleExemptions(false, serviceRoleResult.ToString(), serviceRoleResult
.Errors.Select(error => new KeyValuePair<string, string>(error.Code, error.Description))
.ToDictionary());
}
}
var addRes = await userManager.AddToRoleAsync(user, roleName);
var topic = new UserChangeMessageType()
{
UserId = user.Id,
Changes = new Dictionary<string, string>()
{
{"Role", isAllready ? "Allready exist" : "Created"},
{"Operation", "Added admin to user"},
{"Sucess", addRes.Succeeded.ToString()}
}
};
_ = userTopic.Produce(topic);
return addRes.Succeeded;
}
public async Task<List<CreateServiceRoleResult>> CreateServiceRoles(List<RoleModel> serviceRoles,
bool forcePrivilages = false)
{
logger.LogDebug($"Create roles: {serviceRoles.Select(q => q.RoleName).ToList()}");
var result = new List<CreateServiceRoleResult>();
foreach (var role in serviceRoles)
{
Dictionary<string, string> errors = new();
var roleApp = new ApplicationRole()
{
IsGlobalAdmin = role.IsGlobalAdmin,
Name = role.RoleName
};
foreach (var privilage in role.Privilage ?? throw new Exception("Role is null"))
{
RolePrivilage? privilageObj;
if (forcePrivilages)
{
privilageObj = await privilegeManager.GetPrivilageByName(privilage);
}
else
{
privilageObj = await privilegeManager.GetPrivilageByNameIfDontExistCreateAsync(privilage);
}
if (privilageObj != null)
{
roleApp.Privilege.Add(privilageObj);
}
else
{
errors[privilage] = "Not found";
logger.LogWarning($"Privilage {privilage} not found");
}
}
var resultRole = await roleManager.CreateAsync(roleApp);
if (!resultRole.Succeeded)
{
_ = resultRole.Errors.Select(errorL => errors[errorL.Code] = errorL.Description);
}
result.Add(new CreateServiceRoleResult(resultRole.Succeeded, errors));
}
return result;
}
public async Task<List<CreateServicePrivilageResult>> CreateServicesPrivilage(List<string> servicePrivilages)
{
List<CreateServicePrivilageResult> results = new();
foreach (var privilage in servicePrivilages)
{
var resultsLocal = await privilegeManager.CreatePrivageAsync(privilage);
logger.LogDebug($"Create new role {privilage} is sucess {resultsLocal.IsSuccessed} with errors {resultsLocal.Errors}");
results.Add(new CreateServicePrivilageResult(privilage, resultsLocal.IsSuccessed));
}
return results;
}
}