Spotify.NET/SpotifyAPI.Web/Models/Request/RequestParams.cs

92 lines
2.5 KiB
C#
Raw Normal View History

2020-05-01 19:05:28 +01:00
using System.Reflection;
using System;
using System.Linq;
using System.Collections.Generic;
2020-05-02 21:48:21 +01:00
using System.Collections;
using Newtonsoft.Json.Linq;
2020-05-01 19:05:28 +01:00
namespace SpotifyAPI.Web
{
public abstract class RequestParams
{
2020-05-02 21:48:21 +01:00
public JObject BuildBodyParams()
{
// Make sure everything is okay before building query params
CustomEnsure();
var bodyProps = GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)
.Where(prop => prop.GetCustomAttributes(typeof(BodyParamAttribute), true).Length > 0);
var obj = new JObject();
foreach (var prop in bodyProps)
{
var attribute = prop.GetCustomAttribute(typeof(BodyParamAttribute)) as BodyParamAttribute;
object value = prop.GetValue(this);
if (value != null)
{
obj[attribute.Key ?? prop.Name] = JToken.FromObject(value);
}
}
return obj;
}
2020-05-01 19:05:28 +01:00
public Dictionary<string, string> BuildQueryParams()
{
// Make sure everything is okay before building query params
2020-05-02 21:48:21 +01:00
CustomEnsure();
2020-05-02 13:58:11 +01:00
var queryProps = GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)
2020-05-01 19:05:28 +01:00
.Where(prop => prop.GetCustomAttributes(typeof(QueryParamAttribute), true).Length > 0);
var queryParams = new Dictionary<string, string>();
foreach (var prop in queryProps)
{
var attribute = prop.GetCustomAttribute(typeof(QueryParamAttribute)) as QueryParamAttribute;
object value = prop.GetValue(this);
2020-05-01 19:05:28 +01:00
if (value != null)
{
2020-05-02 21:48:21 +01:00
if (value is List<string>)
{
List<string> list = value as List<string>;
var str = string.Join(",", list);
queryParams.Add(attribute.Key ?? prop.Name, str);
}
else
{
queryParams.Add(attribute.Key ?? prop.Name, value.ToString());
}
2020-05-01 19:05:28 +01:00
}
}
AddCustomQueryParams(queryParams);
2020-05-01 19:05:28 +01:00
return queryParams;
}
2020-05-02 21:48:21 +01:00
protected virtual void CustomEnsure() { }
protected virtual void AddCustomQueryParams(Dictionary<string, string> queryParams) { }
2020-05-01 19:05:28 +01:00
}
public class QueryParamAttribute : Attribute
{
2020-05-02 13:58:11 +01:00
public string Key { get; }
2020-05-01 19:05:28 +01:00
public QueryParamAttribute() { }
public QueryParamAttribute(string key)
{
Key = key;
}
}
public class BodyParamAttribute : Attribute
{
2020-05-02 21:48:21 +01:00
public string Key { get; }
2020-05-01 19:05:28 +01:00
public BodyParamAttribute() { }
2020-05-02 21:48:21 +01:00
public BodyParamAttribute(string key)
{
Key = key;
}
2020-05-01 19:05:28 +01:00
}
}