using adas_core.Application.Repositories.Interfaces; using adas_core.Application.Services.Interfaces; using adas_core.Authentication.Interfaces; using adas_core.Domain.Models.MongoModels; using Microsoft.AspNetCore.Http; using MongoDB.Bson; using Serilog; namespace adas_core.Authentication; public class AuthorityService( IAuthorityRepository authorityRepository, IHttpContextAccessor httpContextAccessor, ILocalAuditService auditService) : IAuthorityService { public void CreateNew(string roleName, ObjectId userId) { authorityRepository.CreateNewAuthority(roleName, userId); } public async Task InsertOne(Authorization authorization) { await authorityRepository.InsertOneAsync(authorization); await auditService.CreateAuditLogAsync(httpContextAccessor.HttpContext?.User!, null, authorization); } public async Task updateOne(Authorization authorization) { var oldAuth = await authorityRepository.GetById(authorization.Id); await authorityRepository.UpdateOneAsync(authorization.Id, authorization); await auditService.CreateAuditLogAsync(httpContextAccessor.HttpContext?.User!, oldAuth, authorization); } /// /// Retrieves the authorities of the specified user. /// /// /// A list of the user's authorities. public Task> GetUserAuthorities(ObjectId userId) { return authorityRepository.GetUserAuthorities(userId); } public Task> GetAllAuthorities() { return authorityRepository.GetAllAuthorities(); } public async Task DeleteAuthoritiesForUser(ObjectId id) { try { var list = await authorityRepository.GetUserAuthorities(id); var result = await authorityRepository.DeleteAllAuthoritiesByUser(id); if (!result) return result; foreach (var auth in list) await auditService.CreateAuditLogAsync(httpContextAccessor.HttpContext?.User!, auth, null); return result; } catch (Exception e) { Log.Error("Exception deleting authorities for user {id}. Exception: {e}", id, e.Message); return false; } } public async Task CreateNewUserAuthority(Authorization authorization) { await authorityRepository.InsertOneAsync(authorization); await auditService.CreateAuditLogAsync(httpContextAccessor.HttpContext?.User!, null, authorization); return authorization; } public async Task DeleteUserAuthority(ObjectId userAuthorityIdParsed) { try { var result = await authorityRepository.DeleteAsync(userAuthorityIdParsed); if (result != null) await auditService.CreateAuditLogAsync(httpContextAccessor.HttpContext?.User!, result, null); return result != null; } catch (Exception e) { Log.Error("Exception deleting user authority {userAuthorityIdParsed}. Exception: {e}", userAuthorityIdParsed, e.Message); return false; } } public async Task EditUserAuthority(Authorization authorization) { try { var oldAuth = await authorityRepository.GetById(authorization.Id); await authorityRepository.UpdateOneAsync(authorization.Id, authorization); await auditService.CreateAuditLogAsync(httpContextAccessor.HttpContext?.User!, oldAuth, authorization); return authorization; } catch (Exception e) { Log.Error("Exception editing user authority {authorization}. Exception: {e}", authorization, e.Message); return null; } } }