public async Task <AN.Core.Domain.Attachment> UploadInsuranceServiceAttachmentAsync(int insuranceServiceId, IFormFile photo)
        {
            var insuranceService = await _dbContext.InsuranceServices.FindAsync(insuranceServiceId);

            if (insuranceService == null)
            {
                throw new AwroNoreException("Shift Center Not Found");
            }

            AN.Core.Domain.Attachment attachment = null;

            var strategy = _dbContext.Database.CreateExecutionStrategy();

            await strategy.ExecuteAsync(async() =>
            {
                using (var transaction = _dbContext.Database.BeginTransaction())
                {
                    var originFileName  = photo.FileName;
                    var ext             = Path.GetExtension(originFileName);
                    var time            = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss-fffff");
                    var newFileName     = $"attach_{time}{ext}";
                    var thumbFileName   = $"attach_{time}.thumb{ext}";
                    var physicalDirPath = $"uploaded\\attachments\\insuranceservices\\{insuranceServiceId}";
                    var baseUrl         = $"/{physicalDirPath.Replace("\\", "/")}";

                    attachment = new AN.Core.Domain.Attachment
                    {
                        Owner        = AN.Core.Enums.FileOwner.INSURANCE_DOCUMENT,
                        OwnerTableId = insuranceServiceId,
                        CreatedAt    = DateTime.Now,
                        FileType     = AN.Core.Enums.FileType.Image,
                        IsDeleted    = false,
                        Url          = $"{baseUrl}/{newFileName}",
                        ThumbnailUrl = $"{baseUrl}/{thumbFileName}",
                        DeleteUrl    = $"{baseUrl}/{newFileName}",
                        Name         = newFileName,
                        Size         = photo.Length,
                        Description  = "Gallery Image",
                        Order        = 0
                    };

                    await _dbContext.Attachments.AddAsync(attachment);

                    if (!insuranceService.HasAttachments)
                    {
                        insuranceService.HasAttachments = true;

                        _dbContext.InsuranceServices.Attach(insuranceService);

                        _dbContext.Entry(insuranceService).State = EntityState.Modified;
                    }

                    await _dbContext.SaveChangesAsync();

                    var fullDirectoryPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", physicalDirPath);

                    if (!Directory.Exists(fullDirectoryPath))
                    {
                        Directory.CreateDirectory(fullDirectoryPath);
                    }

                    var path = Path.Combine(fullDirectoryPath, newFileName);
                    using (var stream = new FileStream(path, FileMode.Create))
                    {
                        await photo.CopyToAsync(stream);
                    }

                    var thumbPath = Path.Combine(fullDirectoryPath, thumbFileName);
                    using (var image = Image.FromFile(path))
                    {
                        Image thumb = image.GetThumbnailImage(120, 120, () => false, IntPtr.Zero);
                        thumb.Save(thumbPath);
                    }

                    transaction.Commit();
                }
            });

            return(attachment);
        }
        public async Task <AN.Core.Domain.Attachment> UploadPatientAttachmentAsync(int patientId, IFormFile file)
        {
            var patient = await _dbContext.Patients.FindAsync(patientId);

            if (patient == null)
            {
                throw new AwroNoreException("Patient Not Found");
            }

            AN.Core.Domain.Attachment attachment = null;

            var strategy = _dbContext.Database.CreateExecutionStrategy();

            await strategy.ExecuteAsync(async() =>
            {
                using (var transaction = _dbContext.Database.BeginTransaction())
                {
                    var(newName, thumbName, dirPath, baseUrl) = GeneratePatientAttachFileName(patientId, file);

                    attachment = new AN.Core.Domain.Attachment
                    {
                        Owner        = AN.Core.Enums.FileOwner.PATIENT,
                        OwnerTableId = patientId,
                        CreatedAt    = DateTime.Now,
                        FileType     = AN.Core.Enums.FileType.Image,
                        IsDeleted    = false,
                        Url          = $"{baseUrl}/{newName}",
                        ThumbnailUrl = $"{baseUrl}/{thumbName}",
                        DeleteUrl    = $"{baseUrl}/{newName}",
                        Name         = newName,
                        Size         = file.Length,
                        Description  = "Patient Attachment",
                        Order        = 0
                    };

                    await _dbContext.Attachments.AddAsync(attachment);

                    await _dbContext.SaveChangesAsync();

                    var fullDirectoryPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", dirPath);

                    if (!Directory.Exists(fullDirectoryPath))
                    {
                        Directory.CreateDirectory(fullDirectoryPath);
                    }

                    var path = Path.Combine(fullDirectoryPath, newName);
                    using (var stream = new FileStream(path, FileMode.Create))
                    {
                        await file.CopyToAsync(stream);
                    }

                    var thumbPath = Path.Combine(fullDirectoryPath, thumbName);
                    using (var image = Image.FromFile(path))
                    {
                        Image thumb = image.GetThumbnailImage(120, 120, () => false, IntPtr.Zero);
                        thumb.Save(thumbPath);
                    }

                    transaction.Commit();
                }
            });

            return(attachment);
        }