Files
octokit.net/Octokit/Models/Request/FormUrlEncodedParameters.cs
Brendan Forster 8cd0b341dd Begin implementation of Enterprise ManagementConsole API, redux (#2010)
* Initial implementation of ManagementConsole - maintenance mode

* Add environment var support for management console password for integration tests

* Add reactive client and unit tests

* Update some xmlDoc

* I think this is a better way to setup the underlying baseUri on IConneciton, to achieve managemet console access rather than requiring a specific GitHubClient that cant call normal API's
Instead, the management client methods can check the base Url and if it contains /api/v3/ they can set their relative endpoint Uri to include a leading "/" which will cause the /api/v3/ to be removed.

* Update EnterpriseClient.cs

Fix xml comments

* Update IEnterpriseClient.cs

Fix xml comments

* Still trying to get the xmDoc perfect, thanks app veyor :)

* XmlDoc'ing my way to success

* Add specific test attribute for management console tests

* check chronic string empty/null

* Use helper's password field in test

* Tidy up maintenance mode tests by using a context/destructor to manage the initial/end state of maintenance mode

* make internal and tidy up URL concatenation

* move GHE endpoint fixup inside ApiUrls methods

* Rework request object to be the correct structure so SimpleJsonSerializer can be used to serialize it.  Remove MaintenanceDate class and just pass in the Date/string for when
Still need to use UrlFormEncoding rather than json in the POST body though...

* Create abstract base class for FormUrlEncoded parameters (similar to existing RequetParameters) and inherit from it in UpdateMaintenanceRequest

* Fix maintenance context logic - destructor should always turn maintenance OFF regardless of initial requested state

* Fix xml comment

* Fix Xml comment

* Those pesky xml comments!

* Fine, I give up!

* Fix string.Format

* fix bad rebase

* fix failing convention tests

* restore missing whitespace

* writing some docs

* some edits

* edit
2019-09-22 15:09:56 -03:00

72 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Reflection;
using Octokit.Internal;
namespace Octokit
{
/// <summary>
/// Base class for classes which represent UrlFormEncoded parameters to certain API endpoints.
/// </summary>
public abstract class FormUrlEncodedParameters
{
/// <summary>
/// Converts the derived object into a UrlFormEncoded parameter string containing named parameters and their json serialized values
/// This format is required for particular API calls (eg the GitHub Enterprise Management Console API) that take a parameter formatted as json but not in the request body
/// </summary>
[SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings")]
public string ToFormUrlEncodedParameterString()
{
var parameters = new List<string>();
foreach (var prop in GetPropertyParametersForType(this.GetType()))
{
parameters.Add(string.Format(CultureInfo.InvariantCulture, "{0}={1}", prop.Key, prop.GetValue(this)));
}
return string.Join("&", parameters);
}
static List<JsonParameter> GetPropertyParametersForType(Type type)
{
return type.GetAllProperties()
.Where(p => p.Name != "DebuggerDisplay")
.Select(p => new JsonParameter(p))
.ToList();
}
class JsonParameter
{
readonly PropertyInfo _property;
public JsonParameter(PropertyInfo property)
{
_property = property;
Key = GetParameterKeyFromProperty(property);
}
public string Key { get; private set; }
public string GetValue(object instance)
{
var value = _property.GetValue(instance, null);
return value != null ? new SimpleJsonSerializer().Serialize(value) : null;
}
[SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase",
Justification = "GitHub API depends on lower case strings")]
static string GetParameterKeyFromProperty(PropertyInfo property)
{
var attribute = property.GetCustomAttributes(typeof(ParameterAttribute), false)
.Cast<ParameterAttribute>()
.FirstOrDefault(attr => attr.Key != null);
return attribute == null
? property.Name.ToLowerInvariant()
: attribute.Key;
}
}
}
}