using AutoMapper; using Microsoft.EntityFrameworkCore; using SecureSharing.Business.Dtos; using SecureSharing.Business.Infrastructure; using SecureSharing.Business.Interfaces; using SecureSharing.Data.Data; using SecureSharing.Data.DbContexts; namespace SecureSharing.Business.Services; public sealed class MessageService : IMessageService { private readonly AppDbContext _dbContext; private readonly IMapper _mapper; public MessageService(AppDbContext dbContext, IMapper mapper) { _dbContext = dbContext; _mapper = mapper; } public async Task Create(MessageDto messageDto, PeriodOfValidity chosenPeriod) { var message = _mapper.Map(messageDto); message.ExpiryDate = chosenPeriod switch { PeriodOfValidity.ONE_TIME => null, PeriodOfValidity.ONE_DAY => DateTime.UtcNow.AddMinutes(1), PeriodOfValidity.ONE_HOUR => DateTime.UtcNow.AddHours(1), PeriodOfValidity.ONE_WEEK => DateTime.UtcNow.AddDays(7), _ => null }; await _dbContext.Messages.AddAsync(message); await _dbContext.SaveChangesAsync(); return Guid.Parse(message.Code); } public async Task DeleteExpiredMessages() { var result = await _dbContext.Messages .Where(m => (m.ExpiryDate != null && m.ExpiryDate <= DateTime.UtcNow) || !m.IsValid).ToListAsync(); _dbContext.RemoveRange(result); await _dbContext.SaveChangesAsync(); } public async Task InvalidateMessage(int id) { var message = await _dbContext.Messages.Where(m => m.Id == id).FirstOrDefaultAsync(); message.IsValid = false; await _dbContext.SaveChangesAsync(); } public async Task Delete(int messageId) { var messageDto = await GetById(messageId); if (messageDto is null) return false; _dbContext.Set().Remove(_mapper.Map(messageDto)); try { await _dbContext.SaveChangesAsync(); } catch (DbUpdateException) { return false; } return true; } public async Task> GetAll() { var result = await _dbContext.Messages.AsNoTracking().ToListAsync(); var mappedResult = _mapper.Map>(result); return mappedResult; } public async Task GetById(int messageId) { var result = await _dbContext.Messages.Include(x=>x.FileNames).AsNoTracking().FirstOrDefaultAsync(x => x.Id == messageId); var mappedResult = _mapper.Map(result); return mappedResult; } public async Task GetByCode(Guid code) { var result = await _dbContext.Messages.Include(x=>x.FileNames).AsNoTracking().FirstOrDefaultAsync(x => x.Code == code.ToString()); var mappedResult = _mapper.Map(result); return mappedResult; } public async Task Update(MessageDto messageDto) { var a = _dbContext.Messages.Update(_mapper.Map(messageDto)); await _dbContext.SaveChangesAsync(); } }