Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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