Dotnet Uploaded logo retrieval for use in digital card creation

I need to retrieve the logo that is uploaded under a company to use in a digital card creation.
Obviously with multiple Companies there can be multiple file uploads.
How do I retrieve the file from the db and use it like this:
If uploaded logo is present for company use uploaded logo else use default logo.
If i need to provide more clarity I am happy to do so

FileService.cs

using ERaf.Interfaces.Repositories;
using ERaf.Interfaces.Services;
using ERaf.Models;
using ERaf.Services.Helpers;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using File = ERaf.Models.EntityModels.File;

namespace ERaf.Services
{
    public class FileService : IFileService
    {
        private readonly IFileRepository fileRepository;
        private readonly string fileStorageLocation;
        private static readonly IEnumerable<string> allowedMimeTypes = new string[] { ".bmp", ".jpg", ".png", ".pdf", ".xlsx" };
        public FileService(IFileRepository fileRepository, IOptions<AppSettings> appSettings)
        {
            this.fileRepository = fileRepository;
            this.fileStorageLocation = appSettings.Value.FileStorageLocation;
        }

        //CREATE
        public async Task<int> Create(IFormFile fileToSave, bool ignoreTypeRestriction)
        {
            var file = new ERaf.Models.EntityModels.File
            {
                GuidA = Guid.NewGuid(),
                GuidB = Guid.NewGuid(),
                Mime = System.IO.Path.GetExtension(fileToSave.FileName)
            };

            if (ignoreTypeRestriction == false)
                await CheckAllowedMimeTypes(file.Mime);

            var filePath = System.IO.Path.Combine(fileStorageLocation, file.GuidA.ToString() + file.GuidB.ToString() + file.Mime);
            using (var stream = System.IO.File.Create(filePath))
            {
                await fileToSave.CopyToAsync(stream);
            }

            if (file.Mime == ".pdf")
                await ValidatePdfByRecreation(filePath);


            return await fileRepository.Create(file);
        }

        public async Task<int> Create(Stream fileStream, string fileName)
        {
            var file = new ERaf.Models.EntityModels.File
            {
                GuidA = Guid.NewGuid(),
                GuidB = Guid.NewGuid(),
                Mime = System.IO.Path.GetExtension(fileName)
            };

            var filePath = System.IO.Path.Combine(fileStorageLocation, file.GuidA.ToString() + file.GuidB.ToString() + file.Mime);
            using (var stream = System.IO.File.Create(filePath))
            {
                await fileStream.CopyToAsync(stream);
            }

            return await fileRepository.Create(file);
        }

        public async Task<File> Create(File entity)
        {
            var file = new ERaf.Models.EntityModels.File
            {
                GuidA = entity.GuidA,
                GuidB = entity.GuidA,
                Mime = entity.Mime
            };

            var entityId = await fileRepository.Create(file);
            return await GetOne(entityId);
        }

        //READ
        public Task<IEnumerable<File>> GetAll()
        {
            throw new NotImplementedException();
        }

        public async Task<File> GetOne(int entityId)
        {
            return await fileRepository.Get()
                .Where(x => x.Id == entityId)
                .FirstOrDefaultAsync();
        }

        public IQueryable<string> GetFileLink(int fileId)
        {
            var files = fileRepository.Get();
            return files
                .Where(x => x.Id == fileId)
                .Select(x => "t/" + x.Mime + "/" + x.GuidA + "/" + x.GuidB + "/file");
        }

        //UPDATE
        public Task<File> Update(File entity)
        {
            throw new NotImplementedException();
        }

        //DELETE
        public Task Delete(int entityId)
        {
            throw new NotImplementedException();
        }

        //UTILITY
        private async Task CheckAllowedMimeTypes(string mime)
        {
            if (!allowedMimeTypes.Contains(mime.ToLower()))
                throw new ReadableException("Only the following file types are allowed: " + String.Join(", ", allowedMimeTypes));
        }

        private async Task ValidatePdfByRecreation(string filePath)
        {
            var pdfBuilder = new PdfBuilder();
            try
            {
                pdfBuilder.AddPdf(filePath);
                pdfBuilder.SaveFile(filePath);
            }
            catch (Exception e)
            {
                throw new ReadableException("The provided pdf file isn't compatible with this system. Try re-printing the file as pdf from your web browser, this can help fix irregularities, then re-upload.");
            }
        }
    }
}

AccisureCustomerCardImage.cs

using ERaf.Models.PdfGeneratorModels;
using QuestPDF.Drawing;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
using System;
using System.Collections.Generic;

namespace ERaf.Services.Helpers.PdfGenerators
{
    public class AccisureCustomerCardImage : IDocument
    {
        private static readonly int[] cS = new int[] { 15, 50, 40, 20 };

        private TextStyle baseStyle = TextStyle.Default.FontType("Arial").Size(16).Color("#496479");
        private TextStyle titleStyle = TextStyle.Default.FontType("Arial").Size(18).Color("#496479").SemiBold();

