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.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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 DeleteExpiredMessages()
  35. {
  36. var result = await _dbContext.Messages
  37. .Where(m => (m.ExpiryDate != null && m.ExpiryDate <= DateTime.UtcNow) || !m.IsValid).ToListAsync();
  38. _dbContext.RemoveRange(result);
  39. await _dbContext.SaveChangesAsync();
  40. }
  41. public async Task InvalidateMessage(int id)
  42. {
  43. var message = await _dbContext.Messages.Where(m => m.Id == id).FirstOrDefaultAsync();
  44. message!.IsValid = false;
  45. await _dbContext.SaveChangesAsync();
  46. }
  47. private void DeleteFiles(Guid basePathGuid)
  48. {
  49. // TODO: this path needs to be extracted somehow.
  50. var basePath = Path.Combine(@"D:\secure-sharing\SecureSharing\wwwroot\files", basePathGuid.ToString());
  51. Directory.Delete(basePath, true);
  52. }
  53. public async Task<bool> Delete(int id)
  54. {
  55. var messageDto = await GetById(id);
  56. if (messageDto is null)
  57. return false;
  58. DeleteFiles(messageDto.Code);
  59. _dbContext.Messages.Remove(_mapper.Map<Message>(messageDto));
  60. try
  61. {
  62. await _dbContext.SaveChangesAsync();
  63. }
  64. catch (DbUpdateException)
  65. {
  66. return false;
  67. }
  68. return true;
  69. }
  70. public async Task<IEnumerable<MessageDto>> GetAll()
  71. {
  72. var result = await _dbContext.Messages.AsNoTracking().ToListAsync();
  73. var mappedResult = _mapper.Map<IEnumerable<MessageDto>>(result);
  74. return mappedResult;
  75. }
  76. public async Task<MessageDto> GetById(int messageId)
  77. {
  78. var result = await _dbContext.Messages.Include(x=>x.FileNames).AsNoTracking().FirstOrDefaultAsync(x => x.Id == messageId);
  79. var mappedResult = _mapper.Map<MessageDto>(result);
  80. return mappedResult;
  81. }
  82. public async Task<MessageDto> GetByCode(Guid code)
  83. {
  84. var result = await _dbContext.Messages.Include(x=>x.FileNames).AsNoTracking().FirstOrDefaultAsync(x => x.Code == code.ToString());
  85. var mappedResult = _mapper.Map<MessageDto>(result);
  86. return mappedResult;
  87. }
  88. public async Task Update(MessageDto messageDto)
  89. {
  90. var a = _dbContext.Messages.Update(_mapper.Map<Message>(messageDto));
  91. await _dbContext.SaveChangesAsync();
  92. }
  93. }