From 31dc9b079b5804370fdb67a37582b9e771831080 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 27 May 2020 08:20:41 +0200 Subject: [PATCH] https://dev.azure.com/umbraco/D-Team%20Tracker/_workitems/edit/6587 - Moved PackageController and added VersionConverter on AngularJsonMediaTypeFormatter, instead of having single attribute only used for PackageController --- .../Controllers}/PackageController.cs | 115 ++++++++---------- .../AngularJsonMediaTypeFormatter.cs | 2 + 2 files changed, 50 insertions(+), 67 deletions(-) rename src/{Umbraco.Web/Editors => Umbraco.Web.BackOffice/Controllers}/PackageController.cs (50%) diff --git a/src/Umbraco.Web/Editors/PackageController.cs b/src/Umbraco.Web.BackOffice/Controllers/PackageController.cs similarity index 50% rename from src/Umbraco.Web/Editors/PackageController.cs rename to src/Umbraco.Web.BackOffice/Controllers/PackageController.cs index 6dc913237d..220d67f794 100644 --- a/src/Umbraco.Web/Editors/PackageController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/PackageController.cs @@ -1,65 +1,54 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; using System.Text; using System.Web; -using System.Web.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Net.Http.Headers; using Semver; using Umbraco.Core; -using Umbraco.Core.Cache; -using Umbraco.Core.Configuration; +using Umbraco.Core.Hosting; using Umbraco.Core.IO; -using Umbraco.Core.Logging; -using Umbraco.Core.Mapping; using Umbraco.Core.Models.Packaging; -using Umbraco.Core.Persistence; using Umbraco.Core.Services; -using Umbraco.Core.Strings; -using Umbraco.Web.Mvc; -using Umbraco.Web.Routing; -using Umbraco.Web.WebApi; -using Umbraco.Web.WebApi.Filters; +using Umbraco.Web.BackOffice.Filters; +using Umbraco.Web.Common.Attributes; +using Umbraco.Web.Common.Exceptions; +using Umbraco.Web.Editors; -namespace Umbraco.Web.Editors +namespace Umbraco.Web.BackOffice.Controllers { /// /// A controller used for managing packages in the back office /// [PluginController("UmbracoApi")] - [SerializeVersion] - [UmbracoApplicationAuthorize(Core.Constants.Applications.Packages)] + [TypeFilter(typeof(UmbracoApplicationAuthorizeAttribute), Arguments = new object[]{new string[]{Constants.Applications.Packages}})] public class PackageController : UmbracoAuthorizedJsonController { - private readonly IIOHelper _ioHelper; + private readonly IHostingEnvironment _hostingEnvironment; + private readonly IPackagingService _packagingService; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; public PackageController( - IGlobalSettings globalSettings, - IUmbracoContextAccessor umbracoContextAccessor, - ISqlContext sqlContext, - ServiceContext services, - AppCaches appCaches, - IProfilingLogger logger, - IRuntimeState runtimeState, - IShortStringHelper shortStringHelper, - UmbracoMapper umbracoMapper, - IIOHelper ioHelper, - IPublishedUrlProvider publishedUrlProvider) - : base(globalSettings, umbracoContextAccessor, sqlContext, services, appCaches, logger, runtimeState, shortStringHelper, umbracoMapper, publishedUrlProvider) + IHostingEnvironment hostingEnvironment, + IPackagingService packagingService, + IUmbracoContextAccessor umbracoContextAccessor) { - _ioHelper = ioHelper; + _hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment)); + _packagingService = packagingService ?? throw new ArgumentNullException(nameof(packagingService)); + _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); } public IEnumerable GetCreatedPackages() { - return Services.PackagingService.GetAllCreatedPackages(); + return _packagingService.GetAllCreatedPackages(); } public PackageDefinition GetCreatedPackageById(int id) { - var package = Services.PackagingService.GetCreatedPackageById(id); + var package = _packagingService.GetCreatedPackageById(id); if (package == null) throw new HttpResponseException(HttpStatusCode.NotFound); @@ -79,17 +68,16 @@ namespace Umbraco.Web.Editors public PackageDefinition PostSavePackage(PackageDefinition model) { if (ModelState.IsValid == false) - throw new HttpResponseException(Request.CreateValidationErrorResponse(ModelState)); + throw HttpResponseException.CreateValidationErrorResponse(ModelState); //save it - if (!Services.PackagingService.SaveCreatedPackage(model)) - throw new HttpResponseException( - Request.CreateNotificationValidationErrorResponse( + if (!_packagingService.SaveCreatedPackage(model)) + throw HttpResponseException.CreateNotificationValidationErrorResponse( model.Id == default ? $"A package with the name {model.Name} already exists" - : $"The package with id {model.Id} was not found")); + : $"The package with id {model.Id} was not found"); - Services.PackagingService.ExportCreatedPackage(model); + _packagingService.ExportCreatedPackage(model); //the packagePath will be on the model return model; @@ -102,55 +90,48 @@ namespace Umbraco.Web.Editors /// [HttpPost] [HttpDelete] - public IHttpActionResult DeleteCreatedPackage(int packageId) + public IActionResult DeleteCreatedPackage(int packageId) { - Services.PackagingService.DeleteCreatedPackage(packageId, Security.GetUserId().ResultOr(0)); + var umbracoContext = _umbracoContextAccessor.GetRequiredUmbracoContext(); + _packagingService.DeleteCreatedPackage(packageId, umbracoContext.Security.GetUserId().ResultOr(0)); return Ok(); } [HttpGet] - public HttpResponseMessage DownloadCreatedPackage(int id) + public IActionResult DownloadCreatedPackage(int id) { - var package = Services.PackagingService.GetCreatedPackageById(id); + var package = _packagingService.GetCreatedPackageById(id); if (package == null) - return Request.CreateResponse(HttpStatusCode.NotFound); + return NotFound(); - var fullPath = _ioHelper.MapPath(package.PackagePath); - if (!File.Exists(fullPath)) - return Request.CreateNotificationValidationErrorResponse("No file found for path " + package.PackagePath); + var fullPath = _hostingEnvironment.MapPathContentRoot(package.PackagePath); + if (!System.IO.File.Exists(fullPath)) + throw HttpResponseException.CreateNotificationValidationErrorResponse("No file found for path " + package.PackagePath); var fileName = Path.GetFileName(package.PackagePath); var encoding = Encoding.UTF8; - var response = new HttpResponseMessage + var cd = new System.Net.Mime.ContentDisposition { - Content = new StreamContent(File.OpenRead(fullPath)) - { - Headers = - { - ContentDisposition = new ContentDispositionHeaderValue("attachment") - { - FileName = HttpUtility.UrlEncode(fileName, encoding) - }, - ContentType = new MediaTypeHeaderValue("application/octet-stream") - { - CharSet = encoding.WebName - } - } - } + FileName = HttpUtility.UrlEncode(fileName, encoding), + Inline = false // false = prompt the user for downloading; true = browser to try to show the file inline }; - + Response.Headers.Add("Content-Disposition", cd.ToString()); // Set custom header so umbRequestHelper.downloadFile can save the correct filename - response.Headers.Add("x-filename", HttpUtility.UrlEncode(fileName, encoding)); + Response.Headers.Add("x-filename", HttpUtility.UrlEncode(fileName, encoding)); + return new FileStreamResult(System.IO.File.OpenRead(fullPath), new MediaTypeHeaderValue("application/octet-stream") + { + Charset = encoding.WebName, + + }); - return response; } public PackageDefinition GetInstalledPackageById(int id) { - var pack = Services.PackagingService.GetInstalledPackageById(id); + var pack = _packagingService.GetInstalledPackageById(id); if (pack == null) throw new HttpResponseException(HttpStatusCode.NotFound); return pack; } @@ -161,7 +142,7 @@ namespace Umbraco.Web.Editors /// public IEnumerable GetInstalled() { - return Services.PackagingService.GetAllInstalledPackages() + return _packagingService.GetAllInstalledPackages() .GroupBy( //group by name x => x.Name, diff --git a/src/Umbraco.Web.Common/Formatters/AngularJsonMediaTypeFormatter.cs b/src/Umbraco.Web.Common/Formatters/AngularJsonMediaTypeFormatter.cs index 9a10269398..5e400c78eb 100644 --- a/src/Umbraco.Web.Common/Formatters/AngularJsonMediaTypeFormatter.cs +++ b/src/Umbraco.Web.Common/Formatters/AngularJsonMediaTypeFormatter.cs @@ -3,6 +3,7 @@ using System.IO; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Formatters; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace Umbraco.Web.Common.Formatters { @@ -19,6 +20,7 @@ namespace Umbraco.Web.Common.Formatters public AngularJsonMediaTypeFormatter(JsonSerializerSettings serializerSettings, ArrayPool charPool, MvcOptions mvcOptions) : base(serializerSettings, charPool, mvcOptions) { + serializerSettings.Converters.Add(new VersionConverter()); } protected override JsonWriter CreateJsonWriter(TextWriter writer)