diff options
Diffstat (limited to 'MediaBrowser.Api/UserService.cs')
| -rw-r--r-- | MediaBrowser.Api/UserService.cs | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs new file mode 100644 index 000000000..d5db2b6e8 --- /dev/null +++ b/MediaBrowser.Api/UserService.cs @@ -0,0 +1,297 @@ +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<DtoUser>> + { + } + + /// <summary> + /// Class GetUser + /// </summary> + [Route("/Users/{Id}", "GET")] + public class GetUser : IReturn<DtoUser> + { + /// <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<DtoUser> + { + /// <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 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 = DtoBuilder.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<DtoUser>(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<DtoUser>(request.RequestStream); + + var newUser = kernel.UserManager.CreateUser(dtoUser.Name).Result; + + var result = DtoBuilder.GetDtoUser(newUser); + + return ToOptimizedResult(result); + } + } +} |
