using MediaBrowser.Common.Extensions ;
using MediaBrowser.Common.Net ;
using MediaBrowser.Common.Serialization ;
using MediaBrowser.Controller ;
using MediaBrowser.Controller.Library ;
using MediaBrowser.Model.Dto ;
using ServiceStack.ServiceHost ;
using System ;
using System.Collections.Generic ;
using System.ComponentModel.Composition ;
using System.IO ;
using System.Linq ;
using System.Threading.Tasks ;
using ServiceStack.Text.Controller ;
namespace MediaBrowser.Api
{
/// <summary>
/// Class GetUsers
/// </summary>
[Route("/Users", "GET")]
public class GetUsers : IReturn < List < UserDto > >
{
}
/// <summary>
/// Class GetUser
/// </summary>
[Route("/Users/{Id}", "GET")]
public class GetUser : IReturn < UserDto >
{
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
public Guid Id { get ; set ; }
}
/// <summary>
/// Class DeleteUser
/// </summary>
[Route("/Users/{Id}", "DELETE")]
public class DeleteUser : IReturnVoid
{
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
public Guid Id { get ; set ; }
}
/// <summary>
/// Class AuthenticateUser
/// </summary>
[Route("/Users/{Id}/Authenticate", "POST")]
public class AuthenticateUser : IReturnVoid
{
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
public Guid Id { get ; set ; }
/// <summary>
/// Gets or sets the password.
/// </summary>
/// <value>The password.</value>
public string Password { get ; set ; }
}
/// <summary>
/// Class UpdateUserPassword
/// </summary>
[Route("/Users/{Id}/Password", "POST")]
public class UpdateUserPassword : IReturnVoid
{
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
public Guid Id { get ; set ; }
/// <summary>
/// Gets or sets the password.
/// </summary>
/// <value>The password.</value>
public string CurrentPassword { get ; set ; }
/// <summary>
/// Gets or sets the new password.
/// </summary>
/// <value>The new password.</value>
public string NewPassword { get ; set ; }
/// <summary>
/// Gets or sets a value indicating whether [reset password].
/// </summary>
/// <value><c>true</c> if [reset password]; otherwise, <c>false</c>.</value>
public bool ResetPassword { get ; set ; }
}
/// <summary>
/// Class UpdateUser
/// </summary>
[Route("/Users/{Id}", "POST")]
public class UpdateUser : IRequiresRequestStream , IReturnVoid
{
/// <summary>
/// The raw Http Request Input Stream
/// </summary>
/// <value>The request stream.</value>
public Stream RequestStream { get ; set ; }
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
public Guid Id { get ; set ; }
}
/// <summary>
/// Class CreateUser
/// </summary>
[Route("/Users", "POST")]
public class CreateUser : IRequiresRequestStream , IReturn < UserDto >
{
/// <summary>
/// The raw Http Request Input Stream
/// </summary>
/// <value>The request stream.</value>
public Stream RequestStream { get ; set ; }
}
/// <summary>
/// Class UsersService
/// </summary>
[Export(typeof(IRestfulService))]
public class UserService : BaseRestService
{
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetUsers request )
{
var kernel = ( Kernel ) Kernel ;
var dtoBuilder = new DtoBuilder ( Logger ) ;
var result = kernel . Users . OrderBy ( u = > u . Name ) . Select ( dtoBuilder . GetDtoUser ) . ToList ( ) ;
return ToOptimizedResult ( result ) ;
}
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetUser request )
{
var kernel = ( Kernel ) Kernel ;
var user = kernel . GetUserById ( request . Id ) ;
if ( user = = null )
{
throw new ResourceNotFoundException ( "User not found" ) ;
}
var result = new DtoBuilder ( Logger ) . GetDtoUser ( user ) ;
return ToOptimizedResult ( result ) ;
}
/// <summary>
/// Deletes the specified request.
/// </summary>
/// <param name="request">The request.</param>
public void Delete ( DeleteUser request )
{
var kernel = ( Kernel ) Kernel ;
var user = kernel . GetUserById ( request . Id ) ;
if ( user = = null )
{
throw new ResourceNotFoundException ( "User not found" ) ;
}
var task = kernel . UserManager . DeleteUser ( user ) ;
Task . WaitAll ( task ) ;
}
/// <summary>
/// Posts the specified request.
/// </summary>
/// <param name="request">The request.</param>
public void Post ( AuthenticateUser request )
{
var kernel = ( Kernel ) Kernel ;
var user = kernel . GetUserById ( request . Id ) ;
if ( user = = null )
{
throw new ResourceNotFoundException ( "User not found" ) ;
}
var success = kernel . UserManager . AuthenticateUser ( user , request . Password ) . Result ;
if ( ! success )
{
// Unauthorized
throw new ResourceNotFoundException ( "Invalid user or password entered." ) ;
}
}
/// <summary>
/// Posts the specified request.
/// </summary>
/// <param name="request">The request.</param>
public void Post ( UpdateUserPassword request )
{
var kernel = ( Kernel ) Kernel ;
var user = kernel . GetUserById ( request . Id ) ;
if ( user = = null )
{
throw new ResourceNotFoundException ( "User not found" ) ;
}
if ( request . ResetPassword )
{
var task = user . ResetPassword ( ) ;
Task . WaitAll ( task ) ;
}
else
{
var success = kernel . UserManager . AuthenticateUser ( user , request . CurrentPassword ) . Result ;
if ( ! success )
{
throw new ResourceNotFoundException ( "Invalid user or password entered." ) ;
}
var task = user . ChangePassword ( request . NewPassword ) ;
Task . WaitAll ( task ) ;
}
}
/// <summary>
/// Posts the specified request.
/// </summary>
/// <param name="request">The request.</param>
public void Post ( UpdateUser request )
{
// We need to parse this manually because we told service stack not to with IRequiresRequestStream
// https://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.Text/ServiceStack.Text/Controller/PathInfo.cs
var pathInfo = PathInfo . Parse ( Request . PathInfo ) ;
var id = new Guid ( pathInfo . GetArgumentValue < string > ( 1 ) ) ;
var kernel = ( Kernel ) Kernel ;
var dtoUser = JsonSerializer . DeserializeFromStream < UserDto > ( request . RequestStream ) ;
var user = kernel . GetUserById ( id ) ;
var task = user . Name . Equals ( dtoUser . Name , StringComparison . Ordinal ) ? kernel . UserManager . UpdateUser ( user ) : kernel . UserManager . RenameUser ( user , dtoUser . Name ) ;
Task . WaitAll ( task ) ;
user . UpdateConfiguration ( dtoUser . Configuration ) ;
}
/// <summary>
/// Posts the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Post ( CreateUser request )
{
var kernel = ( Kernel ) Kernel ;
var dtoUser = JsonSerializer . DeserializeFromStream < UserDto > ( request . RequestStream ) ;
var newUser = kernel . UserManager . CreateUser ( dtoUser . Name ) . Result ;
var result = new DtoBuilder ( Logger ) . GetDtoUser ( newUser ) ;
return ToOptimizedResult ( result ) ;
}
}
}