Changed command structure to reduce repetition

This commit is contained in:
Rikki Tooley 2013-09-01 20:52:44 +01:00
parent 73e1831986
commit db00dfd8ed
23 changed files with 150 additions and 243 deletions

View File

@ -19,16 +19,11 @@ public AddShoutCommand(IAuth auth, string album, string artist, string message)
Message = message;
}
public async override Task<LastResponse> ExecuteAsync()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"album", Album},
{"artist", Artist},
{"message", Message}
};
return await ExecuteInternal(parameters);
Parameters.Add("album", Album);
Parameters.Add("artist", Artist);
Parameters.Add("message", Message);
}
public async override Task<LastResponse> HandleResponse(HttpResponseMessage response)

View File

@ -23,19 +23,13 @@ public GetAlbumInfoCommand(IAuth auth, string artistname, string albumname) : ba
AlbumName = albumname;
}
public override Uri BuildRequestUrl()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"artist", Uri.EscapeDataString(ArtistName)},
{"album", Uri.EscapeDataString(AlbumName)},
{"autocorrect", Convert.ToInt32(Autocorrect).ToString()}
};
Parameters.Add("artist", ArtistName);
Parameters.Add("album", AlbumName);
Parameters.Add("autocorrect", Convert.ToInt32(Autocorrect).ToString());
base.DisableCaching(parameters);
var apiUrl = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters);
return new Uri(apiUrl, UriKind.Absolute);
base.DisableCaching();
}
public async override Task<LastResponse<Album>> HandleResponse(HttpResponseMessage response)

View File

@ -25,22 +25,16 @@ public GetAlbumShoutsCommand(IAuth auth, string albumname, string artistname)
ArtistName = artistname;
}
public override Uri BuildRequestUrl()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"album", Uri.EscapeDataString(AlbumName)},
{"artist", Uri.EscapeDataString(ArtistName)},
{"autocorrect", Convert.ToInt32(Autocorrect).ToString()}
};
Parameters.Add("album", AlbumName);
Parameters.Add("artist", ArtistName);
Parameters.Add("autocorrect", Convert.ToInt32(Autocorrect).ToString());
base.AddPagingParameters(parameters);
base.DisableCaching(parameters);
var apiUrl = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters);
return new Uri(apiUrl, UriKind.Absolute);
base.AddPagingParameters();
base.DisableCaching();
}
public async override Task<PageResponse<Shout>> HandleResponse(HttpResponseMessage response)
{
string json = await response.Content.ReadAsStringAsync();

View File

@ -17,15 +17,10 @@ public AddShoutCommand(IAuth auth, string artist, string message) : base(auth)
Message = message;
}
public async override Task<LastResponse> ExecuteAsync()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"artist", Artist},
{"message", Message}
};
return await ExecuteInternal(parameters);
Parameters.Add("artist", Artist);
Parameters.Add("message", Message);
}
public async override Task<LastResponse> HandleResponse(HttpResponseMessage response)

View File

@ -24,18 +24,15 @@ public GetArtistInfoCommand(IAuth auth, string artistname)
ArtistName = artistname;
}
public override Uri BuildRequestUrl()
/// <summary>
/// TODO Bio language
/// </summary>
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"artist", Uri.EscapeDataString(ArtistName)},
{"autocorrect", Convert.ToInt32(Autocorrect).ToString()}
};
Parameters.Add("artist", ArtistName);
Parameters.Add("autocorrect", Convert.ToInt32(Autocorrect).ToString());
base.DisableCaching(parameters);
var apiUrl = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters);
return new Uri(apiUrl, UriKind.Absolute);
base.DisableCaching();
}
public async override Task<LastResponse<Artist>> HandleResponse(HttpResponseMessage response)

View File

@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Enums;
@ -11,7 +9,7 @@
namespace IF.Lastfm.Core.Api.Commands.ArtistApi
{
internal class GetArtistShoutsCommand : GetAsyncCommandBase<PageResponse<Shout>>
public class GetArtistShoutsCommand : GetAsyncCommandBase<PageResponse<Shout>>
{
public string ArtistName { get; set; }
public bool Autocorrect { get; set; }
@ -23,22 +21,16 @@ public GetArtistShoutsCommand(IAuth auth, string artistname)
ArtistName = artistname;
}
public override Uri BuildRequestUrl()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"artist", Uri.EscapeDataString(ArtistName)},
{"autocorrect", Convert.ToInt32(Autocorrect).ToString()}
};
Parameters.Add("artist", ArtistName);
Parameters.Add("autocorrect", Convert.ToInt32(Autocorrect).ToString());
base.AddPagingParameters(parameters);
base.DisableCaching(parameters);
var apiUrl = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters);
return new Uri(apiUrl, UriKind.Absolute);
base.AddPagingParameters();
base.DisableCaching();
}
public async override Task<PageResponse<Shout>> HandleResponse(HttpResponseMessage response)
public override async Task<PageResponse<Shout>> HandleResponse(HttpResponseMessage response)
{
string json = await response.Content.ReadAsStringAsync();
@ -54,7 +46,5 @@ public async override Task<PageResponse<Shout>> HandleResponse(HttpResponseMessa
return PageResponse<Shout>.CreateErrorResponse(error);
}
}
}
}

