public async Task <byte[]> GetProjectThumbnailAsync(string userId, Guid projectId, int thumbnailSize)
        {
            using var log = BeginFunction(nameof(ProjectUserService), nameof(GetProjectThumbnailAsync), userId, projectId, thumbnailSize);
            try
            {
                await Assert(SecurityPolicy.IsAuthorized, userId).ConfigureAwait(false);

                var entry = await ProjectMicroService.GetProjectAsync(projectId).ConfigureAwait(false);

                var kit = ProjectLibraryKitUtility.CreateKit(entry);

                var renderer = new DesignRenderer();

                using var image = renderer.CreateBitmap(kit, thumbnailSize);
                using var ms    = new MemoryStream();

                image.Save(ms, ImageFormat.Png);
                var result = ms.ToArray();

                log.Result(string.Format("byte[{0}]", result.Length));
                return(result);
            }
            catch (Exception ex)
            {
                log.Exception(ex);
                throw;
            }
        }
        public async Task <byte[]> GetDesignThumbnailAsync(Guid designId, int thumbnailSize)
        {
            using var log = BeginFunction(nameof(DesignMicroService), nameof(GetDesignSnapshotThumbnailAsync), designId, thumbnailSize);
            try
            {
                using var ctx = QuiltContextFactory.Create();

                var dbDesign = await ctx.Designs.Where(r => r.DesignId == designId).SingleOrDefaultAsync().ConfigureAwait(false);

                if (dbDesign == null)
                {
                    return(null);
                }

                var dbDesignSnapshot = dbDesign.DesignSnapshots.Where(r => r.DesignSnapshotSequence == dbDesign.CurrentDesignSnapshotSequence).Single();

                var json   = JToken.Parse(dbDesignSnapshot.Artifact.Value);
                var design = new Design.Core.Design(json);

                //Logger.LogMessage("Artifact parsed.");

                var renderer = new DesignRenderer();

                using var image = renderer.CreateBitmap(design, thumbnailSize, false);
                using var ms    = new MemoryStream();

                image.Save(ms, ImageFormat.Png);
                var result = ms.ToArray();

                log.Result(result);
                return(result);
            }
            catch (Exception ex)
            {
                log.Exception(ex);
                throw;
            }
        }
        public async Task <byte[]> GetBlockThumbnailAsync(string blockId, int thumbnailSize)
        {
            using var log = BeginFunction(nameof(DesignMicroService), nameof(GetBlockThumbnailAsync), blockId, thumbnailSize);
            try
            {
                await Task.CompletedTask;

                var provider = new DatabaseBlockComponentProvider(QuiltContextFactory);
                var entry    = provider.GetComponent(BlockComponent.TypeName, Constants.DefaultComponentCategory, blockId);

                var node = entry.Component.Expand(true);

                var blockDimension     = new Dimension(1, DimensionUnits.Inch);
                var thumbnailDimension = new Dimension(thumbnailSize, DimensionUnits.Pixel);
                var scale = new DimensionScale(1, DimensionUnits.Inch, thumbnailSize, DimensionUnits.Pixel);

                var pageLayoutNode = new PageLayoutNode(blockDimension * scale, blockDimension * scale);
                pageLayoutNode.LayoutSites[0].Node = node;
                pageLayoutNode.UpdateBounds(PathOrientation.CreateDefault(), scale);

                var renderer = new DesignRenderer();
                using var image = renderer.CreateBitmap(node, DimensionScale.CreateIdentity(DimensionUnits.Pixel), false);

                using var ms = new MemoryStream();
                image.Save(ms, ImageFormat.Png);

                var result = ms.ToArray();

                log.Result(result);

                return(result);
            }
            catch (Exception ex)
            {
                log.Exception(ex);
                throw;
            }
        }