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)