        private TextStyle tableHeaderStyle = TextStyle.Default.FontType("Arial").Size(16).Color("#496479").SemiBold();
        private TextStyle numberStyle = TextStyle.Default.FontType("Consolas").Size(18).Color("#496479");
        private IEnumerable<AccisureCustomerCardLineDto> accisureCustomerCardDto;

        public AccisureCustomerCardImage(IEnumerable<AccisureCustomerCardLineDto> accisureCustomerCardDto)
        {
            this.accisureCustomerCardDto = accisureCustomerCardDto;
          
        }

        public DocumentMetadata GetMetadata() => DocumentMetadata.Default;

        public void Compose(IDocumentContainer container)
        {
            container
                .Page(page =>
                {
                    page.MarginLeft(5);
                    page.MarginRight(2);
                    page.Size(new PageSize(810, 540).Landscape());
                    page.Content().Padding(0).Element(ComposeContent);
                });
        }

        void ComposeContent(IContainer container)
        {

            //container;
            var width = 799;
            var minHeight = ((int)(5.3 / 8.5 * width));
            container.Background(Colors.White).Padding(0).Box().PaddingTop(20).Width(width).MinHeight(minHeight).Border(1).BorderColor("#496479").Stack(stack =>
            {
                //header
                stack.Item().PaddingHorizontal(4).PaddingTop(4).Stack(s =>
                {
                    s.Item().AlignLeft().Text("ACCISURE MEMBERSHIP CARD", titleStyle);
                    s.Item().AlignLeft().Text("This card will be used as your unique identifier when in an emergency.", baseStyle.Italic(true));
                    s.Item().AlignLeft().Text("Always keep this card info close when commuting as a passenger.", baseStyle.Italic(true));
                    //s.Item().Text(" ", baseStyle);
                });

                //table
                var paddingh = 2;
                var paddingv = 2;
                stack.Item().PaddingHorizontal(4).PaddingTop(4).PaddingBottom(160).Decoration(decoration =>
                {
                    // header
                    decoration.Header().Row(row =>
                    {
                        row.RelativeColumn(cS[0]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text("TYPE", tableHeaderStyle);
                        row.RelativeColumn(cS[1]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text("MEMBER", tableHeaderStyle);
                        row.RelativeColumn(cS[2]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text("IDENTIFICATION NO", tableHeaderStyle);
                        row.RelativeColumn(cS[3]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text("CARD NO", tableHeaderStyle);
                    });

                    // content
                    decoration.Content().Stack(tableStack =>
                    {
                        var rowCount = 0;
                        foreach (var x in accisureCustomerCardDto)
                        {
                            tableStack.Item().ShowEntire().Row(row =>
                            {
                                row.RelativeColumn(cS[0]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text(x.Type, baseStyle);
                                row.RelativeColumn(cS[1]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text(x.FullName, baseStyle);
                                row.RelativeColumn(cS[2]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text(x.IdentificationNo, baseStyle);
                                row.RelativeColumn(cS[3]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text(x.CardNo, baseStyle);
                            });
                            rowCount += 1;
                        }
                        while (rowCount < 6)
                        {
                            tableStack.Item().ShowEntire().Row(row =>
                            {
                                row.RelativeColumn(cS[0]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text("", baseStyle);
                                row.RelativeColumn(cS[1]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text("", baseStyle);
                                row.RelativeColumn(cS[2]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text("", baseStyle);
                                row.RelativeColumn(cS[3]).PaddingHorizontal(paddingh).PaddingVertical(paddingv).Text("", baseStyle);
                            });
                            rowCount += 1;
                        }
                    });
                });

                //footer
                stack.Item().PaddingHorizontal(4).PaddingTop(4).PaddingBottom(4).Stack(s =>
                {
                    s.Item().Row(r =>
                    {
                        r.RelativeColumn(4).AlignMiddle().Stack(istack =>
                        {
                            //istack.Item().Text(" ", baseStyle);
                            istack.Item().Text("Emergency line:", baseStyle);
                            istack.Item().Text("Website:", baseStyle);
                            istack.Item().Text("General enquiries:", baseStyle);
                        });

                        r.RelativeColumn(8).AlignMiddle().AlignLeft().Stack(istack =>
                        {
                            //istack.Item().Text(" ", baseStyle);
                            istack.Item().Text("0861-ACCISURE (0861-22247873)", baseStyle);
                            istack.Item().Text("www.accisure.co.za", baseStyle);
                            istack.Item().Text("[email protected]", baseStyle);
                        });

                        r.RelativeColumn(2).AlignRight().AlignBottom().Stack(istack =>
                        {
                            istack.Item().Image(ImageAssets.AccisureLogoByteArray, ImageScaling.FitArea);
                        });
                    });
                });

            });

        }

    }
}```



I have tried fetching the file but I am not sure how to do this. I also tried Chat GPT but it doesnt seem to understand what I need done. 

Leave a Comment