Ejemplo n.º 1
0
        public async Task <IActionResult> DownloadDoc(string id)
        {
            using (_dbContext)
            {
                try
                {
                    var tblProduct = await _dbContext.TblProduct
                                     .Include(tblP => tblP.TblDocument)
                                     .ThenInclude(tblD => tblD.TblDocumentData)
                                     .FirstOrDefaultAsync(tblP => (tblP.IdProduct).ToString() == id);

                    var          contentType = _files.GetContentType(tblProduct.Url);
                    var          fileName    = _files.GetFileName(tblProduct.Url);
                    MemoryStream content;

                    var tblDocument = tblProduct.TblDocument.FirstOrDefault(); //await _dbContext.TblDocument.FirstOrDefaultAsync(d => d.ProductId == tblProduct.IdProduct);
                    if (tblDocument == null)
                    {                                                          //no downloaded file
                        content = await _download.GetContent(tblProduct.Url);

                        TblDocumentData tblData = new TblDocumentData
                        {
                            IdDocument = Guid.NewGuid(),
                            BinaryData = content.ToArray()
                        };

                        tblDocument = new TblDocument
                        {
                            IdDoc           = tblData.IdDocument,
                            ProductId       = tblProduct.IdProduct,
                            Type            = contentType,
                            Downloaded      = DateTime.Now,
                            Product         = tblProduct,
                            TblDocumentData = tblData
                        };

                        await _dbContext.TblDocument.AddAsync(tblDocument);

                        await _dbContext.TblDocumentData.AddAsync(tblData);

                        await _dbContext.SaveChangesAsync();
                    }
                    else
                    {//previous downloaded file
                        var tblData = tblDocument.TblDocumentData;
                        //var tblData = await _dbContext.TblDocumentData
                        //    .FirstOrDefaultAsync(d => d.IdDocument == tblDocument.IdDoc);
                        if ((tblDocument.Downloaded.HasValue) &&
                            (tblDocument.Downloaded.Value <= DateTime.Now.AddDays(-3)))
                        {//older than 3 days
                            content = await _download.GetContent(tblProduct.Url);

                            tblDocument.Downloaded = DateTime.Now;
                            tblDocument.Type       = contentType;

                            if (content.ToArray() != tblData.BinaryData)
                            {//binary content changed
                                tblData.BinaryData = content.ToArray();
                            }

                            await _dbContext.SaveChangesAsync();
                        }
                        else
                        {
                            content = new MemoryStream(tblData.BinaryData);
                        }
                    }

                    return(File(content, contentType, fileName));
                }
                catch (Exception e)
                {
                    return(BadRequest(e.Message));
                }
            }
        }