From a06d271725f6e746d9a970f29283ab8f3ebae607 Mon Sep 17 00:00:00 2001
From: crobibero <cody@robibe.ro>
Date: Wed, 22 Apr 2020 13:07:21 -0600
Subject: [PATCH] Move ConfigurationService to Jellyfin.Api

---
 .../Controllers/ConfigurationController.cs    | 128 +++++++++++++++
 .../ConfigurationDtos/MediaEncoderPathDto.cs  |  18 +++
 MediaBrowser.Api/ConfigurationService.cs      | 146 ------------------
 3 files changed, 146 insertions(+), 146 deletions(-)
 create mode 100644 Jellyfin.Api/Controllers/ConfigurationController.cs
 create mode 100644 Jellyfin.Api/Models/ConfigurationDtos/MediaEncoderPathDto.cs
 delete mode 100644 MediaBrowser.Api/ConfigurationService.cs

diff --git a/Jellyfin.Api/Controllers/ConfigurationController.cs b/Jellyfin.Api/Controllers/ConfigurationController.cs
new file mode 100644
index 0000000000..14e45833f0
--- /dev/null
+++ b/Jellyfin.Api/Controllers/ConfigurationController.cs
@@ -0,0 +1,128 @@
+#nullable enable
+
+using System.Threading.Tasks;
+using Jellyfin.Api.Models.ConfigurationDtos;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Controller.Net;
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Serialization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
+
+namespace Jellyfin.Api.Controllers
+{
+    /// <summary>
+    /// Configuration Controller.
+    /// </summary>
+    [Route("System")]
+    [Authenticated]
+    public class ConfigurationController : BaseJellyfinApiController
+    {
+        private readonly IServerConfigurationManager _configurationManager;
+        private readonly IMediaEncoder _mediaEncoder;
+        private readonly IJsonSerializer _jsonSerializer;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ConfigurationController"/> class.
+        /// </summary>
+        /// <param name="configurationManager">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
+        /// <param name="mediaEncoder">Instance of the <see cref="IMediaEncoder"/> interface.</param>
+        /// <param name="jsonSerializer">Instance of the <see cref="IJsonSerializer"/> interface.</param>
+        public ConfigurationController(
+            IServerConfigurationManager configurationManager,
+            IMediaEncoder mediaEncoder,
+            IJsonSerializer jsonSerializer)
+        {
+            _configurationManager = configurationManager;
+            _mediaEncoder = mediaEncoder;
+            _jsonSerializer = jsonSerializer;
+        }
+
+        /// <summary>
+        /// Gets application configuration.
+        /// </summary>
+        /// <returns>Application configuration.</returns>
+        [HttpGet("Configuration")]
+        [ProducesResponseType(StatusCodes.Status200OK)]
+        public ActionResult<ServerConfiguration> GetConfiguration()
+        {
+            return Ok(_configurationManager.Configuration);
+        }
+
+        /// <summary>
+        /// Updates application configuration.
+        /// </summary>
+        /// <param name="configuration">Configuration.</param>
+        /// <returns>Status.</returns>
+        [HttpPost("Configuration")]
+        [Authenticated(Roles = "Admin")]
+        [ProducesResponseType(StatusCodes.Status200OK)]
+        public ActionResult UpdateConfiguration([FromBody, BindRequired] ServerConfiguration configuration)
+        {
+            _configurationManager.ReplaceConfiguration(configuration);
+            return Ok();
+        }
+
+        /// <summary>
+        /// Gets a named configuration.
+        /// </summary>
+        /// <param name="key">Configuration key.</param>
+        /// <returns>Configuration.</returns>
+        [HttpGet("Configuration/{Key}")]
+        [ProducesResponseType(StatusCodes.Status200OK)]
+        public ActionResult<object> GetNamedConfiguration([FromRoute] string key)
+        {
+            return Ok(_configurationManager.GetConfiguration(key));
+        }
+
+        /// <summary>
+        /// Updates named configuration.
+        /// </summary>
+        /// <param name="key">Configuration key.</param>
+        /// <returns>Status.</returns>
+        [HttpPost("Configuration/{Key}")]
+        [Authenticated(Roles = "Admin")]
+        [ProducesResponseType(StatusCodes.Status200OK)]
+        public async Task<ActionResult> UpdateNamedConfiguration([FromRoute] string key)
+        {
+            var configurationType = _configurationManager.GetConfigurationType(key);
+            /*
+            // TODO switch to System.Text.Json when https://github.com/dotnet/runtime/issues/30255 is fixed.
+            var configuration = await JsonSerializer.DeserializeAsync(Request.Body, configurationType);
+            */
+
+            var configuration = await _jsonSerializer.DeserializeFromStreamAsync(Request.Body, configurationType)
+                .ConfigureAwait(false);
+            _configurationManager.SaveConfiguration(key, configuration);
+            return Ok();
+        }
+
+        /// <summary>
+        /// Gets a default MetadataOptions object.
+        /// </summary>
+        /// <returns>MetadataOptions.</returns>
+        [HttpGet("Configuration/MetadataOptions/Default")]
+        [Authenticated(Roles = "Admin")]
+        [ProducesResponseType(StatusCodes.Status200OK)]
+        public ActionResult<MetadataOptions> GetDefaultMetadataOptions()
+        {
+            return Ok(new MetadataOptions());
+        }
+
+        /// <summary>
+        /// Updates the path to the media encoder.
+        /// </summary>
+        /// <param name="mediaEncoderPath">Media encoder path form body.</param>
+        /// <returns>Status.</returns>
+        [HttpPost("MediaEncoder/Path")]
+        [Authenticated(Roles = "Admin", AllowBeforeStartupWizard = true)]
+        [ProducesResponseType(StatusCodes.Status200OK)]
+        public ActionResult UpdateMediaEncoderPath([FromForm, BindRequired] MediaEncoderPathDto mediaEncoderPath)
+        {
+            _mediaEncoder.UpdateEncoderPath(mediaEncoderPath.Path, mediaEncoderPath.PathType);
+            return Ok();
+        }
+    }
+}
diff --git a/Jellyfin.Api/Models/ConfigurationDtos/MediaEncoderPathDto.cs b/Jellyfin.Api/Models/ConfigurationDtos/MediaEncoderPathDto.cs
new file mode 100644
index 0000000000..b05e0cdf5a
--- /dev/null
+++ b/Jellyfin.Api/Models/ConfigurationDtos/MediaEncoderPathDto.cs
@@ -0,0 +1,18 @@
+namespace Jellyfin.Api.Models.ConfigurationDtos
+{
+    /// <summary>
+    /// Media Encoder Path Dto.
+    /// </summary>
+    public class MediaEncoderPathDto
+    {
+        /// <summary>
+        /// Gets or sets media encoder path.
+        /// </summary>
+        public string Path { get; set; }
+
+        /// <summary>
+        /// Gets or sets media encoder path type.
+        /// </summary>
+        public string PathType { get; set; }
+    }
+}
diff --git a/MediaBrowser.Api/ConfigurationService.cs b/MediaBrowser.Api/ConfigurationService.cs
deleted file mode 100644
index 316be04a03..0000000000
--- a/MediaBrowser.Api/ConfigurationService.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-using System.IO;
-using System.Threading.Tasks;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.MediaEncoding;
-using MediaBrowser.Controller.Net;
-using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Serialization;
-using MediaBrowser.Model.Services;
-using Microsoft.Extensions.Logging;
-
-namespace MediaBrowser.Api
-{
-    /// <summary>
-    /// Class GetConfiguration
-    /// </summary>
-    [Route("/System/Configuration", "GET", Summary = "Gets application configuration")]
-    [Authenticated]
-    public class GetConfiguration : IReturn<ServerConfiguration>
-    {
-
-    }
-
-    [Route("/System/Configuration/{Key}", "GET", Summary = "Gets a named configuration")]
-    [Authenticated(AllowBeforeStartupWizard = true)]
-    public class GetNamedConfiguration
-    {
-        [ApiMember(Name = "Key", Description = "Key", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public string Key { get; set; }
-    }
-
-    /// <summary>
-    /// Class UpdateConfiguration
-    /// </summary>
-    [Route("/System/Configuration", "POST", Summary = "Updates application configuration")]
-    [Authenticated(Roles = "Admin")]
-    public class UpdateConfiguration : ServerConfiguration, IReturnVoid
-    {
-    }
-
-    [Route("/System/Configuration/{Key}", "POST", Summary = "Updates named configuration")]
-    [Authenticated(Roles = "Admin")]
-    public class UpdateNamedConfiguration : IReturnVoid, IRequiresRequestStream
-    {
-        [ApiMember(Name = "Key", Description = "Key", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public string Key { get; set; }
-
-        public Stream RequestStream { get; set; }
-    }
-
-    [Route("/System/Configuration/MetadataOptions/Default", "GET", Summary = "Gets a default MetadataOptions object")]
-    [Authenticated(Roles = "Admin")]
-    public class GetDefaultMetadataOptions : IReturn<MetadataOptions>
-    {
-
-    }
-
-    [Route("/System/MediaEncoder/Path", "POST", Summary = "Updates the path to the media encoder")]
-    [Authenticated(Roles = "Admin", AllowBeforeStartupWizard = true)]
-    public class UpdateMediaEncoderPath : IReturnVoid
-    {
-        [ApiMember(Name = "Path", Description = "Path", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public string Path { get; set; }
-        [ApiMember(Name = "PathType", Description = "PathType", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public string PathType { get; set; }
-    }
-
-    public class ConfigurationService : BaseApiService
-    {
-        /// <summary>
-        /// The _json serializer
-        /// </summary>
-        private readonly IJsonSerializer _jsonSerializer;
-
-        /// <summary>
-        /// The _configuration manager
-        /// </summary>
-        private readonly IServerConfigurationManager _configurationManager;
-
-        private readonly IMediaEncoder _mediaEncoder;
-
-        public ConfigurationService(
-            ILogger<ConfigurationService> logger,
-            IServerConfigurationManager serverConfigurationManager,
-            IHttpResultFactory httpResultFactory,
-            IJsonSerializer jsonSerializer,
-            IServerConfigurationManager configurationManager,
-            IMediaEncoder mediaEncoder)
-            : base(logger, serverConfigurationManager, httpResultFactory)
-        {
-            _jsonSerializer = jsonSerializer;
-            _configurationManager = configurationManager;
-            _mediaEncoder = mediaEncoder;
-        }
-
-        public void Post(UpdateMediaEncoderPath request)
-        {
-            _mediaEncoder.UpdateEncoderPath(request.Path, request.PathType);
-        }
-
-        /// <summary>
-        /// Gets the specified request.
-        /// </summary>
-        /// <param name="request">The request.</param>
-        /// <returns>System.Object.</returns>
-        public object Get(GetConfiguration request)
-        {
-            return ToOptimizedResult(_configurationManager.Configuration);
-        }
-
-        public object Get(GetNamedConfiguration request)
-        {
-            var result = _configurationManager.GetConfiguration(request.Key);
-
-            return ToOptimizedResult(result);
-        }
-
-        /// <summary>
-        /// Posts the specified configuraiton.
-        /// </summary>
-        /// <param name="request">The request.</param>
-        public void Post(UpdateConfiguration request)
-        {
-            // Silly, but we need to serialize and deserialize or the XmlSerializer will write the xml with an element name of UpdateConfiguration
-            var json = _jsonSerializer.SerializeToString(request);
-
-            var config = _jsonSerializer.DeserializeFromString<ServerConfiguration>(json);
-
-            _configurationManager.ReplaceConfiguration(config);
-        }
-
-        public async Task Post(UpdateNamedConfiguration request)
-        {
-            var key = GetPathValue(2).ToString();
-
-            var configurationType = _configurationManager.GetConfigurationType(key);
-            var configuration = await _jsonSerializer.DeserializeFromStreamAsync(request.RequestStream, configurationType).ConfigureAwait(false);
-
-            _configurationManager.SaveConfiguration(key, configuration);
-        }
-
-        public object Get(GetDefaultMetadataOptions request)
-        {
-            return ToOptimizedResult(new MetadataOptions());
-        }
-    }
-}