public async Task <ActionResult <ContentStatistic> > GetStoreContentStatsAsync(string storeId)
        {
            var contentStorageProvider = _blobContentStorageProviderFactory.CreateProvider("");
            var cacheKey   = CacheKey.With(GetType(), "pagesCount", $"content-{storeId}");
            var pagesCount = _platformMemoryCache.GetOrCreateExclusive(cacheKey, cacheEntry =>
            {
                cacheEntry.AddExpirationToken(ContentCacheRegion.CreateChangeToken($"content-{storeId}"));
                var result = CountContentItemsRecursive(GetContentBasePath("pages", storeId), contentStorageProvider, GetContentBasePath("blogs", storeId));
                return(result);
            });
            var themesTask = contentStorageProvider.SearchAsync(GetContentBasePath("themes", storeId), null);
            var blogsTask  = contentStorageProvider.SearchAsync(GetContentBasePath("blogs", storeId), null);

            await Task.WhenAll(themesTask, blogsTask);

            var themes = themesTask.Result;
            var blogs  = blogsTask.Result;

            var retVal = new ContentStatistic
            {
                ActiveThemeName = "default",
                ThemesCount     = themes.Results.OfType <BlobFolder>().Count(),
                BlogsCount      = blogs.Results.OfType <BlobFolder>().Count(),
                PagesCount      = pagesCount
            };

            return(Ok(retVal));
        }
Example #2
0
        public async Task <ActionResult <ContentStatistic> > GetStoreContentStats(string storeId)
        {
            var contentStorageProvider = _blobContentStorageProviderFactory.CreateProvider("");
            var cacheKey   = CacheKey.With(GetType(), "pagesCount", $"content-{storeId}");
            var pagesCount = _platformMemoryCache.GetOrCreateExclusive(cacheKey, cacheEntry =>
            {
                cacheEntry.AddExpirationToken(ContentCacheRegion.CreateChangeToken($"content-{storeId}"));
                var result = CountContentItemsRecursive(GetContentBasePath("pages", storeId), contentStorageProvider, _blogsFolderName);
                return(result);
            });

            var storeTask  = _storeService.GetByIdAsync(storeId, StoreResponseGroup.DynamicProperties.ToString());
            var themesTask = contentStorageProvider.SearchAsync(GetContentBasePath("themes", storeId), null);
            var blogsTask  = contentStorageProvider.SearchAsync(GetContentBasePath(_blogsFolderName, storeId), null);

            await Task.WhenAll(themesTask, blogsTask, storeTask);

            var store  = storeTask.Result;
            var themes = themesTask.Result;
            var blogs  = blogsTask.Result;

            var retVal = new ContentStatistic
            {
                ActiveThemeName = store.DynamicProperties.FirstOrDefault(x => x.Name == "DefaultThemeName")?.Values?.FirstOrDefault()?.Value.ToString() ?? "default",
                ThemesCount     = themes.Results.OfType <BlobFolder>().Count(),
                BlogsCount      = blogs.Results.OfType <BlobFolder>().Count(),
                PagesCount      = pagesCount
            };

            return(Ok(retVal));
        }
        public async Task <ActionResult> DeleteContentAsync(string contentType, string storeId, [FromQuery] string[] urls)
        {
            var storageProvider = _blobContentStorageProviderFactory.CreateProvider(GetContentBasePath(contentType, storeId));
            await storageProvider.RemoveAsync(urls);

            //ToDo Reset cached items
            //_cacheManager.ClearRegion($"content-{storeId}");
            ContentCacheRegion.ExpireRegion();
            return(Ok());
        }
        public async Task <IActionResult> UploadContent(string contentType, string storeId, [FromQuery] string folderUrl, [FromQuery] string url = null)
        {
            if (url == null && !MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
            {
                return(BadRequest($"Expected a multipart request, but got {Request.ContentType}"));
            }

            var retVal          = new List <ContentFile>();
            var storageProvider = _blobContentStorageProviderFactory.CreateProvider(GetContentBasePath(contentType, storeId));

            if (url != null)
            {
                var fileName = HttpUtility.UrlDecode(Path.GetFileName(url));
                var fileUrl  = folderUrl + "/" + fileName;

                using (var client = new WebClient())
                    using (var blobStream = storageProvider.OpenWrite(fileUrl))
                        using (var remoteStream = client.OpenRead(url))
                        {
                            remoteStream.CopyTo(blobStream);

                            var сontentFile = AbstractTypeFactory <ContentFile> .TryCreateInstance();

                            сontentFile.Name = fileName;
                            сontentFile.Url  = storageProvider.GetAbsoluteUrl(fileUrl);
                            retVal.Add(сontentFile);
                        }
            }

            else
            {
                var boundary = MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue.Parse(Request.ContentType), _defaultFormOptions.MultipartBoundaryLengthLimit);
                var reader   = new MultipartReader(boundary, HttpContext.Request.Body);

                var section = await reader.ReadNextSectionAsync();

                if (section != null)
                {
                    var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition);

                    if (hasContentDispositionHeader)
                    {
                        var fileName = contentDisposition.FileName.Value ?? contentDisposition.Name.Value.Replace("\"", string.Empty);

                        var targetFilePath = folderUrl + "/" + fileName;

                        using (var targetStream = storageProvider.OpenWrite(targetFilePath))
                        {
                            await section.Body.CopyToAsync(targetStream);
                        }

                        var contentFile = AbstractTypeFactory <ContentFile> .TryCreateInstance();

                        contentFile.Name = fileName;
                        contentFile.Url  = storageProvider.GetAbsoluteUrl(targetFilePath);
                        retVal.Add(contentFile);
                    }
                }
            }

            ContentCacheRegion.ExpireContent(($"content-{storeId}"));

            return(Ok(retVal.ToArray()));
        }