You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MessageService.cs 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System.Reflection.Metadata;
  2. using AutoMapper;
  3. using Microsoft.EntityFrameworkCore;
  4. using SecureSharing.Business.Dtos;
  5. using SecureSharing.Business.Infrastructure;
  6. using SecureSharing.Business.Interfaces;
  7. using SecureSharing.Data.Data;
  8. using SecureSharing.Data.DbContexts;
  9. namespace SecureSharing.Business.Services;
  10. public sealed class MessageService : IMessageService
  11. {
  12. private readonly AppDbContext _dbContext;
  13. private readonly IMapper _mapper;
  14. public MessageService(AppDbContext dbContext, IMapper mapper)
  15. {
  16. _dbContext = dbContext;
  17. _mapper = mapper;
  18. }
  19. public async Task<Guid> Create(MessageDto messageDto, PeriodOfValidity chosenPeriod)
  20. {
  21. var message = _mapper.Map<Message>(messageDto);
  22. message.ExpiryDate = chosenPeriod switch
  23. {
  24. PeriodOfValidity.ONE_TIME => null,
  25. PeriodOfValidity.ONE_DAY => DateTime.UtcNow.AddMinutes(1),
  26. PeriodOfValidity.ONE_HOUR => DateTime.UtcNow.AddHours(1),
  27. PeriodOfValidity.ONE_WEEK => DateTime.UtcNow.AddDays(7),
  28. _ => null
  29. };
  30. await _dbContext.Messages.AddAsync(message);
  31. await _dbContext.SaveChangesAsync();
  32. return Guid.Parse(message.Code);
  33. }
  34. public async Task<List<string>> DeleteExpiredMessages()
  35. {
  36. var result = await _dbContext.Messages
  37. .Where(m => (m.ExpiryDate != null && m.ExpiryDate <= DateTime.UtcNow) || !m.IsValid).ToListAsync();
  38. var toReturn = result.Select(x => x.Code).ToList();
  39. _dbContext.RemoveRange(result);
  40. await _dbContext.SaveChangesAsync();
  41. return toReturn;
  42. }
  43. public async Task InvalidateMessage(int id)
  44. {
  45. var message = await _dbContext.Messages.Where(m => m.Id == id).FirstOrDefaultAsync();
  46. message!.IsValid = false;
  47. await _dbContext.SaveChangesAsync();
  48. }
  49. private void DeleteFiles(Guid basePathGuid)
  50. {
  51. // TODO: this path needs to be extracted somehow.
  52. var basePath = Path.Combine(@"D:\secure-sharing\SecureSharing\wwwroot\files", basePathGuid.ToString());
  53. Directory.Delete(basePath, true);
  54. }
  55. public async Task<bool> Delete(int id)
  56. {
  57. var messageDto = await GetById(id);
  58. if (messageDto is null)
  59. return false;
  60. DeleteFiles(messageDto.Code);
  61. _dbContext.Messages.Remove(_mapper.Map<Message>(messageDto));
  62. try
  63. {
  64. await _dbContext.SaveChangesAsync();
  65. }
  66. catch (DbUpdateException)
  67. {
  68. return false;
  69. }
  70. return true;
  71. }
  72. public async Task<IEnumerable<MessageDto>> GetAll()
  73. {
  74. var result = await _dbContext.Messages.AsNoTracking().ToListAsync();
  75. var mappedResult = _mapper.Map<IEnumerable<MessageDto>>(result);
  76. return mappedResult;
  77. }
  78. public async Task<MessageDto> GetById(int messageId)
  79. {
  80. var result = await _dbContext.Messages.Include(x=>x.FileNames).AsNoTracking().FirstOrDefaultAsync(x => x.Id == messageId);
  81. var mappedResult = _mapper.Map<MessageDto>(result);
  82. return mappedResult;
  83. }
  84. public async Task<MessageDto> GetByCode(Guid code)
  85. {
  86. var result = await _dbContext.Messages.Include(x=>x.FileNames).AsNoTracking().FirstOrDefaultAsync(x => x.Code == code.ToString());
  87. var mappedResult = _mapper.Map<MessageDto>(result);
  88. return mappedResult;
  89. }
  90. public async Task Update(MessageDto messageDto)
  91. {
  92. var a = _dbContext.Messages.Update(_mapper.Map<Message>(messageDto));
  93. await _dbContext.SaveChangesAsync();
  94. }
  95. }