View File

@ -1,29 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace IF.Lastfm.Core.Api.Commands
{
internal abstract class GetAsyncCommandBase<T> : IAsyncCommand<T>
{
public string Method { get; protected set; }
public Uri Url { get; protected set; }
public IAuth Auth { get; protected set; }
public int Page { get; set; }
public int Count { get; set; }
public abstract class GetAsyncCommandBase<T> : LastAsyncCommandBase<T>
{
protected GetAsyncCommandBase(IAuth auth)
{
Auth = auth;
}
public abstract Uri BuildRequestUrl();
public async Task<T> ExecuteAsync()
public async override Task<T> ExecuteAsync()
{
SetParameters();
EscapeParameters();
Url = BuildRequestUrl();
var httpClient = new HttpClient();
@ -31,22 +26,18 @@ public async Task<T> ExecuteAsync()
return await HandleResponse(response);
}
public abstract Task<T> HandleResponse(HttpResponseMessage response);
protected void AddPagingParameters(Dictionary<string, string> parameters)
protected override Uri BuildRequestUrl()
{
parameters.Add("page", Page.ToString());
parameters.Add("limit", Count.ToString());
var apiUrl = LastFm.FormatApiUrl(Method, Auth.ApiKey, Parameters);
return new Uri(apiUrl, UriKind.Absolute);
}
/// <summary>
/// Annoying workaround for Windows Phone's caching...
/// see http://stackoverflow.com/questions/6334788/windows-phone-7-webrequest-caching
/// </summary>
/// <param name="parameters"></param>
protected void DisableCaching(Dictionary<string, string> parameters)
private void EscapeParameters()
{
parameters.Add("disablecachetoken", DateTime.UtcNow.Ticks.ToString());
foreach (var key in Parameters.Keys.ToList())
{
Parameters[key] = Uri.EscapeDataString(Parameters[key]);
}
}
}
}

View File

@ -1,13 +1,9 @@
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Threading.Tasks;
namespace IF.Lastfm.Core.Api.Commands
{
internal interface IAsyncCommand<T>
{
Uri BuildRequestUrl();
Task<T> ExecuteAsync();
Task<T> HandleResponse(HttpResponseMessage response);
}
}

View File

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
namespace IF.Lastfm.Core.Api.Commands
{
public abstract class LastAsyncCommandBase<T> : IAsyncCommand<T>
{
public string Method { get; protected set; }
public Uri Url { get; protected set; }
public IAuth Auth { get; protected set; }
public int Page { get; set; }
public int Count { get; set; }
protected Dictionary<string, string> Parameters { get; set; }
protected LastAsyncCommandBase()
{
Parameters = new Dictionary<string, string>();
}
public abstract void SetParameters();
protected abstract Uri BuildRequestUrl();
public abstract Task<T> ExecuteAsync();
public abstract Task<T> HandleResponse(HttpResponseMessage response);
protected void AddPagingParameters()
{
Parameters.Add("page", Page.ToString());
Parameters.Add("limit", Count.ToString());
}
/// <summary>
/// Annoying workaround for Windows Phone's caching...
/// see http://stackoverflow.com/questions/6334788/windows-phone-7-webrequest-caching
/// </summary>
protected void DisableCaching()
{
Parameters.Add("disablecachetoken", DateTime.UtcNow.Ticks.ToString());
}
}
}

View File

@ -5,51 +5,36 @@
namespace IF.Lastfm.Core.Api.Commands
{
internal abstract class PostAsyncCommandBase<T> : IAsyncCommand<T>
internal abstract class PostAsyncCommandBase<T> : LastAsyncCommandBase<T>
{
public string Method { get; protected set; }
public Uri Url { get; private set; }
public IAuth Auth { get; protected set; }
public int Page { get; set; }
public int Count { get; set; }
protected PostAsyncCommandBase(IAuth auth)
{
Auth = auth;
}
public Uri BuildRequestUrl()
protected override Uri BuildRequestUrl()
{
return new Uri(LastFm.ApiRoot, UriKind.Absolute);
}
public abstract Task<T> ExecuteAsync();
protected async Task<T> ExecuteInternal(Dictionary<string, string> parameters)
public override async Task<T> ExecuteAsync()
{
SetParameters();
Url = BuildRequestUrl();
parameters.Add("sk", Auth.User.Token);
Parameters.Add("sk", Auth.User.Token);
var apisig = Auth.GenerateMethodSignature(Method, parameters);
var apisig = Auth.GenerateMethodSignature(Method, Parameters);
var postContent = LastFm.CreatePostBody(Method,
Auth.ApiKey,
apisig,
parameters);
Parameters);
var httpClient = new HttpClient();
var response = await httpClient.PostAsync(Url, postContent);
return await HandleResponse(response);
}
public abstract Task<T> HandleResponse(HttpResponseMessage response);
protected void AddPagingParameters(Dictionary<string, string> parameters)
{
parameters.Add("page", Page.ToString());
parameters.Add("limit", Count.ToString());
}
}
}

