This commit is contained in:
Luke Pulverenti 2015-10-16 13:11:25 -04:00
commit f5f5285306
4 changed files with 109 additions and 0 deletions

View File

@ -118,6 +118,30 @@ namespace MediaBrowser.Api
public string Name { get; set; } public string Name { get; set; }
} }
[Route("/Appstore/Register", "POST", Summary = "Registers an appstore sale")]
[Authenticated]
public class RegisterAppstoreSale
{
[ApiMember(Name = "Store", Description = "Store Name", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string Store { get; set; }
[ApiMember(Name = "Application", Description = "Application id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string Application { get; set; }
[ApiMember(Name = "Product", Description = "Product id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string Product { get; set; }
[ApiMember(Name = "Type", Description = "Type of product (Product or Subscription)", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string Type { get; set; }
[ApiMember(Name = "StoreId", Description = "Store User Id (if needed)", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
public string StoreId { get; set; }
[ApiMember(Name = "StoreToken", Description = "Unique ID for this purchase in the store", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string StoreToken { get; set; }
[ApiMember(Name = "Feature", Description = "Emby Feature Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string Feature { get; set; }
[ApiMember(Name = "Email", Description = "Email address for purchase", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string Email { get; set; }
[ApiMember(Name = "Amount", Description = "String representation of price (can have currency sign)", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string Amount { get; set; }
}
/// <summary> /// <summary>
/// Class PluginsService /// Class PluginsService
/// </summary> /// </summary>
@ -265,6 +289,16 @@ namespace MediaBrowser.Api
return ToOptimizedSerializedResultUsingCache(result); return ToOptimizedSerializedResultUsingCache(result);
} }
/// <summary>
/// Post app store sale
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public async Task Post(RegisterAppstoreSale request)
{
await _securityManager.RegisterAppStoreSale(request.Store, request.Application, request.Product, request.Feature, request.Type, request.StoreId, request.StoreToken, request.Email, request.Amount);
}
/// <summary> /// <summary>
/// Posts the specified request. /// Posts the specified request.
/// </summary> /// </summary>

View File

@ -18,6 +18,7 @@ namespace MediaBrowser.Common.Implementations.Security
public class PluginSecurityManager : ISecurityManager public class PluginSecurityManager : ISecurityManager
{ {
private const string MBValidateUrl = MbAdmin.HttpsUrl + "service/registration/validate"; private const string MBValidateUrl = MbAdmin.HttpsUrl + "service/registration/validate";
private const string AppstoreRegUrl = /*MbAdmin.HttpsUrl*/ "http://mb3admin.com/test/admin/" + "service/appstore/register";
/// <summary> /// <summary>
/// The _is MB supporter /// The _is MB supporter
@ -185,6 +186,63 @@ namespace MediaBrowser.Common.Implementations.Security
} }
} }
/// <summary>
/// Register an app store sale with our back-end. It will validate the transaction with the store
/// and then register the proper feature and then fill in the supporter key on success.
/// </summary>
/// <param name="store"></param>
/// <param name="application"></param>
/// <param name="product"></param>
/// <param name="feature"></param>
/// <param name="type"></param>
/// <param name="storeId"></param>
/// <param name="storeToken"></param>
/// <param name="email"></param>
/// <param name="amt"></param>
public async Task RegisterAppStoreSale(string store, string application, string product, string feature,
string type, string storeId, string storeToken, string email, string amt)
{
var data = new Dictionary<string, string>()
{
{"store", store},
{"application", application},
{"product", product},
{"feature", feature},
{"type", type},
{"storeId", storeId},
{"token", storeToken},
{"email", email},
{"amt", amt}
};
var options = new HttpRequestOptions()
{
Url = AppstoreRegUrl,
CancellationToken = CancellationToken.None
};
options.RequestHeaders.Add("X-Emby-Token", /*_appHost.SystemId*/ "08606E86D043");
try
{
using (var json = await _httpClient.Post(options, data).ConfigureAwait(false))
{
var reg = _jsonSerializer.DeserializeFromStream<RegRecord>(json);
if (!String.IsNullOrEmpty(reg.key))
{
SupporterKey = reg.key;
}
}
}
catch (Exception e)
{
_logger.ErrorException("Error registering appstore purchase {0}", e, _jsonSerializer.SerializeToString(data));
//TODO - really need to write this to a file so we can re-try it automatically
throw new ApplicationException("Error registering store sale");
}
}
private async Task<MBRegistrationRecord> GetRegistrationStatusInternal(string feature, private async Task<MBRegistrationRecord> GetRegistrationStatusInternal(string feature,
string mb2Equivalent = null, string mb2Equivalent = null,
string version = null) string version = null)

View File

@ -7,5 +7,6 @@ namespace MediaBrowser.Common.Implementations.Security
public string featId { get; set; } public string featId { get; set; }
public bool registered { get; set; } public bool registered { get; set; }
public DateTime expDate { get; set; } public DateTime expDate { get; set; }
public string key { get; set; }
} }
} }

View File

@ -1,3 +1,4 @@
using System;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -45,5 +46,20 @@ namespace MediaBrowser.Common.Security
/// </summary> /// </summary>
/// <returns>Task&lt;SupporterInfo&gt;.</returns> /// <returns>Task&lt;SupporterInfo&gt;.</returns>
Task<SupporterInfo> GetSupporterInfo(); Task<SupporterInfo> GetSupporterInfo();
/// <summary>
/// Register and app store sale with our back-end
/// </summary>
/// <param name="store"></param>
/// <param name="application"></param>
/// <param name="product"></param>
/// <param name="feature"></param>
/// <param name="type"></param>
/// <param name="storeId"></param>
/// <param name="storeToken"></param>
/// <param name="email"></param>
/// <param name="amt"></param>
Task RegisterAppStoreSale(string store, string application, string product, string feature,
string type, string storeId, string storeToken, string email, string amt);
} }
} }