using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
using ServiceStack.Common.Web;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
namespace MediaBrowser.Api
{
///
/// Class BaseApiService
///
[RequestFilter]
public class BaseApiService : IHasResultFactory, IRestfulService
{
///
/// Gets or sets the logger.
///
/// The logger.
public ILogger Logger { get; set; }
///
/// Gets or sets the HTTP result factory.
///
/// The HTTP result factory.
public IHttpResultFactory ResultFactory { get; set; }
///
/// Gets or sets the request context.
///
/// The request context.
public IRequestContext RequestContext { get; set; }
///
/// To the optimized result.
///
///
/// The result.
/// System.Object.
protected object ToOptimizedResult(T result)
where T : class
{
return ResultFactory.GetOptimizedResult(RequestContext, result);
}
///
/// To the optimized result using cache.
///
///
/// The cache key.
/// The last date modified.
/// Duration of the cache.
/// The factory fn.
/// System.Object.
/// cacheKey
protected object ToOptimizedResultUsingCache(Guid cacheKey, DateTime lastDateModified, TimeSpan? cacheDuration, Func factoryFn)
where T : class
{
return ResultFactory.GetOptimizedResultUsingCache(RequestContext, cacheKey, lastDateModified, cacheDuration, factoryFn);
}
///
/// To the cached result.
///
///
/// The cache key.
/// The last date modified.
/// Duration of the cache.
/// The factory fn.
/// Type of the content.
/// System.Object.
/// cacheKey
protected object ToCachedResult(Guid cacheKey, DateTime lastDateModified, TimeSpan? cacheDuration, Func factoryFn, string contentType)
where T : class
{
return ResultFactory.GetCachedResult(RequestContext, cacheKey, lastDateModified, cacheDuration, factoryFn, contentType);
}
}
///
/// Class RequestFilterAttribute
///
public class RequestFilterAttribute : Attribute, IHasRequestFilter
{
//This property will be resolved by the IoC container
///
/// Gets or sets the user manager.
///
/// The user manager.
public IUserManager UserManager { get; set; }
///
/// Gets or sets the logger.
///
/// The logger.
public ILogger Logger { get; set; }
///
/// The request filter is executed before the service.
///
/// The http request wrapper
/// The http response wrapper
/// The request DTO
public void RequestFilter(IHttpRequest request, IHttpResponse response, object requestDto)
{
//This code is executed before the service
var auth = GetAuthorization(request);
if (auth != null && auth.ContainsKey("UserId"))
{
var user = UserManager.GetUserById(new Guid(auth["UserId"]));
UserManager.LogUserActivity(user, auth["Client"], auth["DeviceId"], auth["Device"] ?? string.Empty);
}
}
///
/// Gets the auth.
///
/// The HTTP req.
/// Dictionary{System.StringSystem.String}.
public static Dictionary GetAuthorization(IHttpRequest httpReq)
{
var auth = httpReq.Headers[HttpHeaders.Authorization];
return GetAuthorization(auth);
}
///
/// Gets the authorization.
///
/// The HTTP req.
/// Dictionary{System.StringSystem.String}.
public static Dictionary GetAuthorization(IRequestContext httpReq)
{
var auth = httpReq.GetHeader("Authorization");
return GetAuthorization(auth);
}
///
/// Gets the authorization.
///
/// The authorization header.
/// Dictionary{System.StringSystem.String}.
private static Dictionary GetAuthorization(string authorizationHeader)
{
if (authorizationHeader == null) return null;
var parts = authorizationHeader.Split(' ');
// There should be at least to parts
if (parts.Length < 2) return null;
// It has to be a digest request
if (!string.Equals(parts[0], "MediaBrowser", StringComparison.OrdinalIgnoreCase))
{
return null;
}
// Remove uptil the first space
authorizationHeader = authorizationHeader.Substring(authorizationHeader.IndexOf(' '));
parts = authorizationHeader.Split(',');
var result = new Dictionary(StringComparer.OrdinalIgnoreCase);
foreach (var item in parts)
{
var param = item.Trim().Split(new[] { '=' }, 2);
result.Add(param[0], param[1].Trim(new[] { '"' }));
}
return result;
}
///
/// A new shallow copy of this filter is used on every request.
///
/// IHasRequestFilter.
public IHasRequestFilter Copy()
{
return this;
}
///
/// Order in which Request Filters are executed.
/// <0 Executed before global request filters
/// >0 Executed after global request filters
///
/// The priority.
public int Priority
{
get { return 0; }
}
}
}