View File

@ -1,5 +1,4 @@
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Helpers;
@ -19,16 +18,11 @@ public AddShoutCommand(IAuth auth, string track, string artist, string message)
Message = message;
}
public async override Task<LastResponse> ExecuteAsync()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"track", Track},
{"artist", Artist},
{"message", Message}
};
return await ExecuteInternal(parameters);
Parameters.Add("track", Track);
Parameters.Add("artist", Artist);
Parameters.Add("message", Message);
}
public async override Task<LastResponse> HandleResponse(HttpResponseMessage response)

View File

@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Api.Helpers;
@ -27,24 +24,16 @@ public GetTrackInfoCommand(IAuth auth, string trackname, string artistname)
ArtistName = artistname;
}
public override Uri BuildRequestUrl()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"track", Uri.EscapeDataString(TrackName)},
{"artist", Uri.EscapeDataString(ArtistName)},
{"autocorrect", Convert.ToInt32(Autocorrect).ToString()}
};
Parameters.Add("track", TrackName);
Parameters.Add("artist", ArtistName);
Parameters.Add("autocorrect", Convert.ToInt32(Autocorrect).ToString());
if (!string.IsNullOrWhiteSpace(Username))
{
parameters.Add("username", Username);
Parameters.Add("username", Username);
}
DisableCaching(parameters);
var apiUrl = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters);
return new Uri(apiUrl, UriKind.Absolute);
}
public async override Task<LastResponse<Track>> HandleResponse(HttpResponseMessage response)

View File

@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Api.Helpers;
@ -25,20 +22,14 @@ public GetTrackShoutsCommand(IAuth auth, string trackname, string artistname) :
ArtistName = artistname;
}
public override Uri BuildRequestUrl()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"track", Uri.EscapeDataString(TrackName)},
{"artist", Uri.EscapeDataString(ArtistName)},
{"autocorrect", Convert.ToInt32(Autocorrect).ToString()}
};
Parameters.Add("track", TrackName);
Parameters.Add("artist", ArtistName);
Parameters.Add("autocorrect", Convert.ToInt32(Autocorrect).ToString());
base.AddPagingParameters(parameters);
base.DisableCaching(parameters);
var apiUrl = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters);
return new Uri(apiUrl, UriKind.Absolute);
AddPagingParameters();
DisableCaching();
}
public async override Task<PageResponse<Shout>> HandleResponse(HttpResponseMessage response)

View File

@ -20,15 +20,10 @@ public LoveTrackCommand(IAuth auth, string trackname, string artistname)
ArtistName = artistname;
}
public async override Task<LastResponse> ExecuteAsync()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"track", TrackName},
{"artist", ArtistName}
};
return await ExecuteInternal(parameters);
Parameters.Add("track", TrackName);
Parameters.Add("artist", ArtistName);
}
public async override Task<LastResponse> HandleResponse(HttpResponseMessage response)

View File

@ -20,15 +20,10 @@ public UnloveTrackCommand(IAuth auth, string trackname, string artistname)
ArtistName = artistname;
}
public async override Task<LastResponse> ExecuteAsync()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"track", TrackName},
{"artist", ArtistName}
};
return await ExecuteInternal(parameters);
Parameters.Add("track", TrackName);
Parameters.Add("artist", ArtistName);
}
public async override Task<LastResponse> HandleResponse(HttpResponseMessage response)

View File

