using Ardalis.Result; using Microsoft.EntityFrameworkCore; using WatchIt.Database.Model.Accounts; using WatchIt.Database.Model.Roles; using WatchIt.DTO; using WatchIt.DTO.Models.Controllers.Roles; using WatchIt.DTO.Models.Controllers.Roles.Role.Query; using WatchIt.DTO.Models.Controllers.Roles.Role.Request; using WatchIt.DTO.Models.Controllers.Roles.Role.Response; using WatchIt.DTO.Models.Controllers.Roles.RoleActorType; using WatchIt.DTO.Models.Controllers.Roles.RoleCreatorType; using WatchIt.DTO.Models.Generics.Rating; using WatchIt.DTO.Query; using WatchIt.WebAPI.Repositories.Roles; using WatchIt.WebAPI.Services.User; namespace WatchIt.WebAPI.BusinessLogic.Roles; public class RolesBusinessLogic : IRolesBusinessLogic { #region SERVICES private readonly IUserService _userService; private readonly IRolesRepository _rolesRepository; #endregion #region CONSTRUCTORS public RolesBusinessLogic(IUserService userService, IRolesRepository rolesRepository) { _userService = userService; _rolesRepository = rolesRepository; } #endregion #region PUBLIC METHODS #region Main - CRUD public async Task>> GetRoleActors(RoleActorFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery) { IEnumerable entities = await _rolesRepository.GetAllActorsAsync(filterQuery, orderQuery, pagingQuery); return Result.Success(entities.Select(x => x.ToResponse())); } public async Task> GetRoleActor(Guid roleId) { RoleActor? entity = await _rolesRepository.GetAsync(roleId); return entity switch { null => Result.NotFound(), _ => Result.Success(entity.ToResponse()), }; } public async Task>> GetRoleCreators(RoleCreatorFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery) { IEnumerable entities = await _rolesRepository.GetAllCreatorsAsync(filterQuery, orderQuery, pagingQuery); return Result.Success(entities.Select(x => x.ToResponse())); } public async Task> GetRoleCreator(Guid roleId) { RoleCreator? entity = await _rolesRepository.GetAsync(roleId); return entity switch { null => Result.NotFound(), _ => Result.Success(entity.ToResponse()), }; } public async Task> PostRoleActor(RoleActorRequest body) { RoleActor entity = body.ToEntity(); await _rolesRepository.AddAsync(entity); return Result.Created(entity.ToResponse()); } public async Task> PostRoleCreator(RoleCreatorRequest body) { RoleCreator entity = body.ToEntity(); await _rolesRepository.AddAsync(entity); return Result.Created(entity.ToResponse()); } public async Task> PutRoleActor(Guid roleId, RoleActorRequest body) { return await _rolesRepository.UpdateAsync(roleId, x => x.UpdateWithRequest(body)) switch { false => Result.NotFound(), true => Result.Success() }; } public async Task> PutRoleCreator(Guid roleId, RoleCreatorRequest body) { return await _rolesRepository.UpdateAsync(roleId, x => x.UpdateWithRequest(body)) switch { false => Result.NotFound(), true => Result.Success() }; } public async Task DeleteRole(Guid roleId) { await _rolesRepository.DeleteAsync(roleId); return Result.NoContent(); } #endregion #region Main - Rating public async Task> GetRoleRating(Guid roleId) { if (!await _rolesRepository.ExistsAsync(roleId)) { return Result.NotFound(); } IEnumerable ratings = await _rolesRepository.GetRoleRatingsAsync(roleId); return Result.Success(ratings.ToOverallResponse()); } public async Task> GetRoleUserRating(Guid roleId, long accountId) { RoleRating? entity = await _rolesRepository.GetRoleRatingByUserAsync(roleId, accountId); return entity switch { null => Result.NotFound(), _ => Result.Success(entity.ToUserResponse()) }; } public async Task PutRoleRating(Guid roleId, RatingRequest body) { Account accountEntity = await _userService.GetAccountAsync(); Role? roleEntity = await _rolesRepository.GetAsync(roleId); if (roleEntity is null) { return Result.NotFound(); } await _rolesRepository.UpdateOrAddRoleRatingAsync(roleEntity.Id, accountEntity.Id, () => body.ToEntity(roleEntity.Id, accountEntity.Id), x => x.UpdateWithRequest(body)); return Result.Success(); } public async Task DeleteRoleRating(Guid roleId) { Account accountEntity = await _userService.GetAccountAsync(); await _rolesRepository.DeleteRoleUserRatingAsync(roleId, accountEntity.Id); return Result.NoContent(); } #endregion #region ActorTypes public async Task>> GetRoleActorTypes(RoleActorTypeFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery) { IEnumerable entities = await _rolesRepository.GetAllActorTypesAsync(filterQuery, orderQuery, pagingQuery); return Result.Success(entities.Select(x => x.ToResponse())); } public async Task> GetRoleActorType(short roleActorTypeId) { RoleActorType? entity = await _rolesRepository.GetActorTypeAsync(roleActorTypeId); return entity switch { null => Result.NotFound(), _ => Result.Success(entity.ToResponse()) }; } public async Task> PostRoleActorType(RoleActorTypeRequest body) { RoleActorType entity = body.ToEntity(); await _rolesRepository.AddActorTypeAsync(body.ToEntity()); return Result.Created(entity.ToResponse()); } public async Task DeleteRoleActorType(short roleActorTypeId) { await _rolesRepository.DeleteActorTypeAsync(roleActorTypeId); return Result.NoContent(); } #endregion #region CreatorTypes public async Task>> GetRoleCreatorTypes(RoleCreatorTypeFilterQuery filterQuery, OrderQuery orderQuery, PagingQuery pagingQuery) { IEnumerable entities = await _rolesRepository.GetAllCreatorTypesAsync(filterQuery, orderQuery, pagingQuery); return Result.Success(entities.Select(x => x.ToResponse())); } public async Task> GetRoleCreatorType(short roleCreatorTypeId) { RoleCreatorType? entity = await _rolesRepository.GetCreatorTypeAsync(roleCreatorTypeId); return entity switch { null => Result.NotFound(), _ => Result.Success(entity.ToResponse()) }; } public async Task> PostRoleCreatorType(RoleCreatorTypeRequest body) { RoleCreatorType entity = body.ToEntity(); await _rolesRepository.AddCreatorTypeAsync(body.ToEntity()); return Result.Created(entity.ToResponse()); } public async Task DeleteRoleCreatorType(short roleCreatorTypeId) { await _rolesRepository.DeleteActorTypeAsync(roleCreatorTypeId); return Result.NoContent(); } #endregion #endregion }