using Azure.Core; using Dapper; using Diligent.WebAPI.Contracts.DTOs.Categories; using Diligent.WebAPI.Contracts.DTOs.Document; using Diligent.WebAPI.Contracts.DTOs.File; using Diligent.WebAPI.Contracts.DTOs.Files; using Diligent.WebAPI.Contracts.DTOs.Tags; using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.Mime.MediaTypeNames; namespace Diligent.WebAPI.Business.Services { public class FileEntityService : IFileEntityService { private readonly ILogger _logger; private readonly DatabaseContext _context; private readonly IMapper _mapper; private readonly IConfiguration _configuration; public FileEntityService(DatabaseContext context, ILogger logger, IMapper mapper, IConfiguration configuration) { _context = context; _logger = logger; _mapper = mapper; _configuration = configuration; } public async Task> GetAllAsync() => _mapper.Map>(await _context.Files.Include(x => x.Tags).ToListAsync()); public async Task UploadPdfAsync(FileEntity file) { await _context.Files.AddAsync(file); await _context.SaveChangesAsync(); } public async Task> GetAll() { return await _context.Files.ToListAsync(); } public async Task GetAllFiltered(FileFilter filters) { using var connection = new SqlConnection(_configuration.GetConnectionString("WebApi")); var files = await connection.QueryAsync("SELECT Files.Id as FileId, stream_id, DocumentOrganizerDocStore.name as FileName, file_stream, file_type, cached_file_size, Tags.Id as TagId, Tags.Name as TagName, Categories.Id as CategoryId, Categories.Name as CategoryName FROM Files inner join FileEntityTag on Files.Id = FileEntityTag.FilesId inner join Tags on FileEntityTag.TagsId = Tags.Id inner join DocumentOrganizerDocStore on DocumentOrganizerDocStore.stream_id = Files.DocumentId inner join Categories on Files.CategoryId = Categories.Id;", (file, tag, category) => { file.Tags.Add(tag); file.Category = category; return file; }, splitOn: "TagId, CategoryId"); var filesList = files.ToList(); var filtered = filesList .FilterFiles(filters); return new { Data = filtered.ApplyPagging(filters) .Select(n => new { n.stream_id, n.FileName, n.cached_file_size, n.file_type }), Total = filtered.Count }; } } }