using AutoMapper; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tsi1.BusinessLayer.Dtos; using Tsi1.BusinessLayer.Helpers; using Tsi1.BusinessLayer.Interfaces; using Tsi1.DataLayer; using Tsi1.DataLayer.Entities; namespace Tsi1.BusinessLayer.Services { public class CommunicationService : ICommunicationService { private readonly Tsi1Context _context; private readonly IMapper _mapper; public CommunicationService(Tsi1Context context, IMapper mapper) { _context = context; _mapper = mapper; } public async Task<ServiceResult<bool>> Create(CommunicationCreateDto newCommunication, int id) { var result = new ServiceResult<bool>(); var isGlobal = newCommunication.IsGlobal; var commmunication = _mapper.Map<Communication>(newCommunication); var validationResult = await this.CreateValidation(id, isGlobal, commmunication); if (validationResult.HasError) { return validationResult; } _context.Communications.Add(commmunication); await _context.SaveChangesAsync(); return result; } public async Task<ServiceResult<bool>> Delete(int communicationId) { var result = new ServiceResult<bool>(); var commmunication = await _context.Communications.FirstOrDefaultAsync(x => x.Id == communicationId); if (commmunication == null) { result.HasError = true; result.AddMessage(string.Format(ErrorMessages.CommunicationDoesNotExist, communicationId)); return result; } _context.Communications.Remove(commmunication); await _context.SaveChangesAsync(); return result; } public async Task<ServiceResult<List<CommunicationPreviewDto>>> GetAllCommunications(int tenantId) { var result = new ServiceResult<List<CommunicationPreviewDto>>(); var tenant = await _context.Tenants.Include(x => x.Courses).FirstOrDefaultAsync(x => x.Id == tenantId); if (tenant == null) { result.HasError = true; result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId)); } var courseIds = tenant.Courses.Select(x => x.Id); var communications = await _context.Communications .AsNoTracking() .Include(x => x.Tenant) .Include(x => x.Course) .Where(x => (x.Tenant.Id == tenantId || courseIds.Contains(x.Course.Id))) .ToListAsync(); result.Data = _mapper.Map<List<CommunicationPreviewDto>>(communications); return result; } public async Task<ServiceResult<List<CommunicationPreviewDto>>> GetCourseCommunications(int courseId, int tenantId) { var result = new ServiceResult<List<CommunicationPreviewDto>>(); var tenant = await _context.Tenants.FirstOrDefaultAsync(x => x.Id == tenantId); if (tenant == null) { result.HasError = true; result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId)); } var validation = await this.TenantValidation(tenantId, courseId); if (validation.HasError) { result.HasError = true; result.AddMessage(validation.Message); return result; } var communications = await _context.Communications .AsNoTracking() .Include(x => x.Course) .Where(x => (x.Course.Id == courseId)) .ToListAsync(); result.Data = _mapper.Map<List<CommunicationPreviewDto>>(communications); return result; } public async Task<ServiceResult<List<CommunicationPreviewDto>>> GetGlobalCommunications(int tenantId) { var result = new ServiceResult<List<CommunicationPreviewDto>>(); var tenant = await _context.Tenants.FirstOrDefaultAsync(x => x.Id == tenantId); if (tenant == null) { result.HasError = true; result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId)); } var communications = await _context.Communications .AsNoTracking() .Include(x => x.Tenant) .Where(x => (x.Tenant.Id == tenantId)) .ToListAsync(); result.Data = _mapper.Map<List<CommunicationPreviewDto>>(communications); return result; } public async Task<ServiceResult<bool>> TenantValidation(int tenantId, int courseId) { var result = new ServiceResult<bool>(); var tenantAdmin = await _context.Tenants.AsNoTracking().FirstOrDefaultAsync(x => x.Name == TenantAdmin.Name); var course = await _context.Courses.AsNoTracking().FirstOrDefaultAsync(x => x.Id == courseId); if (course == null) { result.HasError = true; result.AddMessage(string.Format(ErrorMessages.CourseDoesNotExist, courseId)); return result; } if (tenantAdmin.Id != tenantId) { result.HasError = course.TenantId != tenantId; result.AddMessage(string.Format(ErrorMessages.InvalidTenant, course.TenantId)); } return result; } public async Task<ServiceResult<List<CommunicationPreviewDto>>> GetAllGlobalCommunications() { var result = new ServiceResult<List<CommunicationPreviewDto>>(); var communications = await _context.Communications .AsNoTracking() .Include(x => x.Tenant) .Where(x => x.IsGlobal) .ToListAsync(); result.Data = _mapper.Map<List<CommunicationPreviewDto>>(communications); return result; } public async Task<ServiceResult<List<CommunicationPreviewDto>>> GetAllCourseCommunications(int tenantId) { var result = new ServiceResult<List<CommunicationPreviewDto>>(); var tenant = await _context.Tenants.Include(x => x.Courses).FirstOrDefaultAsync(x => x.Id == tenantId); if (tenant == null) { result.HasError = true; result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId)); } var courseIds = tenant.Courses.Select(x => x.Id); var communications = await _context.Communications .AsNoTracking() .Include(x => x.Course) .Where(x => courseIds.Contains(x.Course.Id)) .ToListAsync(); result.Data = _mapper.Map<List<CommunicationPreviewDto>>(communications); return result; } private async Task<ServiceResult<bool>> CreateValidation(int id, bool isGlobal, Communication commmunication) { var result = new ServiceResult<bool>(); if (isGlobal) { var tenant = await _context.Tenants.FirstOrDefaultAsync(x => x.Id == id && x.Name != TenantAdmin.Name); if (tenant == null) { result.HasError = true; result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, id)); return result; } commmunication.Tenant = tenant; } else { var course = await _context.Courses.FirstOrDefaultAsync(x => x.Id == id); if (course == null) { result.HasError = true; result.AddMessage(string.Format(ErrorMessages.CourseDoesNotExist, id)); return result; } commmunication.Course = course; } return result; } } }