using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; using ServiceStack.ServiceHost; using ServiceStack.Text.Controller; using System; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Api.UserLibrary { /// /// Class MarkItemByNameFavorite /// [Route("/Users/{UserId}/Favorites/Artists/{Name}", "POST")] [Route("/Users/{UserId}/Favorites/Persons/{Name}", "POST")] [Route("/Users/{UserId}/Favorites/Studios/{Name}", "POST")] [Route("/Users/{UserId}/Favorites/Genres/{Name}", "POST")] [Route("/Users/{UserId}/Favorites/MusicGenres/{Name}", "POST")] [Route("/Users/{UserId}/Favorites/GameGenres/{Name}", "POST")] [Api(Description = "Marks something as a favorite")] public class MarkItemByNameFavorite : IReturn { /// /// Gets or sets the user id. /// /// The user id. [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] public Guid UserId { get; set; } /// /// Gets or sets the name. /// /// The name. [ApiMember(Name = "Name", Description = "The name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] public string Name { get; set; } } /// /// Class UnmarkItemByNameFavorite /// [Route("/Users/{UserId}/Favorites/Artists/{Name}", "DELETE")] [Route("/Users/{UserId}/Favorites/Persons/{Name}", "DELETE")] [Route("/Users/{UserId}/Favorites/Studios/{Name}", "DELETE")] [Route("/Users/{UserId}/Favorites/Genres/{Name}", "DELETE")] [Route("/Users/{UserId}/Favorites/MusicGenres/{Name}", "DELETE")] [Route("/Users/{UserId}/Favorites/GameGenres/{Name}", "DELETE")] [Api(Description = "Unmarks something as a favorite")] public class UnmarkItemByNameFavorite : IReturn { /// /// Gets or sets the user id. /// /// The user id. [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] public Guid UserId { get; set; } /// /// Gets or sets the name. /// /// The name. [ApiMember(Name = "Name", Description = "The name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] public string Name { get; set; } } /// /// Class UpdateItemByNameRating /// [Route("/Users/{UserId}/Ratings/Artists/{Name}", "POST")] [Route("/Users/{UserId}/Ratings/Persons/{Name}", "POST")] [Route("/Users/{UserId}/Ratings/Studios/{Name}", "POST")] [Route("/Users/{UserId}/Ratings/Genres/{Name}", "POST")] [Route("/Users/{UserId}/Ratings/MusicGenres/{Name}", "POST")] [Api(Description = "Updates a user's rating for an item")] public class UpdateItemByNameRating : IReturn { /// /// Gets or sets the user id. /// /// The user id. [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] public Guid UserId { get; set; } /// /// Gets or sets the name. /// /// The name. [ApiMember(Name = "Name", Description = "The name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] public string Name { get; set; } /// /// Gets or sets a value indicating whether this is likes. /// /// true if likes; otherwise, false. [ApiMember(Name = "Likes", Description = "Whether the user likes the item or not. true/false", IsRequired = true, DataType = "boolean", ParameterType = "query", Verb = "POST")] public bool Likes { get; set; } } /// /// Class DeleteItemByNameRating /// [Route("/Users/{UserId}/Ratings/Artists/{Name}", "DELETE")] [Route("/Users/{UserId}/Ratings/Persons/{Name}", "DELETE")] [Route("/Users/{UserId}/Ratings/Studios/{Name}", "DELETE")] [Route("/Users/{UserId}/Ratings/Genres/{Name}", "DELETE")] [Route("/Users/{UserId}/Ratings/MusicGenres/{Name}", "DELETE")] [Route("/Users/{UserId}/Ratings/GameGenres/{Name}", "DELETE")] [Api(Description = "Deletes a user's saved personal rating for an item")] public class DeleteItemByNameRating : IReturn { /// /// Gets or sets the user id. /// /// The user id. [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] public Guid UserId { get; set; } /// /// Gets or sets the name. /// /// The name. [ApiMember(Name = "Name", Description = "The item name (genre, person, year, studio, artist)", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] public string Name { get; set; } } /// /// Class ItemByNameUserDataService /// public class ItemByNameUserDataService : BaseApiService { /// /// The user data repository /// protected readonly IUserDataRepository UserDataRepository; /// /// The library manager /// protected readonly ILibraryManager LibraryManager; private readonly IDtoService _dtoService; /// /// Initializes a new instance of the class. /// /// The user data repository. /// The library manager. public ItemByNameUserDataService(IUserDataRepository userDataRepository, ILibraryManager libraryManager, IDtoService dtoService) { UserDataRepository = userDataRepository; LibraryManager = libraryManager; _dtoService = dtoService; } /// /// Posts the specified request. /// /// The request. public object Post(MarkItemByNameFavorite request) { var pathInfo = PathInfo.Parse(RequestContext.PathInfo); var type = pathInfo.GetArgumentValue(3); var task = MarkFavorite(request.UserId, type, request.Name, true); return ToOptimizedResult(task.Result); } /// /// Posts the specified request. /// /// The request. public object Post(UpdateItemByNameRating request) { var pathInfo = PathInfo.Parse(RequestContext.PathInfo); var type = pathInfo.GetArgumentValue(3); var task = MarkLike(request.UserId, type, request.Name, request.Likes); return ToOptimizedResult(task.Result); } /// /// Deletes the specified request. /// /// The request. public object Delete(UnmarkItemByNameFavorite request) { var pathInfo = PathInfo.Parse(RequestContext.PathInfo); var type = pathInfo.GetArgumentValue(3); var task = MarkFavorite(request.UserId, type, request.Name, false); return ToOptimizedResult(task.Result); } /// /// Deletes the specified request. /// /// The request. public object Delete(DeleteItemByNameRating request) { var pathInfo = PathInfo.Parse(RequestContext.PathInfo); var type = pathInfo.GetArgumentValue(3); var task = MarkLike(request.UserId, type, request.Name, null); return ToOptimizedResult(task.Result); } /// /// Marks the favorite. /// /// The user id. /// The type. /// The name. /// if set to true [is favorite]. /// Task. protected async Task MarkFavorite(Guid userId, string type, string name, bool isFavorite) { var item = await GetItemByName(name, type, LibraryManager).ConfigureAwait(false); var key = item.GetUserDataKey(); // Get the user data for this item var data = UserDataRepository.GetUserData(userId, key); // Set favorite status data.IsFavorite = isFavorite; await UserDataRepository.SaveUserData(userId, key, data, CancellationToken.None).ConfigureAwait(false); data = UserDataRepository.GetUserData(userId, key); return _dtoService.GetUserItemDataDto(data); } /// /// Marks the like. /// /// The user id. /// The type. /// The name. /// if set to true [likes]. /// Task. protected async Task MarkLike(Guid userId, string type, string name, bool? likes) { var item = await GetItemByName(name, type, LibraryManager).ConfigureAwait(false); var key = item.GetUserDataKey(); // Get the user data for this item var data = UserDataRepository.GetUserData(userId, key); data.Likes = likes; await UserDataRepository.SaveUserData(userId, key, data, CancellationToken.None).ConfigureAwait(false); data = UserDataRepository.GetUserData(userId, key); return _dtoService.GetUserItemDataDto(data); } } }