diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 562da40ee5..e85a5a6808 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -358,7 +358,7 @@ namespace MediaBrowser.Api.Images /// System.Object. public object Get(GetItemImageInfos request) { - var item = _dtoService.GetItemByDtoId(request.Id); + var item = _libraryManager.GetItemById(request.Id); var result = GetItemImageInfos(item); @@ -493,7 +493,9 @@ namespace MediaBrowser.Api.Images /// System.Object. public object Get(GetItemImage request) { - var item = string.IsNullOrEmpty(request.Id) ? _libraryManager.RootFolder : _dtoService.GetItemByDtoId(request.Id); + var item = string.IsNullOrEmpty(request.Id) ? + _libraryManager.RootFolder : + _libraryManager.GetItemById(request.Id); return GetImage(request, item); } diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs index 36b509c740..c765063577 100644 --- a/MediaBrowser.Api/Images/RemoteImageService.cs +++ b/MediaBrowser.Api/Images/RemoteImageService.cs @@ -175,7 +175,7 @@ namespace MediaBrowser.Api.Images public object Get(GetRemoteImageProviders request) { - var item = _dtoService.GetItemByDtoId(request.Id); + var item = _libraryManager.GetItemById(request.Id); var result = GetImageProviders(item); @@ -201,7 +201,7 @@ namespace MediaBrowser.Api.Images public object Get(GetRemoteImages request) { - var item = _dtoService.GetItemByDtoId(request.Id); + var item = _libraryManager.GetItemById(request.Id); var result = GetRemoteImageResult(item, request); @@ -269,7 +269,7 @@ namespace MediaBrowser.Api.Images /// The request. public void Post(DownloadRemoteImage request) { - var item = _dtoService.GetItemByDtoId(request.Id); + var item = _libraryManager.GetItemById(request.Id); var task = DownloadRemoteImage(item, request); diff --git a/MediaBrowser.Api/ItemLookupService.cs b/MediaBrowser.Api/ItemLookupService.cs index 62596287e2..b600c3b464 100644 --- a/MediaBrowser.Api/ItemLookupService.cs +++ b/MediaBrowser.Api/ItemLookupService.cs @@ -124,7 +124,7 @@ namespace MediaBrowser.Api public object Get(GetExternalIdInfos request) { - var item = _dtoService.GetItemByDtoId(request.Id); + var item = _libraryManager.GetItemById(request.Id); var infos = _providerManager.GetExternalIdInfos(item).ToList(); diff --git a/MediaBrowser.Api/ItemRefreshService.cs b/MediaBrowser.Api/ItemRefreshService.cs index 97e43f018c..3816332b26 100644 --- a/MediaBrowser.Api/ItemRefreshService.cs +++ b/MediaBrowser.Api/ItemRefreshService.cs @@ -250,7 +250,7 @@ namespace MediaBrowser.Api /// Task. private async Task RefreshItem(RefreshItem request) { - var item = _dtoService.GetItemByDtoId(request.Id); + var item = _libraryManager.GetItemById(request.Id); var options = GetRefreshOptions(request); diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index 8bc06b6577..5f05fdc3f2 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -91,7 +91,7 @@ namespace MediaBrowser.Api private async Task UpdateItem(UpdateItem request) { - var item = _dtoService.GetItemByDtoId(request.ItemId); + var item = _libraryManager.GetItemById(request.ItemId); var newLockData = request.LockData ?? false; var dontFetchMetaChanged = item.IsLocked != newLockData; diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs index 967bc1fbac..0599b45d58 100644 --- a/MediaBrowser.Api/Library/LibraryService.cs +++ b/MediaBrowser.Api/Library/LibraryService.cs @@ -284,7 +284,7 @@ namespace MediaBrowser.Api.Library public object Get(GetFile request) { - var item = _dtoService.GetItemByDtoId(request.Id); + var item = _libraryManager.GetItemById(request.Id); var locationType = item.LocationType; if (locationType == LocationType.Remote || locationType == LocationType.Virtual) { @@ -350,7 +350,7 @@ namespace MediaBrowser.Api.Library /// Task{BaseItemDto[]}. public List GetAncestors(GetAncestors request) { - var item = _dtoService.GetItemByDtoId(request.Id); + var item = _libraryManager.GetItemById(request.Id); var baseItemDtos = new List(); @@ -504,7 +504,7 @@ namespace MediaBrowser.Api.Library private Task DeleteItem(DeleteItem request) { - var item = _dtoService.GetItemByDtoId(request.Id); + var item = _libraryManager.GetItemById(request.Id); var session = GetSession(_sessionManager); @@ -593,7 +593,7 @@ namespace MediaBrowser.Api.Library ? (request.UserId.HasValue ? user.RootFolder : (Folder)_libraryManager.RootFolder) - : _dtoService.GetItemByDtoId(request.Id, request.UserId); + : _libraryManager.GetItemById(request.Id); var originalItem = item; @@ -661,7 +661,7 @@ namespace MediaBrowser.Api.Library ? (request.UserId.HasValue ? user.RootFolder : (Folder)_libraryManager.RootFolder) - : _dtoService.GetItemByDtoId(request.Id, request.UserId); + : _libraryManager.GetItemById(request.Id); var originalItem = item; @@ -771,7 +771,7 @@ namespace MediaBrowser.Api.Library ? (userId.HasValue ? user.RootFolder : (Folder)_libraryManager.RootFolder) - : _dtoService.GetItemByDtoId(id, userId); + : _libraryManager.GetItemById(id); // Get everything var fields = Enum.GetNames(typeof(ItemFields)) diff --git a/MediaBrowser.Api/Music/InstantMixService.cs b/MediaBrowser.Api/Music/InstantMixService.cs index c39811bb66..f50c87f47a 100644 --- a/MediaBrowser.Api/Music/InstantMixService.cs +++ b/MediaBrowser.Api/Music/InstantMixService.cs @@ -38,18 +38,20 @@ namespace MediaBrowser.Api.Music private readonly IUserManager _userManager; private readonly IDtoService _dtoService; + private readonly ILibraryManager _libraryManager; private readonly IMusicManager _musicManager; - public InstantMixService(IUserManager userManager, IDtoService dtoService, IMusicManager musicManager) + public InstantMixService(IUserManager userManager, IDtoService dtoService, IMusicManager musicManager, ILibraryManager libraryManager) { _userManager = userManager; _dtoService = dtoService; _musicManager = musicManager; + _libraryManager = libraryManager; } public object Get(GetInstantMixFromSong request) { - var item = (Audio)_dtoService.GetItemByDtoId(request.Id); + var item = (Audio)_libraryManager.GetItemById(request.Id); var user = _userManager.GetUserById(request.UserId.Value); @@ -60,7 +62,7 @@ namespace MediaBrowser.Api.Music public object Get(GetInstantMixFromAlbum request) { - var album = (MusicAlbum)_dtoService.GetItemByDtoId(request.Id); + var album = (MusicAlbum)_libraryManager.GetItemById(request.Id); var user = _userManager.GetUserById(request.UserId.Value); diff --git a/MediaBrowser.Api/NotificationsService.cs b/MediaBrowser.Api/NotificationsService.cs index a71a85395a..796fcdab11 100644 --- a/MediaBrowser.Api/NotificationsService.cs +++ b/MediaBrowser.Api/NotificationsService.cs @@ -2,7 +2,7 @@ using MediaBrowser.Model.Notifications; using ServiceStack; using System; -using System.Linq; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -28,17 +28,17 @@ namespace MediaBrowser.Api public class GetNotificationsSummary : IReturn { [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } } [Route("/Notifications/{UserId}", "POST", Summary = "Adds a notifications")] - public class AddUserNotification : IReturn + public class AddUserNotification : IReturnVoid { [ApiMember(Name = "Id", Description = "The Id of the new notification. If unspecified one will be provided.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public Guid? Id { get; set; } + public string Id { get; set; } [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } [ApiMember(Name = "Name", Description = "The notification's name", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] public string Name { get; set; } @@ -49,12 +49,6 @@ namespace MediaBrowser.Api [ApiMember(Name = "Url", Description = "The notification's info url", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] public string Url { get; set; } - [ApiMember(Name = "Category", Description = "The notification's category", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] - public string Category { get; set; } - - [ApiMember(Name = "RelatedId", Description = "The notification's related id (item)", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public string RelatedId { get; set; } - [ApiMember(Name = "Level", Description = "The notification level", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] public NotificationLevel Level { get; set; } } @@ -63,7 +57,7 @@ namespace MediaBrowser.Api public class MarkRead : IReturnVoid { [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } [ApiMember(Name = "Ids", Description = "A list of notification ids, comma delimited", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST", AllowMultiple = true)] public string Ids { get; set; } @@ -73,7 +67,7 @@ namespace MediaBrowser.Api public class MarkUnread : IReturnVoid { [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } [ApiMember(Name = "Ids", Description = "A list of notification ids, comma delimited", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST", AllowMultiple = true)] public string Ids { get; set; } @@ -82,17 +76,19 @@ namespace MediaBrowser.Api public class NotificationsService : BaseApiService { private readonly INotificationsRepository _notificationsRepo; + private readonly INotificationManager _notificationManager; - public NotificationsService(INotificationsRepository notificationsRepo) + public NotificationsService(INotificationsRepository notificationsRepo, INotificationManager notificationManager) { _notificationsRepo = notificationsRepo; + _notificationManager = notificationManager; } - public object Post(AddUserNotification request) + public void Post(AddUserNotification request) { var task = AddNotification(request); - return ToOptimizedResult(task.Result); + Task.WaitAll(task); } public object Get(GetNotificationsSummary request) @@ -102,24 +98,19 @@ namespace MediaBrowser.Api return result; } - private async Task AddNotification(AddUserNotification request) + private async Task AddNotification(AddUserNotification request) { - var notification = new Notification + var notification = new NotificationRequest { - Id = request.Id ?? Guid.NewGuid(), Date = DateTime.UtcNow, Description = request.Description, Level = request.Level, Name = request.Name, Url = request.Url, - UserId = request.UserId, - Category = request.Category, - RelatedId = request.RelatedId + UserIds = new List { request.UserId } }; - await _notificationsRepo.AddNotification(notification, CancellationToken.None).ConfigureAwait(false); - - return notification; + await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false); } public void Post(MarkRead request) @@ -136,9 +127,9 @@ namespace MediaBrowser.Api Task.WaitAll(task); } - private Task MarkRead(string idList, Guid userId, bool read) + private Task MarkRead(string idList, string userId, bool read) { - var ids = idList.Split(',').Select(i => new Guid(i)); + var ids = idList.Split(','); return _notificationsRepo.MarkRead(ids, userId, read, CancellationToken.None); } diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index aafda7812d..3fd1714165 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1336,8 +1336,8 @@ namespace MediaBrowser.Api.Playback } var item = string.IsNullOrEmpty(request.MediaSourceId) ? - DtoService.GetItemByDtoId(request.Id) : - DtoService.GetItemByDtoId(request.MediaSourceId); + LibraryManager.GetItemById(request.Id) : + LibraryManager.GetItemById(request.MediaSourceId); if (user != null && item.GetPlayAccess(user) != PlayAccess.Full) { diff --git a/MediaBrowser.Api/SimilarItemsHelper.cs b/MediaBrowser.Api/SimilarItemsHelper.cs index 1f02a63a09..664a344ce0 100644 --- a/MediaBrowser.Api/SimilarItemsHelper.cs +++ b/MediaBrowser.Api/SimilarItemsHelper.cs @@ -73,7 +73,7 @@ namespace MediaBrowser.Api var item = string.IsNullOrEmpty(request.Id) ? (request.UserId.HasValue ? user.RootFolder : - libraryManager.RootFolder) : dtoService.GetItemByDtoId(request.Id, request.UserId); + libraryManager.RootFolder) : libraryManager.GetItemById(request.Id); var fields = request.GetItemFields().ToList(); diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index d21014dfed..c2b8069cb2 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -61,14 +61,14 @@ namespace MediaBrowser.Api.UserLibrary if (request.UserId.HasValue) { user = UserManager.GetUserById(request.UserId.Value); - item = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : DtoService.GetItemByDtoId(request.ParentId, user.Id); + item = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId); libraryItems = user.RootFolder.GetRecursiveChildren(user).ToList(); } else { - item = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : DtoService.GetItemByDtoId(request.ParentId); + item = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); libraryItems = LibraryManager.RootFolder.RecursiveChildren.ToList(); } diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 74ce4a0a7f..f1b8b2d52b 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -373,11 +373,9 @@ namespace MediaBrowser.Api.UserLibrary /// private IEnumerable GetItemsToSerialize(GetItems request, User user) { - var userId = user == null ? (Guid?)null : user.Id; - var item = string.IsNullOrEmpty(request.ParentId) ? user == null ? _libraryManager.RootFolder : user.RootFolder : - _dtoService.GetItemByDtoId(request.ParentId, userId); + _libraryManager.GetItemById(request.ParentId); // Default list type = children IEnumerable items; @@ -386,7 +384,7 @@ namespace MediaBrowser.Api.UserLibrary { var idList = request.Ids.Split(',').ToList(); - items = idList.Select(i => _dtoService.GetItemByDtoId(i, userId)); + items = idList.Select(i => _libraryManager.GetItemById(i)); } else if (request.Recursive) diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs index 649f2ae02d..d145dd054f 100644 --- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs +++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs @@ -463,7 +463,9 @@ namespace MediaBrowser.Api.UserLibrary { var user = _userManager.GetUserById(request.UserId); - var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _dtoService.GetItemByDtoId(request.Id, user.Id); + var item = string.IsNullOrEmpty(request.Id) ? + user.RootFolder : + _libraryManager.GetItemById(request.Id); // Get everything var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList(); @@ -529,7 +531,7 @@ namespace MediaBrowser.Api.UserLibrary { var user = _userManager.GetUserById(request.UserId); - var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _dtoService.GetItemByDtoId(request.Id, user.Id); + var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); // Get everything var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList(); @@ -559,7 +561,7 @@ namespace MediaBrowser.Api.UserLibrary { var user = _userManager.GetUserById(request.UserId); - var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _dtoService.GetItemByDtoId(request.Id, user.Id); + var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); // Get everything var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList(); @@ -597,7 +599,7 @@ namespace MediaBrowser.Api.UserLibrary { var user = _userManager.GetUserById(request.UserId); - var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _dtoService.GetItemByDtoId(request.Id, user.Id); + var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); var items = _libraryManager.GetIntros(item, user); @@ -651,7 +653,7 @@ namespace MediaBrowser.Api.UserLibrary { var user = _userManager.GetUserById(userId); - var item = string.IsNullOrEmpty(itemId) ? user.RootFolder : _dtoService.GetItemByDtoId(itemId, user.Id); + var item = string.IsNullOrEmpty(itemId) ? user.RootFolder : _libraryManager.GetItemById(itemId); var key = item.GetUserDataKey(); @@ -701,7 +703,7 @@ namespace MediaBrowser.Api.UserLibrary { var user = _userManager.GetUserById(userId); - var item = string.IsNullOrEmpty(itemId) ? user.RootFolder : _dtoService.GetItemByDtoId(itemId, user.Id); + var item = string.IsNullOrEmpty(itemId) ? user.RootFolder : _libraryManager.GetItemById(itemId); var key = item.GetUserDataKey(); @@ -871,7 +873,7 @@ namespace MediaBrowser.Api.UserLibrary /// Task. private async Task UpdatePlayedStatus(User user, string itemId, bool wasPlayed, DateTime? datePlayed) { - var item = _dtoService.GetItemByDtoId(itemId, user.Id); + var item = _libraryManager.GetItemById(itemId); if (wasPlayed) { diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs index 940c82540c..f62e37f798 100644 --- a/MediaBrowser.Api/VideosService.cs +++ b/MediaBrowser.Api/VideosService.cs @@ -73,7 +73,7 @@ namespace MediaBrowser.Api ? (request.UserId.HasValue ? user.RootFolder : _libraryManager.RootFolder) - : _dtoService.GetItemByDtoId(request.Id, request.UserId); + : _libraryManager.GetItemById(request.Id); // Get everything var fields = Enum.GetNames(typeof(ItemFields)) @@ -104,7 +104,7 @@ namespace MediaBrowser.Api private async Task RemoveAlternateVersions(DeleteAlternateSources request) { - var video = (Video)_dtoService.GetItemByDtoId(request.Id); + var video = (Video)_libraryManager.GetItemById(request.Id); foreach (var link in video.GetLinkedAlternateVersions()) { diff --git a/MediaBrowser.Controller/Dto/IDtoService.cs b/MediaBrowser.Controller/Dto/IDtoService.cs index d07deaf233..b2081fe6bd 100644 --- a/MediaBrowser.Controller/Dto/IDtoService.cs +++ b/MediaBrowser.Controller/Dto/IDtoService.cs @@ -2,7 +2,6 @@ using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; -using System; using System.Collections.Generic; namespace MediaBrowser.Controller.Dto @@ -33,14 +32,6 @@ namespace MediaBrowser.Controller.Dto /// UserItemDataDto. UserItemDataDto GetUserItemDataDto(UserItemData data); - /// - /// Gets the item by dto id. - /// - /// The id. - /// The user id. - /// BaseItem. - BaseItem GetItemByDtoId(string id, Guid? userId = null); - /// /// Attaches the primary image aspect ratio. /// diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 680317237e..9e18dc9b02 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -342,5 +342,10 @@ namespace MediaBrowser.Controller.Library DeleteFileLocation = true }); } + + public static BaseItem GetItemById(this ILibraryManager manager, string id) + { + return manager.GetItemById(new Guid(id)); + } } } \ No newline at end of file diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index cc3f3d08b7..417c03f277 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -167,8 +167,10 @@ + + diff --git a/MediaBrowser.Controller/Notifications/INotificationManager.cs b/MediaBrowser.Controller/Notifications/INotificationManager.cs new file mode 100644 index 0000000000..8ed62f59f7 --- /dev/null +++ b/MediaBrowser.Controller/Notifications/INotificationManager.cs @@ -0,0 +1,49 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Notifications; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Notifications +{ + public interface INotificationManager + { + /// + /// Sends the notification. + /// + /// The request. + /// The cancellation token. + /// Task. + Task SendNotification(NotificationRequest request, CancellationToken cancellationToken); + + /// + /// Adds the parts. + /// + /// The services. + void AddParts(IEnumerable services); + } + + public interface INotificationService + { + /// + /// Gets the name. + /// + /// The name. + string Name { get; } + + /// + /// Sends the notification. + /// + /// The request. + /// The cancellation token. + /// Task. + Task SendNotification(UserNotification request, CancellationToken cancellationToken); + + /// + /// Determines whether [is enabled for user] [the specified user identifier]. + /// + /// The user. + /// true if [is enabled for user] [the specified user identifier]; otherwise, false. + bool IsEnabledForUser(User user); + } +} diff --git a/MediaBrowser.Controller/Notifications/INotificationsRepository.cs b/MediaBrowser.Controller/Notifications/INotificationsRepository.cs index 7a4b69b528..87b89e79c8 100644 --- a/MediaBrowser.Controller/Notifications/INotificationsRepository.cs +++ b/MediaBrowser.Controller/Notifications/INotificationsRepository.cs @@ -1,8 +1,7 @@ -using System.Threading; -using MediaBrowser.Controller.Persistence; -using MediaBrowser.Model.Notifications; +using MediaBrowser.Model.Notifications; using System; using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Controller.Notifications @@ -44,7 +43,7 @@ namespace MediaBrowser.Controller.Notifications /// The id. /// The user id. /// Notification. - Notification GetNotification(Guid id, Guid userId); + Notification GetNotification(string id, string userId); /// /// Adds the notification. @@ -54,14 +53,6 @@ namespace MediaBrowser.Controller.Notifications /// Task. Task AddNotification(Notification notification, CancellationToken cancellationToken); - /// - /// Updates the notification. - /// - /// The notification. - /// The cancellation token. - /// Task. - Task UpdateNotification(Notification notification, CancellationToken cancellationToken); - /// /// Marks the read. /// @@ -70,13 +61,13 @@ namespace MediaBrowser.Controller.Notifications /// if set to true [is read]. /// The cancellation token. /// Task. - Task MarkRead(IEnumerable notificationIdList, Guid userId, bool isRead, CancellationToken cancellationToken); + Task MarkRead(IEnumerable notificationIdList, string userId, bool isRead, CancellationToken cancellationToken); /// /// Gets the notifications summary. /// /// The user id. /// NotificationsSummary. - NotificationsSummary GetNotificationsSummary(Guid userId); + NotificationsSummary GetNotificationsSummary(string userId); } } diff --git a/MediaBrowser.Controller/Notifications/NotificationUpdateEventArgs.cs b/MediaBrowser.Controller/Notifications/NotificationUpdateEventArgs.cs index e156ca26a3..d8a6634dfc 100644 --- a/MediaBrowser.Controller/Notifications/NotificationUpdateEventArgs.cs +++ b/MediaBrowser.Controller/Notifications/NotificationUpdateEventArgs.cs @@ -10,8 +10,8 @@ namespace MediaBrowser.Controller.Notifications public class NotificationReadEventArgs : EventArgs { - public Guid[] IdList { get; set; } - public Guid UserId { get; set; } + public string[] IdList { get; set; } + public string UserId { get; set; } public bool IsRead { get; set; } } } diff --git a/MediaBrowser.Controller/Notifications/UserNotification.cs b/MediaBrowser.Controller/Notifications/UserNotification.cs new file mode 100644 index 0000000000..d035a3995c --- /dev/null +++ b/MediaBrowser.Controller/Notifications/UserNotification.cs @@ -0,0 +1,21 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Notifications; +using System; + +namespace MediaBrowser.Controller.Notifications +{ + public class UserNotification + { + public string Name { get; set; } + + public string Description { get; set; } + + public string Url { get; set; } + + public NotificationLevel Level { get; set; } + + public DateTime Date { get; set; } + + public User User { get; set; } + } +} diff --git a/MediaBrowser.Dlna/Server/ContentDirectory.cs b/MediaBrowser.Dlna/Server/ContentDirectory.cs index e657a2ff65..93c5cdec80 100644 --- a/MediaBrowser.Dlna/Server/ContentDirectory.cs +++ b/MediaBrowser.Dlna/Server/ContentDirectory.cs @@ -8,9 +8,7 @@ using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; -using System.Threading; namespace MediaBrowser.Dlna.Server { @@ -27,9 +25,6 @@ namespace MediaBrowser.Dlna.Server private readonly IEventManager _eventManager; - private int _systemUpdateId; - private Timer _systemUpdateTimer; - public ContentDirectory(IDlnaManager dlna, IUserDataManager userDataManager, IImageProcessor imageProcessor, @@ -49,9 +44,16 @@ namespace MediaBrowser.Dlna.Server _userManager = userManager; _eventManager = eventManager; _logger = logManager.GetLogger("DlnaContentDirectory"); + } + + private int SystemUpdateId + { + get + { + var now = DateTime.UtcNow; - _systemUpdateTimer = new Timer(SystemUdpateTimerCallback, null, Timeout.Infinite, - Convert.ToInt64(TimeSpan.FromMinutes(60).TotalMilliseconds)); + return now.Year + now.DayOfYear + now.Hour; + } } public string GetContentDirectoryXml(IDictionary headers) @@ -80,7 +82,7 @@ namespace MediaBrowser.Dlna.Server _imageProcessor, _userDataManager, user, - _systemUpdateId) + SystemUpdateId) .ProcessControlRequest(request); } @@ -110,40 +112,9 @@ namespace MediaBrowser.Dlna.Server return _userManager.Users.First(); } - private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - private async void SystemUdpateTimerCallback(object state) - { - var values = new Dictionary(); - - _systemUpdateId++; - values["SystemUpdateID"] = _systemUpdateId.ToString(_usCulture); - - try - { - await _eventManager.TriggerEvent("upnp:event", values).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.ErrorException("Error sending system update notification", ex); - } - } - - private readonly object _disposeLock = new object(); public void Dispose() { - lock (_disposeLock) - { - DisposeUpdateTimer(); - } - } - private void DisposeUpdateTimer() - { - if (_systemUpdateTimer != null) - { - _systemUpdateTimer.Dispose(); - _systemUpdateTimer = null; - } } } } diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs index 3233731063..bbd07817c4 100644 --- a/MediaBrowser.Model/ApiClient/IApiClient.cs +++ b/MediaBrowser.Model/ApiClient/IApiClient.cs @@ -140,19 +140,12 @@ namespace MediaBrowser.Model.ApiClient /// Task. Task MarkNotificationsRead(string userId, IEnumerable notificationIdList, bool isRead); - /// - /// Updates the notification. - /// - /// The notification. - /// Task. - Task UpdateNotification(Notification notification); - /// /// Adds the notification. /// /// The notification. /// Task{Notification}. - Task AddNotification(Notification notification); + Task SendNotification(NotificationRequest notification); /// /// Gets the notifications summary. diff --git a/MediaBrowser.Model/Notifications/Notification.cs b/MediaBrowser.Model/Notifications/Notification.cs index 14f55b6e17..511227cbf5 100644 --- a/MediaBrowser.Model/Notifications/Notification.cs +++ b/MediaBrowser.Model/Notifications/Notification.cs @@ -1,12 +1,13 @@ using System; +using System.Collections.Generic; namespace MediaBrowser.Model.Notifications { public class Notification { - public Guid Id { get; set; } + public string Id { get; set; } - public Guid UserId { get; set; } + public string UserId { get; set; } public DateTime Date { get; set; } @@ -17,16 +18,32 @@ namespace MediaBrowser.Model.Notifications public string Description { get; set; } public string Url { get; set; } - - public string Category { get; set; } - - public string RelatedId { get; set; } public NotificationLevel Level { get; set; } public Notification() { - Id = Guid.NewGuid(); + Date = DateTime.UtcNow; + } + } + + public class NotificationRequest + { + public string Name { get; set; } + + public string Description { get; set; } + + public string Url { get; set; } + + public NotificationLevel Level { get; set; } + + public List UserIds { get; set; } + + public DateTime Date { get; set; } + + public NotificationRequest() + { + UserIds = new List(); Date = DateTime.UtcNow; } } diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index ee6bbb04f0..480cb39dba 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -556,44 +556,6 @@ namespace MediaBrowser.Server.Implementations.Dto return dto; } - - /// - /// Gets a BaseItem based upon it's client-side item id - /// - /// The id. - /// The user id. - /// BaseItem. - public BaseItem GetItemByDtoId(string id, Guid? userId = null) - { - if (string.IsNullOrEmpty(id)) - { - throw new ArgumentNullException("id"); - } - - BaseItem item = null; - - if (userId.HasValue) - { - item = _libraryManager.GetItemById(new Guid(id)); - } - - // If we still don't find it, look within individual user views - if (item == null && !userId.HasValue) - { - foreach (var user in _userManager.Users) - { - item = GetItemByDtoId(id, user.Id); - - if (item != null) - { - break; - } - } - } - - return item; - } - /// /// Sets simple property values on a DTOBaseItem /// diff --git a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs index fcb4406abe..2a3668dfaa 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs @@ -20,20 +20,20 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications /// public class Notifications : IServerEntryPoint { - private readonly INotificationsRepository _notificationsRepo; private readonly IInstallationManager _installationManager; private readonly IUserManager _userManager; private readonly ILogger _logger; private readonly ITaskManager _taskManager; + private readonly INotificationManager _notificationManager; - public Notifications(IInstallationManager installationManager, INotificationsRepository notificationsRepo, IUserManager userManager, ILogger logger, ITaskManager taskManager) + public Notifications(IInstallationManager installationManager, IUserManager userManager, ILogger logger, ITaskManager taskManager, INotificationManager notificationManager) { _installationManager = installationManager; - _notificationsRepo = notificationsRepo; _userManager = userManager; _logger = logger; _taskManager = taskManager; + _notificationManager = notificationManager; } public void Run() @@ -49,21 +49,25 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications async void _userManager_UserCreated(object sender, GenericEventArgs e) { - var notification = new Notification + var userIds = _userManager + .Users + .Select(i => i.Id.ToString("N")) + .ToList(); + + var notification = new NotificationRequest { - UserId = e.Argument.Id, - Category = "UserCreated", + UserIds = userIds, Name = "Welcome to Media Browser!", Description = "Check back here for more notifications." }; try { - await _notificationsRepo.AddNotification(notification, CancellationToken.None).ConfigureAwait(false); + await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false); } catch (Exception ex) { - _logger.ErrorException("Error adding notification", ex); + _logger.ErrorException("Error sending notification", ex); } } @@ -73,29 +77,27 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications if (result.Status == TaskCompletionStatus.Failed) { - foreach (var user in _userManager - .Users - .Where(i => i.Configuration.IsAdministrator) - .ToList()) + var userIds = _userManager + .Users + .Where(i => i.Configuration.IsAdministrator) + .Select(i => i.Id.ToString("N")) + .ToList(); + + var notification = new NotificationRequest + { + UserIds = userIds, + Name = result.Name + " failed", + Description = result.ErrorMessage, + Level = NotificationLevel.Error + }; + + try { - var notification = new Notification - { - UserId = user.Id, - Category = "ScheduledTaskFailed", - Name = result.Name + " failed", - RelatedId = result.Name, - Description = result.ErrorMessage, - Level = NotificationLevel.Error - }; - - try - { - await _notificationsRepo.AddNotification(notification, CancellationToken.None).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.ErrorException("Error adding notification", ex); - } + await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error sending notification", ex); } } } @@ -104,27 +106,25 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications { var plugin = e.Argument; - foreach (var user in _userManager - .Users - .Where(i => i.Configuration.IsAdministrator) - .ToList()) + var userIds = _userManager + .Users + .Where(i => i.Configuration.IsAdministrator) + .Select(i => i.Id.ToString("N")) + .ToList(); + + var notification = new NotificationRequest { - var notification = new Notification - { - UserId = user.Id, - Category = "PluginUninstalled", - Name = plugin.Name + " has been uninstalled", - RelatedId = plugin.Id.ToString() - }; + UserIds = userIds, + Name = plugin.Name + " has been uninstalled" + }; - try - { - await _notificationsRepo.AddNotification(notification, CancellationToken.None).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.ErrorException("Error adding notification", ex); - } + try + { + await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error sending notification", ex); } } @@ -132,28 +132,26 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications { var installationInfo = e.InstallationInfo; - foreach (var user in _userManager - .Users - .Where(i => i.Configuration.IsAdministrator) - .ToList()) + var userIds = _userManager + .Users + .Where(i => i.Configuration.IsAdministrator) + .Select(i => i.Id.ToString("N")) + .ToList(); + + var notification = new NotificationRequest { - var notification = new Notification - { - UserId = user.Id, - Category = "PackageInstallationCompleted", - Name = installationInfo.Name + " " + installationInfo.Version + " was installed", - RelatedId = installationInfo.Name, - Description = e.PackageVersionInfo.description - }; + UserIds = userIds, + Name = installationInfo.Name + " " + installationInfo.Version + " was installed", + Description = e.PackageVersionInfo.description + }; - try - { - await _notificationsRepo.AddNotification(notification, CancellationToken.None).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.ErrorException("Error adding notification", ex); - } + try + { + await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error sending notification", ex); } } @@ -161,29 +159,27 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications { var installationInfo = e.InstallationInfo; - foreach (var user in _userManager + var userIds = _userManager .Users .Where(i => i.Configuration.IsAdministrator) - .ToList()) + .Select(i => i.Id.ToString("N")) + .ToList(); + + var notification = new NotificationRequest { - var notification = new Notification - { - UserId = user.Id, - Category = "PackageInstallationFailed", - Level = NotificationLevel.Error, - Name = installationInfo.Name + " " + installationInfo.Version + " installation failed", - RelatedId = installationInfo.Name, - Description = e.Exception.Message - }; + UserIds = userIds, + Level = NotificationLevel.Error, + Name = installationInfo.Name + " " + installationInfo.Version + " installation failed", + Description = e.Exception.Message + }; - try - { - await _notificationsRepo.AddNotification(notification, CancellationToken.None).ConfigureAwait(false); - } - catch (Exception ex) - { - _logger.ErrorException("Error adding notification", ex); - } + try + { + await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error sending notification", ex); } } diff --git a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/RemoteNotifications.cs b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/RemoteNotifications.cs index 723e4fdd31..d5b7f5b363 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/RemoteNotifications.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/RemoteNotifications.cs @@ -1,7 +1,6 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; -using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Notifications; using MediaBrowser.Controller.Plugins; @@ -26,22 +25,23 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications private readonly IApplicationPaths _appPaths; private readonly ILogger _logger; private readonly IJsonSerializer _json; - private readonly INotificationsRepository _notificationsRepo; private readonly IUserManager _userManager; private readonly IFileSystem _fileSystem; private readonly TimeSpan _frequency = TimeSpan.FromHours(6); private readonly TimeSpan _maxAge = TimeSpan.FromDays(31); - public RemoteNotifications(IApplicationPaths appPaths, ILogger logger, IHttpClient httpClient, IJsonSerializer json, INotificationsRepository notificationsRepo, IUserManager userManager, IFileSystem fileSystem) + private readonly INotificationManager _notificationManager; + + public RemoteNotifications(IApplicationPaths appPaths, ILogger logger, IHttpClient httpClient, IJsonSerializer json, IUserManager userManager, IFileSystem fileSystem, INotificationManager notificationManager) { _appPaths = appPaths; _logger = logger; _httpClient = httpClient; _json = json; - _notificationsRepo = notificationsRepo; _userManager = userManager; _fileSystem = fileSystem; + _notificationManager = notificationManager; } /// @@ -107,21 +107,19 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications .Where(i => string.Equals(i.active, "1") && i.date.ToUniversalTime() > lastRunTime && (DateTime.UtcNow - i.date.ToUniversalTime()) <= _maxAge) .ToList(); - foreach (var user in _userManager.Users.ToList()) + var userIds = _userManager.Users.Select(i => i.Id.ToString("N")).ToList(); + + foreach (var notification in notificationList) { - foreach (var notification in notificationList) + await _notificationManager.SendNotification(new NotificationRequest { - await _notificationsRepo.AddNotification(new Notification - { - Category = notification.category, - Date = notification.date, - Name = notification.name, - Description = notification.description, - Url = notification.url, - UserId = user.Id - - }, CancellationToken.None).ConfigureAwait(false); - } + Date = notification.date, + Name = notification.name, + Description = notification.description, + Url = notification.url, + UserIds = userIds + + }, CancellationToken.None).ConfigureAwait(false); } } diff --git a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/WebSocketNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/WebSocketNotifier.cs index c5a93720c7..42aadf62e5 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/WebSocketNotifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/WebSocketNotifier.cs @@ -30,9 +30,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications void _notificationsRepo_NotificationsMarkedRead(object sender, NotificationReadEventArgs e) { - var list = e.IdList.Select(i => i.ToString("N")).ToList(); + var list = e.IdList.ToList(); - list.Add(e.UserId.ToString("N")); + list.Add(e.UserId); list.Add(e.IsRead.ToString().ToLower()); var msg = string.Join("|", list.ToArray()); diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs index ac1927931f..28d4769714 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs @@ -117,7 +117,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio /// /// The list. /// true if the specified list contains music; otherwise, false. - public static bool ContainsMusic(IEnumerable list) + private static bool ContainsMusic(IEnumerable list) { // If list contains at least 2 audio files or at least one and no video files consider it to contain music var foundAudio = 0; diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 505325812c..7d6ddbb6ed 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -185,11 +185,13 @@ + + - + diff --git a/MediaBrowser.Server.Implementations/Notifications/InternalNotificationService.cs b/MediaBrowser.Server.Implementations/Notifications/InternalNotificationService.cs new file mode 100644 index 0000000000..56cb52f108 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Notifications/InternalNotificationService.cs @@ -0,0 +1,42 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Notifications; +using MediaBrowser.Model.Notifications; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Server.Implementations.Notifications +{ + public class InternalNotificationService : INotificationService + { + private readonly INotificationsRepository _repo; + + public InternalNotificationService(INotificationsRepository repo) + { + _repo = repo; + } + + public string Name + { + get { return "Dashboard Notifications"; } + } + + public Task SendNotification(UserNotification request, CancellationToken cancellationToken) + { + return _repo.AddNotification(new Notification + { + Date = request.Date, + Description = request.Description, + Level = request.Level, + Name = request.Name, + Url = request.Url, + UserId = request.User.Id.ToString("N") + + }, cancellationToken); + } + + public bool IsEnabledForUser(User user) + { + return true; + } + } +} diff --git a/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs b/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs new file mode 100644 index 0000000000..d6caa5b68e --- /dev/null +++ b/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs @@ -0,0 +1,94 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Notifications; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Notifications; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Server.Implementations.Notifications +{ + public class NotificationManager : INotificationManager + { + private readonly ILogger _logger; + private readonly IUserManager _userManager; + private INotificationService[] _services; + + public NotificationManager(ILogManager logManager, IUserManager userManager) + { + _userManager = userManager; + _logger = logManager.GetLogger(GetType().Name); + } + + public Task SendNotification(NotificationRequest request, CancellationToken cancellationToken) + { + var users = request.UserIds.Select(i => _userManager.GetUserById(new Guid(i))); + + var tasks = _services.Select(i => SendNotification(request, i, users, cancellationToken)); + + return Task.WhenAll(tasks); + } + + public Task SendNotification(NotificationRequest request, + INotificationService service, + IEnumerable users, + CancellationToken cancellationToken) + { + users = users.Where(i => IsEnabledForUser(service, i)) + .ToList(); + + var tasks = users.Select(i => SendNotification(request, service, i, cancellationToken)); + + return Task.WhenAll(tasks); + + } + + public async Task SendNotification(NotificationRequest request, + INotificationService service, + User user, + CancellationToken cancellationToken) + { + var notification = new UserNotification + { + Date = request.Date, + Description = request.Description, + Level = request.Level, + Name = request.Name, + Url = request.Url, + User = user + }; + + _logger.Debug("Sending notification via {0} to user {1}", service.Name, user.Name); + + try + { + await service.SendNotification(notification, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error sending notification to {0}", ex, service.Name); + } + } + + private bool IsEnabledForUser(INotificationService service, User user) + { + try + { + return service.IsEnabledForUser(user); + } + catch (Exception ex) + { + _logger.ErrorException("Error in IsEnabledForUser", ex); + return false; + } + } + + public void AddParts(IEnumerable services) + { + _services = services.ToArray(); + } + } +} diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteNotificationsRepository.cs b/MediaBrowser.Server.Implementations/Notifications/SqliteNotificationsRepository.cs similarity index 92% rename from MediaBrowser.Server.Implementations/Persistence/SqliteNotificationsRepository.cs rename to MediaBrowser.Server.Implementations/Notifications/SqliteNotificationsRepository.cs index 0f9b4295ed..2424a66521 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteNotificationsRepository.cs +++ b/MediaBrowser.Server.Implementations/Notifications/SqliteNotificationsRepository.cs @@ -1,16 +1,17 @@ -using System.IO; -using MediaBrowser.Controller; +using MediaBrowser.Controller; using MediaBrowser.Controller.Notifications; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Notifications; +using MediaBrowser.Server.Implementations.Persistence; using System; using System.Collections.Generic; using System.Data; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; -namespace MediaBrowser.Server.Implementations.Persistence +namespace MediaBrowser.Server.Implementations.Notifications { public class SqliteNotificationsRepository : INotificationsRepository { @@ -134,7 +135,7 @@ namespace MediaBrowser.Server.Implementations.Persistence } } - public NotificationsSummary GetNotificationsSummary(Guid userId) + public NotificationsSummary GetNotificationsSummary(string userId) { var result = new NotificationsSummary(); @@ -142,7 +143,7 @@ namespace MediaBrowser.Server.Implementations.Persistence { cmd.CommandText = "select Level from Notifications where UserId=@UserId and IsRead=@IsRead"; - cmd.Parameters.Add(cmd, "@UserId", DbType.Guid).Value = userId; + cmd.Parameters.Add(cmd, "@UserId", DbType.Guid).Value = new Guid(userId); cmd.Parameters.Add(cmd, "@IsRead", DbType.Boolean).Value = false; using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) @@ -183,8 +184,8 @@ namespace MediaBrowser.Server.Implementations.Persistence { var notification = new Notification { - Id = reader.GetGuid(0), - UserId = reader.GetGuid(1), + Id = reader.GetGuid(0).ToString("N"), + UserId = reader.GetGuid(1).ToString("N"), Date = reader.GetDateTime(2).ToUniversalTime(), Name = reader.GetString(3) }; @@ -202,13 +203,6 @@ namespace MediaBrowser.Server.Implementations.Persistence notification.Level = GetLevel(reader, 6); notification.IsRead = reader.GetBoolean(7); - notification.Category = reader.GetString(8); - - if (!reader.IsDBNull(9)) - { - notification.RelatedId = reader.GetString(9); - } - return notification; } @@ -223,13 +217,13 @@ namespace MediaBrowser.Server.Implementations.Persistence /// or /// userId /// - public Notification GetNotification(Guid id, Guid userId) + public Notification GetNotification(string id, string userId) { - if (id == Guid.Empty) + if (string.IsNullOrEmpty(id)) { throw new ArgumentNullException("id"); } - if (userId == Guid.Empty) + if (string.IsNullOrEmpty(userId)) { throw new ArgumentNullException("userId"); } @@ -238,8 +232,8 @@ namespace MediaBrowser.Server.Implementations.Persistence { cmd.CommandText = "select Id,UserId,Date,Name,Description,Url,Level,IsRead,Category,RelatedId where Id=@Id And UserId = @UserId"; - cmd.Parameters.Add(cmd, "@Id", DbType.Guid).Value = id; - cmd.Parameters.Add(cmd, "@UserId", DbType.Guid).Value = userId; + cmd.Parameters.Add(cmd, "@Id", DbType.Guid).Value = new Guid(id); + cmd.Parameters.Add(cmd, "@UserId", DbType.Guid).Value = new Guid(userId); using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow)) { @@ -329,11 +323,11 @@ namespace MediaBrowser.Server.Implementations.Persistence /// Task. private async Task ReplaceNotification(Notification notification, CancellationToken cancellationToken) { - if (notification.Id == Guid.Empty) + if (string.IsNullOrEmpty(notification.Id)) { - throw new ArgumentException("The notification must have an id"); + notification.Id = Guid.NewGuid().ToString("N"); } - if (notification.UserId == Guid.Empty) + if (string.IsNullOrEmpty(notification.UserId)) { throw new ArgumentException("The notification must have a user id"); } @@ -348,16 +342,16 @@ namespace MediaBrowser.Server.Implementations.Persistence { transaction = _connection.BeginTransaction(); - _replaceNotificationCommand.GetParameter(0).Value = notification.Id; - _replaceNotificationCommand.GetParameter(1).Value = notification.UserId; + _replaceNotificationCommand.GetParameter(0).Value = new Guid(notification.Id); + _replaceNotificationCommand.GetParameter(1).Value = new Guid(notification.UserId); _replaceNotificationCommand.GetParameter(2).Value = notification.Date.ToUniversalTime(); _replaceNotificationCommand.GetParameter(3).Value = notification.Name; _replaceNotificationCommand.GetParameter(4).Value = notification.Description; _replaceNotificationCommand.GetParameter(5).Value = notification.Url; _replaceNotificationCommand.GetParameter(6).Value = notification.Level.ToString(); _replaceNotificationCommand.GetParameter(7).Value = notification.IsRead; - _replaceNotificationCommand.GetParameter(8).Value = notification.Category; - _replaceNotificationCommand.GetParameter(9).Value = notification.RelatedId; + _replaceNotificationCommand.GetParameter(8).Value = string.Empty; + _replaceNotificationCommand.GetParameter(9).Value = string.Empty; _replaceNotificationCommand.Transaction = transaction; @@ -404,9 +398,10 @@ namespace MediaBrowser.Server.Implementations.Persistence /// if set to true [is read]. /// The cancellation token. /// Task. - public async Task MarkRead(IEnumerable notificationIdList, Guid userId, bool isRead, CancellationToken cancellationToken) + public async Task MarkRead(IEnumerable notificationIdList, string userId, bool isRead, CancellationToken cancellationToken) { - var idArray = notificationIdList.ToArray(); + var list = notificationIdList.ToList(); + var idArray = list.Select(i => new Guid(i)).ToArray(); await MarkReadInternal(idArray, userId, isRead, cancellationToken).ConfigureAwait(false); @@ -416,7 +411,7 @@ namespace MediaBrowser.Server.Implementations.Persistence { NotificationsMarkedRead(this, new NotificationReadEventArgs { - IdList = idArray.ToArray(), + IdList = list.ToArray(), IsRead = isRead, UserId = userId }); @@ -428,7 +423,7 @@ namespace MediaBrowser.Server.Implementations.Persistence } } - private async Task MarkReadInternal(IEnumerable notificationIdList, Guid userId, bool isRead, CancellationToken cancellationToken) + private async Task MarkReadInternal(IEnumerable notificationIdList, string userId, bool isRead, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); @@ -442,7 +437,7 @@ namespace MediaBrowser.Server.Implementations.Persistence transaction = _connection.BeginTransaction(); - _markReadCommand.GetParameter(0).Value = userId; + _markReadCommand.GetParameter(0).Value = new Guid(userId); _markReadCommand.GetParameter(1).Value = isRead; foreach (var id in notificationIdList) diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index 8ee060c3c3..2eeb075ee2 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -56,6 +56,7 @@ using MediaBrowser.Server.Implementations.Library; using MediaBrowser.Server.Implementations.LiveTv; using MediaBrowser.Server.Implementations.Localization; using MediaBrowser.Server.Implementations.MediaEncoder; +using MediaBrowser.Server.Implementations.Notifications; using MediaBrowser.Server.Implementations.Persistence; using MediaBrowser.Server.Implementations.ServerManager; using MediaBrowser.Server.Implementations.Session; @@ -189,6 +190,8 @@ namespace MediaBrowser.ServerApplication private IFileOrganizationRepository FileOrganizationRepository { get; set; } private IProviderRepository ProviderRepository { get; set; } + private INotificationManager NotificationManager { get; set; } + /// /// Initializes a new instance of the class. /// @@ -523,6 +526,9 @@ namespace MediaBrowser.ServerApplication LiveTvManager = new LiveTvManager(ServerConfigurationManager, FileSystemManager, Logger, ItemRepository, ImageProcessor, UserDataManager, DtoService, UserManager, LibraryManager, TaskManager); RegisterSingleInstance(LiveTvManager); + NotificationManager = new NotificationManager(LogManager, UserManager); + RegisterSingleInstance(NotificationManager); + var displayPreferencesTask = Task.Run(async () => await ConfigureDisplayPreferencesRepositories().ConfigureAwait(false)); var itemsTask = Task.Run(async () => await ConfigureItemRepositories().ConfigureAwait(false)); var userdataTask = Task.Run(async () => await ConfigureUserDataRepositories().ConfigureAwait(false)); @@ -705,6 +711,8 @@ namespace MediaBrowser.ServerApplication SessionManager.AddParts(GetExports()); ChannelManager.AddParts(GetExports()); + + NotificationManager.AddParts(GetExports()); } ///