using AutoMapper; using DamageAssesment.Api.Documents.Db; using DamageAssesment.Api.Documents.Interfaces; using DamageAssesment.Api.Documents.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Internal; using System; using System.Diagnostics.Eventing.Reader; using System.Reflection.Metadata; namespace DamageAssesment.Api.Documents.Providers { public class documentsProvider : IDocumentsProvider { private DocumentDbContext DocumentDbContext; private ILogger logger; private IUploadService uploadservice; private IMapper mapper; public documentsProvider(DocumentDbContext DocumentDbContext, ILogger logger, IMapper mapper, IUploadService uploadservice) { this.DocumentDbContext = DocumentDbContext; this.logger = logger; this.mapper = mapper; this.uploadservice = uploadservice; SeedData(); } private void SeedData() { if (!DocumentDbContext.LinkTypes.Any()) { DocumentDbContext.LinkTypes.Add(new Db.LinkType() {TypeText = "Forms",IsActive=true, IsAttachment=true }); DocumentDbContext.LinkTypes.Add(new Db.LinkType() {TypeText = "Communiques",IsActive = true,IsAttachment=false }); DocumentDbContext.LinkTypes.Add(new Db.LinkType() {TypeText = "Memos",IsActive = true,IsAttachment=true }); DocumentDbContext.SaveChanges(); } if (!DocumentDbContext.Documents.Any()) { FileModel fileModel = new FileModel() { FileName = "Sample", FileContent = "c2FtcGxl", FileExtension = ".txt" }; DocumentInfo documentInfo = new DocumentInfo() { linkTypeId = 1, url = "Sample", File = fileModel }; Models.Document document = uploadservice.UploadDocument(0, documentInfo); DocumentDbContext.Documents.Add(mapper.Map(document)); DocumentDbContext.SaveChanges(); } if (!DocumentDbContext.DocumentsTranslations.Any()) { Db.DocumentsTranslation documents = new Db.DocumentsTranslation { DocumentId = 1, title = "Test", description = "ss", Language = "en" }; DocumentDbContext.DocumentsTranslations.Add(documents); DocumentDbContext.SaveChanges(); } } public List GetDocumentTranslations(int id, string? language) { List QuestionTranslations; if (string.IsNullOrEmpty(language)) { QuestionTranslations = mapper.Map, List>( DocumentDbContext.DocumentsTranslations.AsNoTracking().Where(a => a.DocumentId == id).ToList()); } else { QuestionTranslations = mapper.Map, List>( DocumentDbContext.DocumentsTranslations.AsNoTracking().Where(a => a.DocumentId == id && a.Language == language).ToList()); } return QuestionTranslations; } public MultiLanDocument CreateMultiLanguageObject(List questions) { MultiLanDocument MultiLanguage = new MultiLanDocument(); Dictionary dicttitle = new Dictionary(); Dictionary dictdesc = new Dictionary(); foreach (Models.DocumentsTranslation item in questions) { dicttitle.Add(item.Language, item.title); dictdesc.Add(item.Language, item.description); } MultiLanguage.titles = dicttitle; MultiLanguage.description = dictdesc; return MultiLanguage; } public async Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkAsync(string? linkType, string? language) { try { logger?.LogInformation("Query Question"); var documents=new List(); if(String.IsNullOrEmpty(linkType)) documents = await DocumentDbContext.Documents.Include(a=>a.LinkType).AsNoTracking().Where(q => q.IsActive).ToListAsync(); else documents = await DocumentDbContext.Documents.Include(a => a.LinkType).AsNoTracking().Where(q => q.IsActive && q.linkTypeId == (DocumentDbContext.LinkTypes.AsNoTracking().Where(a => a.TypeText.ToLower() == linkType.ToLower()).Select(a => a.Id).FirstOrDefault())).ToListAsync(); if (documents != null) { var result = mapper.Map, List>(documents); foreach (var item in result) { var multilan = CreateMultiLanguageObject(GetDocumentTranslations(item.Id, language)); item.titles = multilan.titles; item.description = multilan.description; } return (true, result, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } //public async Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetDocumnetsAsync(string? language) //{ // try // { // logger?.LogInformation("Query Question"); // var documents = await DocumentDbContext.Documents.Include(a => a.LinkType).AsNoTracking().Where(q => q.IsActive).ToListAsync(); // if (documents != null) // { // logger?.LogInformation($"{documents.Count} Document(s) found"); // var result = mapper.Map, List>(documents); // foreach (var item in result) // { // var multilan = CreateMultiLanguageObject(GetDocumentTranslations(item.Id, language)); // item.titles = multilan.titles; // item.description = multilan.description; // } // return (true, result, null); // } // return (false, null, "Not found"); // } // catch (Exception ex) // { // logger?.LogError(ex.ToString()); // return (false, null, ex.Message); // } //} public async Task<(bool IsSuccess, Models.Document Document, string ErrorMessage)> GetDocumentByidAsync(int id) { try { logger?.LogInformation("Query LinkType"); var Document = await DocumentDbContext.Documents.Include(a => a.LinkType).AsNoTracking().FirstOrDefaultAsync(q => q.Id == id && q.IsActive); if (Document != null) { logger?.LogInformation($"{Document} customer(s) found"); var result = mapper.Map(Document); result.documentsTranslations = mapper.Map, List>( DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == result.Id).ToList()); return (true, result, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } //added linktype filter public async Task<(bool IsSuccess, Models.MultiLanDocument Document, string ErrorMessage)> GetDocumentAsync(int id, string? linkType, string? language) { try { logger?.LogInformation("Query LinkType"); //var Document = await DocumentDbContext.Documents.Include(a => a.LinkType).AsNoTracking().FirstOrDefaultAsync(q => q.Id == id && q.IsActive); var Document = new Db.Document(); if (String.IsNullOrEmpty(linkType)) Document = await DocumentDbContext.Documents.Include(a => a.LinkType).AsNoTracking().Where(q => q.IsActive&&q.Id==id).FirstOrDefaultAsync(); else Document = await DocumentDbContext.Documents.Include(a => a.LinkType).AsNoTracking().Where(q => q.IsActive && q.Id == id && q.linkTypeId == (DocumentDbContext.LinkTypes.AsNoTracking().Where(a => a.TypeText.ToLower() == linkType.ToLower()).Select(a => a.Id).FirstOrDefault())).FirstOrDefaultAsync(); if (Document != null) { logger?.LogInformation($"{Document} customer(s) found"); var result = mapper.Map(Document); var multilan = CreateMultiLanguageObject(GetDocumentTranslations(result.Id, language)); result.titles = multilan.titles; result.description = multilan.description; return (true, result, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.MultiLanDocument Document, string ErrorMessage)> PostDocumentAsync(Models.Document Document) { try { var document = mapper.Map(Document); DocumentDbContext.Documents.Add(document); DocumentDbContext.SaveChanges(); var dbtranslation = mapper.Map, List>(Document.documentsTranslations); dbtranslation.ForEach(i => i.DocumentId = document.Id); DocumentDbContext.DocumentsTranslations.AddRange(dbtranslation); DocumentDbContext.SaveChanges(); var result = mapper.Map(document); var multilan = CreateMultiLanguageObject(GetDocumentTranslations(document.Id, "")); result.titles = multilan.titles; result.description = multilan.description; return (true, result, null); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.MultiLanDocument Document, string ErrorMessage)> UpdateDocumentAsync(int id,Models.Document Document) { try { if (Document != null) { var existing = DocumentDbContext.Documents.AsNoTracking().FirstOrDefault(x => x.Id == id); if (existing != null) { Document.Id = existing.Id; var document = mapper.Map(Document); DocumentDbContext.Documents.Update(document); DocumentDbContext.SaveChanges(); var oldtranslations = DocumentDbContext.DocumentsTranslations.Where(a => a.DocumentId == Document.Id).ToList(); if (oldtranslations != null) DocumentDbContext.DocumentsTranslations.RemoveRange(oldtranslations); var dbtranslation = mapper.Map, List>(Document.documentsTranslations); dbtranslation.ForEach(i => i.DocumentId = Document.Id); DocumentDbContext.DocumentsTranslations.AddRange(dbtranslation); DocumentDbContext.SaveChanges(); var result = mapper.Map(document); var multilan = CreateMultiLanguageObject(GetDocumentTranslations(document.Id, "")); result.titles = multilan.titles; result.description = multilan.description; return (true, result, "Successful"); } else { logger?.LogInformation($"{Document} Not found"); return (false, null, "Not Found"); } } else { logger?.LogInformation($"{Document} Bad Request"); return (false, null, "Bad request"); } } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.MultiLanDocument Document, string ErrorMessage)> DeleteDocumentAsync(int id) { try { Db.Document Document = DocumentDbContext.Documents.Include(a => a.LinkType).AsNoTracking().Where(a => a.Id == id).FirstOrDefault(); if (Document == null) { return (false, null, "Not Found"); } var result = mapper.Map(Document); var multilan = CreateMultiLanguageObject(GetDocumentTranslations(Document.Id, "")); result.titles = multilan.titles; result.description = multilan.description; Document.IsActive = false; DocumentDbContext.Documents.Update(Document); DocumentDbContext.SaveChanges(); return (true, result, $"DocumentId {id} deleted Successfuly"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, int counter, string message)> GetDocumentCounter() { try { int AttachmentId = DocumentDbContext.Documents.Max(a => a.Id); return (true, AttachmentId, ""); } catch (Exception ex) { return (false, 0, ex.Message); } } //Link Type methods public async Task<(bool IsSuccess, IEnumerable LinkTypes, string ErrorMessage)> GetLinkTypesAsync() { try { logger?.LogInformation("Query Question"); var LinkType = await DocumentDbContext.LinkTypes.AsNoTracking().Where(q=>q.IsActive).ToListAsync(); if (LinkType != null) { logger?.LogInformation($"{LinkType.Count} LinkTypes(s) found"); var result = mapper.Map, IEnumerable>(LinkType); return (true, result, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> GetLinkTypeAsync(int Id) { try { logger?.LogInformation("Query LinkType"); var LinkType = await DocumentDbContext.LinkTypes.AsNoTracking().FirstOrDefaultAsync(q => q.Id == Id&&q.IsActive); if (LinkType != null) { logger?.LogInformation($"{LinkType} customer(s) found"); var result = mapper.Map(LinkType); return (true, result, null); } return (false, null, "Not found"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> PostLinkTypeAsync(Models.LinkType LinkType) { try { logger?.LogInformation("Query LinkType"); if (!LinkTypeExists(LinkType.Id)) { var dbLink = mapper.Map(LinkType); DocumentDbContext.LinkTypes.Add(dbLink); DocumentDbContext.SaveChanges(); var result = mapper.Map(dbLink); return (true, result, null); } return (false, null, "LinkType is already exits"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> UpdateLinkTypeAsync(Models.LinkType LinkType) { try { if (LinkType != null) { var existing = DocumentDbContext.LinkTypes.AsNoTracking().FirstOrDefault(x => x.Id == LinkType.Id); if (existing != null) { var dbLink = mapper.Map(LinkType); DocumentDbContext.LinkTypes.Update(dbLink); DocumentDbContext.SaveChanges(); return (true, mapper.Map(dbLink), "Successful"); } else { logger?.LogInformation($"{LinkType} Not found"); return (false, null, "Not Found"); } } else { logger?.LogInformation($"{LinkType} Bad Request"); return (false, null, "Bad request"); } } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } public async Task<(bool IsSuccess, Models.LinkType LinkType, string ErrorMessage)> DeleteLinkTypeAsync(int Id) { try { Db.LinkType LinkType = DocumentDbContext.LinkTypes.AsNoTracking().Where(a => a.Id == Id).FirstOrDefault(); if (LinkType == null) { return (false, null, "Not Found"); } LinkType.IsActive = false; DocumentDbContext.LinkTypes.Update(LinkType); DocumentDbContext.SaveChanges(); return (true, mapper.Map(LinkType), $"LinkTypeId {Id} deleted Successfuly"); } catch (Exception ex) { logger?.LogError(ex.ToString()); return (false, null, ex.Message); } } private bool LinkTypeExists(int id) { return DocumentDbContext.LinkTypes.AsNoTracking().Count(e => e.Id == id) > 0; } } }