using System; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Connect; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Connect; using MediaBrowser.Model.Dto; using ServiceStack; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace MediaBrowser.Api { [Route("/Users/{Id}/Connect/Link", "POST", Summary = "Creates a Connect link for a user")] [Authenticated(Roles = "Admin")] public class CreateConnectLink : IReturn { [ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] public string Id { get; set; } [ApiMember(Name = "ConnectUsername", Description = "Connect username", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] public string ConnectUsername { get; set; } } [Route("/Users/{Id}/Connect/Link", "DELETE", Summary = "Removes a Connect link for a user")] [Authenticated(Roles = "Admin")] public class DeleteConnectLink : IReturnVoid { [ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")] public string Id { get; set; } } [Route("/Connect/Invite", "POST", Summary = "Creates a Connect link for a user")] [Authenticated(Roles = "Admin")] public class CreateConnectInvite : IReturn { [ApiMember(Name = "ConnectUsername", Description = "Connect username", IsRequired = true, DataType = "string", ParameterType = "body", Verb = "POST")] public string ConnectUsername { get; set; } [ApiMember(Name = "SendingUserId", Description = "Sending User Id", IsRequired = true, DataType = "string", ParameterType = "body", Verb = "POST")] public string SendingUserId { get; set; } [ApiMember(Name = "EnabledLibraries", Description = "EnabledLibraries", IsRequired = true, DataType = "string", ParameterType = "body", Verb = "POST")] public string EnabledLibraries { get; set; } [ApiMember(Name = "EnabledChannels", Description = "EnabledChannels", IsRequired = true, DataType = "string", ParameterType = "body", Verb = "POST")] public string EnabledChannels { get; set; } [ApiMember(Name = "EnableLiveTv", Description = "EnableLiveTv", IsRequired = true, DataType = "string", ParameterType = "body", Verb = "POST")] public bool EnableLiveTv { get; set; } } [Route("/Connect/Pending", "GET", Summary = "Creates a Connect link for a user")] [Authenticated(Roles = "Admin")] public class GetPendingGuests : IReturn> { } [Route("/Connect/Pending", "DELETE", Summary = "Deletes a Connect link for a user")] [Authenticated(Roles = "Admin")] public class DeleteAuthorization : IReturnVoid { [ApiMember(Name = "Id", Description = "Authorization Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")] public string Id { get; set; } } [Route("/Connect/Exchange", "GET", Summary = "Gets the corresponding local user from a connect user id")] [Authenticated] public class GetLocalUser : IReturn { [ApiMember(Name = "ConnectUserId", Description = "ConnectUserId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] public string ConnectUserId { get; set; } } [Route("/Connect/Supporters", "GET")] [Authenticated(Roles = "Admin")] public class GetConnectSupporterSummary : IReturn { } [Route("/Connect/Supporters", "DELETE")] [Authenticated(Roles = "Admin")] public class RemoveConnectSupporter : IReturnVoid { [ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")] public string Id { get; set; } } [Route("/Connect/Supporters", "POST")] [Authenticated(Roles = "Admin")] public class AddConnectSupporter : IReturnVoid { [ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] public string Id { get; set; } } public class ConnectService : BaseApiService { private readonly IConnectManager _connectManager; private readonly IUserManager _userManager; public ConnectService(IConnectManager connectManager, IUserManager userManager) { _connectManager = connectManager; _userManager = userManager; } public async Task Get(GetConnectSupporterSummary request) { var result = await _connectManager.GetConnectSupporterSummary().ConfigureAwait(false); var existingConnectUserIds = result.Users.Select(i => i.Id).ToList(); result.EligibleUsers = _userManager.Users .Where(i => !string.IsNullOrWhiteSpace(i.ConnectUserId)) .Where(i => !existingConnectUserIds.Contains(i.ConnectUserId, StringComparer.OrdinalIgnoreCase)) .OrderBy(i => i.Name) .Select(i => _userManager.GetUserDto(i)) .ToList(); return ToOptimizedResult(result); } public void Delete(RemoveConnectSupporter request) { var task = _connectManager.RemoveConnectSupporter(request.Id); Task.WaitAll(task); } public void Post(AddConnectSupporter request) { var task = _connectManager.AddConnectSupporter(request.Id); Task.WaitAll(task); } public object Post(CreateConnectLink request) { return _connectManager.LinkUser(request.Id, request.ConnectUsername); } public object Post(CreateConnectInvite request) { var enabledLibraries = (request.EnabledLibraries ?? string.Empty) .Split(',') .Where(i => !string.IsNullOrWhiteSpace(i)) .ToArray(); var enabledChannels = (request.EnabledChannels ?? string.Empty) .Split(',') .Where(i => !string.IsNullOrWhiteSpace(i)) .ToArray(); return _connectManager.InviteUser(new ConnectAuthorizationRequest { ConnectUserName = request.ConnectUsername, SendingUserId = request.SendingUserId, EnabledLibraries = enabledLibraries, EnabledChannels = enabledChannels, EnableLiveTv = request.EnableLiveTv }); } public void Delete(DeleteConnectLink request) { var task = _connectManager.RemoveConnect(request.Id); Task.WaitAll(task); } public async Task Get(GetPendingGuests request) { var result = await _connectManager.GetPendingGuests().ConfigureAwait(false); return ToOptimizedResult(result); } public void Delete(DeleteAuthorization request) { var task = _connectManager.CancelAuthorization(request.Id); Task.WaitAll(task); } public async Task Get(GetLocalUser request) { var user = await _connectManager.GetLocalUser(request.ConnectUserId).ConfigureAwait(false); if (user == null) { throw new ResourceNotFoundException(); } return ToOptimizedResult(new ConnectAuthenticationExchangeResult { AccessToken = user.ConnectAccessKey, LocalUserId = user.Id.ToString("N") }); } } }