Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using Azure.Core;
  2. using Dapper;
  3. using Diligent.WebAPI.Contracts.DTOs.Categories;
  4. using Diligent.WebAPI.Contracts.DTOs.Document;
  5. using Diligent.WebAPI.Contracts.DTOs.File;
  6. using Diligent.WebAPI.Contracts.DTOs.Files;
  7. using Diligent.WebAPI.Contracts.DTOs.Tags;
  8. using Microsoft.Extensions.Configuration;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Data.SqlClient;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using static System.Net.Mime.MediaTypeNames;
  16. namespace Diligent.WebAPI.Business.Services
  17. {
  18. public class FileEntityService : IFileEntityService
  19. {
  20. private readonly ILogger<FileEntityService> _logger;
  21. private readonly DatabaseContext _context;
  22. private readonly IMapper _mapper;
  23. private readonly IConfiguration _configuration;
  24. public FileEntityService(DatabaseContext context, ILogger<FileEntityService> logger, IMapper mapper, IConfiguration configuration)
  25. {
  26. _context = context;
  27. _logger = logger;
  28. _mapper = mapper;
  29. _configuration = configuration;
  30. }
  31. public async Task UploadFileAsync(FileEntity file)
  32. {
  33. await _context.Files.AddAsync(file);
  34. await _context.SaveChangesAsync();
  35. }
  36. public async Task<object> GetAllFiltered(FileFilter filters)
  37. {
  38. using var connection = new SqlConnection(_configuration.GetConnectionString("WebApi"));
  39. var sql = "";
  40. if(filters.CategoryId == 0)
  41. {
  42. sql = @"SELECT Files.Id as FileId, Note, Files.Deleted, stream_id, DocumentOrganizerDocStore.name as FileName, file_stream, file_type, cached_file_size, Title, Tags.Id as TagId, Tags.Name as TagName
  43. FROM Files inner join FileEntityTag on Files.Id = FileEntityTag.FilesId
  44. inner join Tags on FileEntityTag.TagsId = Tags.Id
  45. inner join DocumentOrganizerDocStore on DocumentOrganizerDocStore.stream_id = Files.DocumentId WHERE Files.Deleted = 0 and Files.CategoryId is NULL" +
  46. (filters.Content is null ? "" : " and contains(DocumentOrganizerDocStore.file_stream," + "'\"" + filters.Content + "*\"')");
  47. }
  48. else
  49. {
  50. sql = @"SELECT Files.Id as FileId, Note, Files.Deleted, stream_id, DocumentOrganizerDocStore.name as FileName, file_stream, file_type, cached_file_size, Title, Tags.Id as TagId, Tags.Name as TagName
  51. FROM Files inner join FileEntityTag on Files.Id = FileEntityTag.FilesId
  52. inner join Tags on FileEntityTag.TagsId = Tags.Id
  53. inner join DocumentOrganizerDocStore on DocumentOrganizerDocStore.stream_id = Files.DocumentId WHERE Files.Deleted = 0 and Files.CategoryId=@categoryId" +
  54. (filters.Content is null ? "" : " and contains(DocumentOrganizerDocStore.file_stream," + "'\"" + filters.Content + "*\"')");
  55. }
  56. var files = await connection.QueryAsync<FileFilterReturn, TagResponse, FileFilterReturn>(sql,(file, tag) =>
  57. {
  58. file.Tags.Add(tag);
  59. return file;
  60. }, splitOn: "TagId",
  61. param: new { categoryId = filters.CategoryId });
  62. var filesList = new List<FileFilterReturnDto>();
  63. foreach (var fileItem in files.ToList())
  64. {
  65. var fileFilterReturnDto = new FileFilterReturnDto
  66. {
  67. Stream_id = fileItem.Stream_id,
  68. Cached_file_size = fileItem.Cached_file_size,
  69. Category = fileItem.Category,
  70. FileName = fileItem.FileName,
  71. File_type = fileItem.File_type,
  72. Tags = fileItem.Tags,
  73. Title = fileItem.Title,
  74. Note = fileItem.Note
  75. };
  76. // return File_stream in base64 format
  77. MemoryStream stream = new (fileItem.File_stream);
  78. fileFilterReturnDto.File_stream = ConvertToBase64(stream);
  79. filesList.Add(fileFilterReturnDto);
  80. }
  81. var filtered = filesList
  82. .FilterFiles(filters)
  83. .DistinctBy(x => x.Stream_id).ToList();
  84. return new
  85. {
  86. Data = filtered.ApplyPagging(filters)
  87. .Select(n => new { n.Stream_id, n.FileName,n.File_stream, n.Cached_file_size, n.File_type, n.Title, n.Note }),
  88. Total = filtered.Count
  89. };
  90. }
  91. private static string ConvertToBase64(Stream stream)
  92. {
  93. byte[] bytes;
  94. using (var memoryStream = new MemoryStream())
  95. {
  96. stream.CopyTo(memoryStream);
  97. bytes = memoryStream.ToArray();
  98. }
  99. string base64 = Convert.ToBase64String(bytes);
  100. return base64;
  101. }
  102. public async Task<FileEntity> GetFileEntityByIdAsync(Guid id)
  103. {
  104. var file = await _context.Files.Where(x => x.DocumentId == id).FirstOrDefaultAsync();
  105. if (file is null)
  106. {
  107. throw new EntityNotFoundException("File not found");
  108. }
  109. return file;
  110. }
  111. public async Task DeleteFileAsync(Guid id)
  112. {
  113. var file = await GetFileEntityByIdAsync(id);
  114. file.Deleted= true;
  115. await _context.SaveChangesAsync();
  116. }
  117. public async Task UpdateNoteAsync(Guid id, UpdateFileNoteRequest fileDto)
  118. {
  119. var file = await GetFileEntityByIdAsync(id);
  120. file.Note = fileDto.Note;
  121. await _context.SaveChangesAsync();
  122. }
  123. }
  124. }