@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Api.Helpers;
namespace IF.Lastfm.Core.Api.Commands.UserApi
@ -19,15 +16,10 @@ public AddShoutCommand(IAuth auth, string recipient, string message) : base(auth
Message = message;
}
public async override Task<LastResponse> ExecuteAsync()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"user", Recipient},
{"message", Message}
};
return await ExecuteInternal(parameters);
Parameters.Add("user", Recipient);
Parameters.Add("message", Message);
}
public async override Task<LastResponse> HandleResponse(HttpResponseMessage response)

View File

@ -22,19 +22,13 @@ public GetRecentScrobblesCommand(IAuth auth, string username, DateTime from) : b
From = from;
}
public override Uri BuildRequestUrl()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"user", Uri.EscapeDataString(Username)},
{"from", From.ToUnixTimestamp().ToString()}
};
Parameters.Add("user", Username);
Parameters.Add("from", From.ToUnixTimestamp().ToString());
base.AddPagingParameters(parameters);
base.DisableCaching(parameters);
var uristring = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters);
return new Uri(uristring, UriKind.Absolute);
AddPagingParameters();
DisableCaching();
}
public async override Task<PageResponse<Track>> HandleResponse(HttpResponseMessage response)

View File

@ -21,16 +21,11 @@ public GetRecentStationsCommand(IAuth auth, string username) : base(auth)
Username = username;
}
public async override Task<PageResponse<Station>> ExecuteAsync()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"user", Username}
};
Parameters.Add("user", Username);
AddPagingParameters(parameters);
return await ExecuteInternal(parameters);
AddPagingParameters();
}
public async override Task<PageResponse<Station>> HandleResponse(HttpResponseMessage response)

View File

@ -23,19 +23,13 @@ public GetTopAlbumsCommand(IAuth auth, string username, LastStatsTimeSpan span)
TimeSpan = span;
}
public override Uri BuildRequestUrl()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"username", Uri.EscapeDataString(Username)},
{"period", TimeSpan.GetApiName()}
};
Parameters.Add("username", Username);
Parameters.Add("period", TimeSpan.GetApiName());
base.AddPagingParameters(parameters);
base.DisableCaching(parameters);
var uristring = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters);
return new Uri(uristring, UriKind.Absolute);
AddPagingParameters();
DisableCaching();
}
public async override Task<PageResponse<Album>> HandleResponse(HttpResponseMessage response)

View File

@ -20,19 +20,13 @@ public GetUserInfoCommand(IAuth auth, string username) : base(auth)
Username = username;
}
public override Uri BuildRequestUrl()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"user", Uri.EscapeDataString(Username)}
};
Parameters.Add("user", Username);
base.DisableCaching(parameters);
var uristring = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters);
return new Uri(uristring, UriKind.Absolute);
DisableCaching();
}
public async override Task<LastResponse<User>> HandleResponse(HttpResponseMessage response)
{
string json = await response.Content.ReadAsStringAsync();

View File

@ -1,5 +1,3 @@
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Enums;
@ -20,18 +18,12 @@ public GetUserShoutsCommand(IAuth auth, string username) : base(auth)
Username = username;
}
public override Uri BuildRequestUrl()
public override void SetParameters()
{
var parameters = new Dictionary<string, string>
{
{"user", Uri.EscapeDataString(Username)},
};
Parameters.Add("user", Username);
base.AddPagingParameters(parameters);
base.DisableCaching(parameters);
var uristring = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters);
return new Uri(uristring, UriKind.Absolute);
AddPagingParameters();
DisableCaching();
}
public async override Task<PageResponse<Shout>> HandleResponse(HttpResponseMessage response)

View File

@ -48,6 +48,7 @@
<Compile Include="Api\Commands\ArtistApi\GetArtistInfoCommand.cs" />
<Compile Include="Api\Commands\ArtistApi\GetArtistShoutsCommand.cs" />
<Compile Include="Api\Commands\GetAsyncCommandBase.cs" />
<Compile Include="Api\Commands\LastAsyncCommandBase.cs" />
<Compile Include="Api\Commands\PostAsyncCommandBase.cs" />
<Compile Include="Api\Commands\TrackApi\AddShoutCommand.cs" />
<Compile Include="Api\Commands\TrackApi\GetTrackInfoCommand.cs" />

View File

@ -61,6 +61,7 @@ public static FormUrlEncodedContent CreatePostBody(string method, string apikey,
{"format", ResponseFormat}
};
// TODO ordering
var requestParameters = init.Concat(parameters);
return new FormUrlEncodedContent(requestParameters);