From 3a8f72ed0da839dfc3617e57d54e6a23397492f4 Mon Sep 17 00:00:00 2001 From: Jamie Date: Fri, 1 Jun 2018 10:43:11 +0100 Subject: [PATCH 1/8] Inital Migration --- src/Ombi.Tests/Ombi.Tests.csproj | 2 +- src/Ombi.Updater/Ombi.Updater.csproj | 2 +- src/Ombi/Ombi.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Ombi.Tests/Ombi.Tests.csproj b/src/Ombi.Tests/Ombi.Tests.csproj index 0880682f2..6296d9e8c 100644 --- a/src/Ombi.Tests/Ombi.Tests.csproj +++ b/src/Ombi.Tests/Ombi.Tests.csproj @@ -1,7 +1,7 @@ - netcoreapp2.0 + netcoreapp2.1 false diff --git a/src/Ombi.Updater/Ombi.Updater.csproj b/src/Ombi.Updater/Ombi.Updater.csproj index 3a55a7040..f7152102a 100644 --- a/src/Ombi.Updater/Ombi.Updater.csproj +++ b/src/Ombi.Updater/Ombi.Updater.csproj @@ -3,7 +3,7 @@ Exe win10-x64;win10-x86;osx-x64;ubuntu-x64;debian.8-x64;centos.7-x64;linux-x64;linux-arm;linux-arm64; - netcoreapp2.0 + netcoreapp2.1 3.0.0.0 3.0.0.0 diff --git a/src/Ombi/Ombi.csproj b/src/Ombi/Ombi.csproj index 8b9e00c45..25fd06e90 100644 --- a/src/Ombi/Ombi.csproj +++ b/src/Ombi/Ombi.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 win10-x64;win10-x86;osx-x64;ubuntu-x64;debian.8-x64;centos.7-x64;linux-x64;linux-arm;linux-arm64; false Latest From 12b4bf2f5fbc30de999a436080ed04b2291ba6b9 Mon Sep 17 00:00:00 2001 From: Jamie Date: Fri, 1 Jun 2018 10:52:21 +0100 Subject: [PATCH 2/8] Upgrade packages --- src/Ombi.Api.Radarr/Ombi.Api.Radarr.csproj | 2 +- src/Ombi.Api.Service/Ombi.Api.Service.csproj | 2 +- src/Ombi.Api/Ombi.Api.csproj | 2 +- src/Ombi.Core.Tests/Ombi.Core.Tests.csproj | 2 +- src/Ombi.Core/Ombi.Core.csproj | 6 +++--- .../Ombi.DependencyInjection.csproj | 6 +++--- src/Ombi.Helpers/Ombi.Helpers.csproj | 4 ++-- .../Ombi.Notifications.Tests.csproj | 2 +- src/Ombi.Notifications/Ombi.Notifications.csproj | 2 +- .../Ombi.Schedule.Tests.csproj | 4 ++-- src/Ombi.Settings/Ombi.Settings.csproj | 2 +- src/Ombi.Store/Ombi.Store.csproj | 8 ++++---- src/Ombi.Tests/Ombi.Tests.csproj | 2 +- src/Ombi.Updater/Ombi.Updater.csproj | 16 ++++++++-------- src/Ombi/Ombi.csproj | 8 ++++---- 15 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/Ombi.Api.Radarr/Ombi.Api.Radarr.csproj b/src/Ombi.Api.Radarr/Ombi.Api.Radarr.csproj index d2b605337..ff506dc35 100644 --- a/src/Ombi.Api.Radarr/Ombi.Api.Radarr.csproj +++ b/src/Ombi.Api.Radarr/Ombi.Api.Radarr.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Ombi.Api.Service/Ombi.Api.Service.csproj b/src/Ombi.Api.Service/Ombi.Api.Service.csproj index 67f37c80d..4a7f4865e 100644 --- a/src/Ombi.Api.Service/Ombi.Api.Service.csproj +++ b/src/Ombi.Api.Service/Ombi.Api.Service.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Ombi.Api/Ombi.Api.csproj b/src/Ombi.Api/Ombi.Api.csproj index 32fc60bb6..533bcfcda 100644 --- a/src/Ombi.Api/Ombi.Api.csproj +++ b/src/Ombi.Api/Ombi.Api.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Ombi.Core.Tests/Ombi.Core.Tests.csproj b/src/Ombi.Core.Tests/Ombi.Core.Tests.csproj index d75ba3411..b9960aa7f 100644 --- a/src/Ombi.Core.Tests/Ombi.Core.Tests.csproj +++ b/src/Ombi.Core.Tests/Ombi.Core.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 diff --git a/src/Ombi.Core/Ombi.Core.csproj b/src/Ombi.Core/Ombi.Core.csproj index 2037113bd..1c09c88e3 100644 --- a/src/Ombi.Core/Ombi.Core.csproj +++ b/src/Ombi.Core/Ombi.Core.csproj @@ -12,9 +12,9 @@ - - - + + + diff --git a/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj b/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj index 675f6461b..d2f94127f 100644 --- a/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj +++ b/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/src/Ombi.Helpers/Ombi.Helpers.csproj b/src/Ombi.Helpers/Ombi.Helpers.csproj index 12c6fecc4..4b104eadb 100644 --- a/src/Ombi.Helpers/Ombi.Helpers.csproj +++ b/src/Ombi.Helpers/Ombi.Helpers.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/src/Ombi.Notifications.Tests/Ombi.Notifications.Tests.csproj b/src/Ombi.Notifications.Tests/Ombi.Notifications.Tests.csproj index b350b93f4..01721db3f 100644 --- a/src/Ombi.Notifications.Tests/Ombi.Notifications.Tests.csproj +++ b/src/Ombi.Notifications.Tests/Ombi.Notifications.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.1 diff --git a/src/Ombi.Notifications/Ombi.Notifications.csproj b/src/Ombi.Notifications/Ombi.Notifications.csproj index 46a64072e..529f01357 100644 --- a/src/Ombi.Notifications/Ombi.Notifications.csproj +++ b/src/Ombi.Notifications/Ombi.Notifications.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj index bdfbd60e6..d147af88f 100644 --- a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj +++ b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj @@ -1,11 +1,11 @@ - netcoreapp2.0 + netcoreapp2.1 - + diff --git a/src/Ombi.Settings/Ombi.Settings.csproj b/src/Ombi.Settings/Ombi.Settings.csproj index 3cb56cb07..8709fd906 100644 --- a/src/Ombi.Settings/Ombi.Settings.csproj +++ b/src/Ombi.Settings/Ombi.Settings.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Ombi.Store/Ombi.Store.csproj b/src/Ombi.Store/Ombi.Store.csproj index 703bbf672..b9ff73ef1 100644 --- a/src/Ombi.Store/Ombi.Store.csproj +++ b/src/Ombi.Store/Ombi.Store.csproj @@ -10,10 +10,10 @@ - - - - + + + + diff --git a/src/Ombi.Tests/Ombi.Tests.csproj b/src/Ombi.Tests/Ombi.Tests.csproj index 6296d9e8c..639276a75 100644 --- a/src/Ombi.Tests/Ombi.Tests.csproj +++ b/src/Ombi.Tests/Ombi.Tests.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/Ombi.Updater/Ombi.Updater.csproj b/src/Ombi.Updater/Ombi.Updater.csproj index f7152102a..e46a45551 100644 --- a/src/Ombi.Updater/Ombi.Updater.csproj +++ b/src/Ombi.Updater/Ombi.Updater.csproj @@ -12,14 +12,14 @@ - - - - - - - - + + + + + + + + diff --git a/src/Ombi/Ombi.csproj b/src/Ombi/Ombi.csproj index 25fd06e90..add872a33 100644 --- a/src/Ombi/Ombi.csproj +++ b/src/Ombi/Ombi.csproj @@ -67,10 +67,10 @@ - - - - + + + + From 218b6b731d9b899a851445093fe96bb91f54985f Mon Sep 17 00:00:00 2001 From: Jamie Date: Fri, 1 Jun 2018 11:44:23 +0100 Subject: [PATCH 3/8] Fixed #2288 --- src/Ombi/ClientApp/app/requests/movierequests.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.ts b/src/Ombi/ClientApp/app/requests/movierequests.component.ts index fe6f3b73f..f26ce763f 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.ts @@ -99,7 +99,7 @@ export class MovieRequestsComponent implements OnInit { public removeRequest(request: IMovieRequests) { this.requestService.removeMovieRequest(request); this.removeRequestFromUi(request); - this.loadRequests(1, this.currentlyLoaded); + this.loadRequests(this.amountToLoad, this.currentlyLoaded = 0); } public changeAvailability(request: IMovieRequests, available: boolean) { From 3a4c3823569d9524209f7a40ba331f4d278c88e4 Mon Sep 17 00:00:00 2001 From: Jamie Date: Fri, 1 Jun 2018 13:05:10 +0100 Subject: [PATCH 4/8] Fixed the sorting and filtering on the Movie Requests page, it all functions correctly now --- .../Engine/Interfaces/IMovieRequestEngine.cs | 1 - .../Engine/Interfaces/IRequestEngine.cs | 3 +- src/Ombi.Core/Engine/MovieRequestEngine.cs | 145 +++++++++++------- src/Ombi.Core/Engine/TvRequestEngine.cs | 8 +- src/Ombi.Core/Models/UI/OrderFilterModel.cs | 11 ++ src/Ombi.Core/Models/UI/OrderType.cs | 12 ++ src/Ombi.Core/Models/UI/RequestsViewModel.cs | 10 ++ .../ClientApp/app/interfaces/IRequestModel.ts | 13 +- .../app/requests/movierequests.component.html | 108 ++++++------- .../app/requests/movierequests.component.ts | 95 +++++------- .../ClientApp/app/services/request.service.ts | 11 +- src/Ombi/Controllers/RequestController.cs | 40 +++-- src/Ombi/wwwroot/translations/en.json | 10 +- 13 files changed, 259 insertions(+), 208 deletions(-) create mode 100644 src/Ombi.Core/Models/UI/OrderFilterModel.cs create mode 100644 src/Ombi.Core/Models/UI/OrderType.cs create mode 100644 src/Ombi.Core/Models/UI/RequestsViewModel.cs diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs index c1ba76a7c..91cbb9e72 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs @@ -17,7 +17,6 @@ namespace Ombi.Core.Engine.Interfaces Task ApproveMovie(MovieRequests request); Task ApproveMovieById(int requestId); Task DenyMovieById(int modelId); - Task> Filter(FilterViewModel vm); } diff --git a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs index 553ad79dd..740428ec7 100644 --- a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Ombi.Core.Models.Requests; +using Ombi.Core.Models.UI; using Ombi.Store.Entities; namespace Ombi.Core.Engine.Interfaces @@ -12,7 +13,7 @@ namespace Ombi.Core.Engine.Interfaces //Task> GetNewRequests(); //Task> GetAvailableRequests(); RequestCountModel RequestCount(); - Task> GetRequests(int count, int position); + Task> GetRequests(int count, int position, OrderFilterModel model); Task> GetRequests(); Task UserHasRequest(string userId); diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 460752bb1..15383ed12 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -13,6 +13,7 @@ using Microsoft.Extensions.Logging; using Ombi.Api.TheMovieDb.Models; using Ombi.Core.Authentication; using Ombi.Core.Engine.Interfaces; +using Ombi.Core.Models.UI; using Ombi.Core.Rule.Interfaces; using Ombi.Core.Settings; using Ombi.Settings.Settings.Models; @@ -25,7 +26,8 @@ namespace Ombi.Core.Engine { public MovieRequestEngine(IMovieDbApi movieApi, IRequestServiceMain requestService, IPrincipal user, INotificationHelper helper, IRuleEvaluator r, IMovieSender sender, ILogger log, - OmbiUserManager manager, IRepository rl, ICacheService cache, ISettingsService ombiSettings, IRepository sub) + OmbiUserManager manager, IRepository rl, ICacheService cache, + ISettingsService ombiSettings, IRepository sub) : base(user, requestService, r, manager, cache, ombiSettings, sub) { MovieApi = movieApi; @@ -58,6 +60,7 @@ namespace Ombi.Core.Engine ErrorMessage = $"Please try again later" }; } + var fullMovieName = $"{movieInfo.Title}{(!string.IsNullOrEmpty(movieInfo.ReleaseDate) ? $" ({DateTime.Parse(movieInfo.ReleaseDate).Year})" : string.Empty)}"; @@ -82,7 +85,8 @@ namespace Ombi.Core.Engine }; var usDates = movieInfo.ReleaseDates?.Results?.FirstOrDefault(x => x.IsoCode == "US"); - requestModel.DigitalReleaseDate = usDates?.ReleaseDate?.FirstOrDefault(x => x.Type == ReleaseDateType.Digital)?.ReleaseDate; + requestModel.DigitalReleaseDate = usDates?.ReleaseDate + ?.FirstOrDefault(x => x.Type == ReleaseDateType.Digital)?.ReleaseDate; var ruleResults = (await RunRequestRules(requestModel)).ToList(); if (ruleResults.Any(x => !x.Success)) @@ -125,25 +129,93 @@ namespace Ombi.Core.Engine /// /// The count. /// The position. + /// The order/filter type. /// - public async Task> GetRequests(int count, int position) + public async Task> GetRequests(int count, int position, + OrderFilterModel orderFilter) { var shouldHide = await HideFromOtherUsers(); - List allRequests; + IQueryable allRequests; if (shouldHide.Hide) { - allRequests = await MovieRepository.GetWithUser(shouldHide.UserId).Skip(position).Take(count).OrderByDescending(x => x.ReleaseDate).ToListAsync(); + allRequests = + MovieRepository.GetWithUser(shouldHide + .UserId); //.Skip(position).Take(count).OrderByDescending(x => x.ReleaseDate).ToListAsync(); } else { - allRequests = await MovieRepository.GetWithUser().Skip(position).Take(count).OrderByDescending(x => x.ReleaseDate).ToListAsync(); + allRequests = + MovieRepository + .GetWithUser(); //.Skip(position).Take(count).OrderByDescending(x => x.ReleaseDate).ToListAsync(); } - allRequests.ForEach(async x => + + switch (orderFilter.AvailabilityFilter) + { + case FilterType.None: + break; + case FilterType.Available: + allRequests = allRequests.Where(x => x.Available); + break; + case FilterType.NotAvailable: + allRequests = allRequests.Where(x => !x.Available); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + switch (orderFilter.StatusFilter) + { + case FilterType.None: + break; + case FilterType.Approved: + allRequests = allRequests.Where(x => x.Approved); + break; + case FilterType.Processing: + allRequests = allRequests.Where(x => x.Approved && !x.Available); + break; + case FilterType.PendingApproval: + allRequests = allRequests.Where(x => !x.Approved && !x.Available && !(x.Denied ?? false)); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + var total = allRequests.Count(); + + var requests = await (OrderMovies(allRequests, orderFilter.OrderType)).Skip(position).Take(count) + .ToListAsync(); + + requests.ForEach(async x => { x.PosterPath = PosterPathHelper.FixPosterPath(x.PosterPath); await CheckForSubscription(shouldHide, x); }); - return allRequests; + return new RequestsViewModel + { + Collection = requests, + Total = total + }; + } + + private IQueryable OrderMovies(IQueryable allRequests, OrderType type) + { + switch (type) + { + case OrderType.RequestedDateAsc: + return allRequests.OrderBy(x => x.RequestedDate); + case OrderType.RequestedDateDesc: + return allRequests.OrderByDescending(x => x.RequestedDate); + case OrderType.TitleAsc: + return allRequests.OrderBy(x => x.Title); + case OrderType.TitleDesc: + return allRequests.OrderByDescending(x => x.Title); + case OrderType.StatusAsc: + return allRequests.OrderBy(x => x.Status); + case OrderType.StatusDesc: + return allRequests.OrderByDescending(x => x.Status); + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } } public async Task GetTotal() @@ -216,6 +288,7 @@ namespace Ombi.Core.Engine { allRequests = await MovieRepository.GetWithUser().ToListAsync(); } + var results = allRequests.Where(x => x.Title.Contains(search, CompareOptions.IgnoreCase)).ToList(); results.ForEach(async x => { @@ -241,6 +314,7 @@ namespace Ombi.Core.Engine ErrorMessage = "Request does not exist" }; } + request.Denied = true; // We are denying a request NotificationHelper.Notify(request, NotificationType.RequestDeclined); @@ -261,6 +335,7 @@ namespace Ombi.Core.Engine ErrorMessage = "Request does not exist" }; } + request.Approved = true; request.Denied = false; await MovieRepository.Update(request); @@ -281,6 +356,7 @@ namespace Ombi.Core.Engine Result = true }; } + if (!result.Success) { Logger.LogWarning("Tried auto sending movie but failed. Message: {0}", result.Message); @@ -291,6 +367,7 @@ namespace Ombi.Core.Engine Result = false }; } + // If there are no providers then it's successful but movie has not been sent } @@ -352,6 +429,7 @@ namespace Ombi.Core.Engine ErrorMessage = "Request does not exist" }; } + request.Available = false; await MovieRepository.Update(request); @@ -372,6 +450,7 @@ namespace Ombi.Core.Engine ErrorMessage = "Request does not exist" }; } + request.Available = true; NotificationHelper.Notify(request, NotificationType.RequestAvailable); await MovieRepository.Update(request); @@ -401,55 +480,7 @@ namespace Ombi.Core.Engine RequestType = RequestType.Movie, }); - return new RequestEngineResult { Result = true, Message = $"{movieName} has been successfully added!" }; - } - - public async Task> Filter(FilterViewModel vm) - { - var shouldHide = await HideFromOtherUsers(); - var requests = shouldHide.Hide - ? MovieRepository.GetWithUser(shouldHide.UserId) - : MovieRepository.GetWithUser(); - - switch (vm.AvailabilityFilter) - { - case FilterType.None: - break; - case FilterType.Available: - requests = requests.Where(x => x.Available); - break; - case FilterType.NotAvailable: - requests = requests.Where(x => !x.Available); - break; - default: - throw new ArgumentOutOfRangeException(); - } - - switch (vm.StatusFilter) - { - case FilterType.None: - break; - case FilterType.Approved: - requests = requests.Where(x => x.Approved); - break; - case FilterType.Processing: - requests = requests.Where(x => x.Approved && !x.Available); - break; - case FilterType.PendingApproval: - requests = requests.Where(x => !x.Approved && !x.Available && !(x.Denied ?? false)); - break; - default: - throw new ArgumentOutOfRangeException(); - } - - var count = await requests.CountAsync(); - requests = requests.Skip(vm.Position).Take(vm.Count); - var retVal = new FilterResult - { - Total = count, - Collection = requests - }; - return retVal; + return new RequestEngineResult {Result = true, Message = $"{movieName} has been successfully added!"}; } } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index ddf84376e..8bb6d86e6 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -15,6 +15,7 @@ using Microsoft.EntityFrameworkCore; using Ombi.Core.Authentication; using Ombi.Core.Engine.Interfaces; using Ombi.Core.Helpers; +using Ombi.Core.Models.UI; using Ombi.Core.Rule; using Ombi.Core.Rule.Interfaces; using Ombi.Core.Senders; @@ -132,7 +133,7 @@ namespace Ombi.Core.Engine return await AddRequest(newRequest.NewRequest); } - public async Task> GetRequests(int count, int position) + public async Task> GetRequests(int count, int position, OrderFilterModel type) { var shouldHide = await HideFromOtherUsers(); List allRequests; @@ -161,7 +162,10 @@ namespace Ombi.Core.Engine allRequests.ForEach(async r => { await CheckForSubscription(shouldHide, r); }); - return allRequests; + return new RequestsViewModel + { + Collection = allRequests + }; } public async Task>>> GetRequestsTreeNode(int count, int position) diff --git a/src/Ombi.Core/Models/UI/OrderFilterModel.cs b/src/Ombi.Core/Models/UI/OrderFilterModel.cs new file mode 100644 index 000000000..3e3192829 --- /dev/null +++ b/src/Ombi.Core/Models/UI/OrderFilterModel.cs @@ -0,0 +1,11 @@ +using Ombi.Core.Models.Requests; + +namespace Ombi.Core.Models.UI +{ + public class OrderFilterModel + { + public FilterType AvailabilityFilter { get; set; } + public FilterType StatusFilter { get; set; } + public OrderType OrderType { get; set; } + } +} \ No newline at end of file diff --git a/src/Ombi.Core/Models/UI/OrderType.cs b/src/Ombi.Core/Models/UI/OrderType.cs new file mode 100644 index 000000000..67d20b127 --- /dev/null +++ b/src/Ombi.Core/Models/UI/OrderType.cs @@ -0,0 +1,12 @@ +namespace Ombi.Core.Models.UI +{ + public enum OrderType + { + RequestedDateAsc =1, + RequestedDateDesc =2, + TitleAsc =3, + TitleDesc=4, + StatusAsc=5, + StatusDesc=6 + } +} \ No newline at end of file diff --git a/src/Ombi.Core/Models/UI/RequestsViewModel.cs b/src/Ombi.Core/Models/UI/RequestsViewModel.cs new file mode 100644 index 000000000..9d772bc53 --- /dev/null +++ b/src/Ombi.Core/Models/UI/RequestsViewModel.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Ombi.Core.Models.UI +{ + public class RequestsViewModel + { + public IEnumerable Collection { get; set; } + public int Total { get; set; } + } +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts b/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts index 1895914c3..236e694fc 100644 --- a/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts +++ b/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts @@ -20,7 +20,7 @@ export interface IMovieRequests extends IFullBaseRequest { qualityOverrideTitle: string; } -export interface IFilterResult { +export interface IRequestsViewModel { total: number; collection: T[]; } @@ -87,6 +87,15 @@ export interface ITvUpdateModel { id: number; } +export enum OrderType { + RequestedDateAsc = 1, + RequestedDateDesc = 2, + TitleAsc = 3, + TitleDesc = 4, + StatusAsc = 5, + StatusDesc = 6, +} + export interface INewSeasonRequests { id: number; seasonNumber: number; @@ -112,8 +121,6 @@ export interface IMovieRequestModel { export interface IFilter { availabilityFilter: FilterType; statusFilter: FilterType; - position: number; - count: number; } export enum FilterType { diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.html b/src/Ombi/ClientApp/app/requests/movierequests.component.html index b2ea68db2..241e0af6b 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.html +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.html @@ -1,57 +1,45 @@ - + +
@@ -59,9 +47,7 @@
-
- - +
@@ -99,7 +85,7 @@ + [translate]="'Common.PendingApproval'">
@@ -125,11 +111,15 @@
-
+
@@ -171,7 +161,7 @@
- +
- @@ -198,7 +190,7 @@
- +
diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.ts b/src/Ombi/ClientApp/app/requests/movierequests.component.ts index f26ce763f..ede242e1d 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.ts @@ -9,7 +9,7 @@ import { Subject } from "rxjs/Subject"; import { AuthService } from "../auth/auth.service"; import { NotificationService, RadarrService, RequestService } from "../services"; -import { FilterType, IFilter, IIssueCategory, IMovieRequests, IPagenator, IRadarrProfile, IRadarrRootFolder } from "../interfaces"; +import { FilterType, IFilter, IIssueCategory, IMovieRequests, IPagenator, IRadarrProfile, IRadarrRootFolder, OrderType } from "../interfaces"; @Component({ selector: "movie-requests", @@ -38,9 +38,9 @@ export class MovieRequestsComponent implements OnInit { public filter: IFilter; public filterType = FilterType; - public order: string = "requestedDate"; - public reverse = true; - + public orderType: OrderType = OrderType.RequestedDateDesc; + public OrderType = OrderType; + public totalMovies: number = 100; private currentlyLoaded: number; private amountToLoad: number; @@ -75,20 +75,17 @@ export class MovieRequestsComponent implements OnInit { public ngOnInit() { this.amountToLoad = 10; - this.currentlyLoaded = 10; - this.loadInit(); - this.isAdmin = this.auth.hasRole("admin") || this.auth.hasRole("poweruser"); + this.currentlyLoaded = 10; this.filter = { availabilityFilter: FilterType.None, statusFilter: FilterType.None, - count: this.amountToLoad, - position: 0, }; + this.loadInit(); + this.isAdmin = this.auth.hasRole("admin") || this.auth.hasRole("poweruser"); } public paginate(event: IPagenator) { - const skipAmount = event.first; - + const skipAmount = event.first; this.loadRequests(this.amountToLoad, skipAmount); } @@ -183,38 +180,28 @@ export class MovieRequestsComponent implements OnInit { public filterAvailability(filter: FilterType, el: any) { this.filterActiveStyle(el); this.filter.availabilityFilter = filter; - this.requestService.filterMovies(this.filter) - .subscribe(x => { - this.totalMovies = x.total; - this.setOverrides(x.collection); - this.movieRequests = x.collection; - }); + debugger; + this.loadInit(); } public filterStatus(filter: FilterType, el: any) { this.filterActiveStyle(el); this.filter.statusFilter = filter; - this.requestService.filterMovies(this.filter) - .subscribe(x => { - this.totalMovies = x.total; - this.setOverrides(x.collection); - this.movieRequests = x.collection; - }); + this.loadInit(); } - public setOrder(value: string, el: any) { + public setOrder(value: OrderType, el: any) { el = el.toElement || el.relatedTarget || el.target || el.srcElement; const parent = el.parentElement; const previousFilter = parent.querySelector(".active"); - if (this.order === value) { - this.reverse = !this.reverse; - } else { - previousFilter.className = ""; - el.className = "active"; - } - this.order = value; + previousFilter.className = ""; + el.className = "active"; + + this.orderType = value; + + this.loadInit(); } public subscribe(request: IMovieRequests) { @@ -252,26 +239,16 @@ export class MovieRequestsComponent implements OnInit { } private loadRequests(amountToLoad: number, currentlyLoaded: number) { - if(this.filter.availabilityFilter === FilterType.None && this.filter.statusFilter === FilterType.None) { - this.requestService.getMovieRequests(amountToLoad, currentlyLoaded + 1) + this.requestService.getMovieRequests(amountToLoad, currentlyLoaded, this.orderType, this.filter) .subscribe(x => { - this.setOverrides(x); + this.setOverrides(x.collection); if(!this.movieRequests) { this.movieRequests = []; } - this.movieRequests = x; + this.movieRequests = x.collection; + this.totalMovies = x.total; this.currentlyLoaded = currentlyLoaded + amountToLoad; }); - } else { - this.filter.position = currentlyLoaded; - this.requestService.filterMovies(this.filter) - .subscribe(x => { - this.setOverrides(x.collection); - this.totalMovies = x.total; - this.movieRequests = x.collection; - this.currentlyLoaded = currentlyLoaded + amountToLoad; - }); - } } private updateRequest(request: IMovieRequests) { @@ -310,23 +287,25 @@ export class MovieRequestsComponent implements OnInit { } private loadInit() { - this.requestService.getTotalMovies().subscribe(x => this.totalMovies = x); - this.requestService.getMovieRequests(this.amountToLoad, 0) + this.requestService.getMovieRequests(this.amountToLoad, 0, this.orderType, this.filter) .subscribe(x => { - this.movieRequests = x; + this.movieRequests = x.collection; + this.totalMovies = x.total; this.movieRequests.forEach((req) => { - this.setBackground(req); - this.setPoster(req); - }); - this.radarrService.getQualityProfilesFromSettings().subscribe(c => { - this.radarrProfiles = c; - this.movieRequests.forEach((req) => this.setQualityOverrides(req)); - }); - this.radarrService.getRootFoldersFromSettings().subscribe(c => { - this.radarrRootFolders = c; - this.movieRequests.forEach((req) => this.setRootFolderOverrides(req)); + this.setBackground(req); + this.setPoster(req); }); + if (this.isAdmin) { + this.radarrService.getQualityProfilesFromSettings().subscribe(c => { + this.radarrProfiles = c; + this.movieRequests.forEach((req) => this.setQualityOverrides(req)); + }); + this.radarrService.getRootFoldersFromSettings().subscribe(c => { + this.radarrRootFolders = c; + this.movieRequests.forEach((req) => this.setRootFolderOverrides(req)); + }); + } }); } diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index 2da0c1a8a..e52ab3057 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -6,7 +6,7 @@ import { Observable } from "rxjs/Rx"; import { TreeNode } from "primeng/primeng"; import { IRequestEngineResult } from "../interfaces"; -import { IChildRequests, IFilter, IFilterResult, IMovieRequestModel, IMovieRequests, IMovieUpdateModel, ITvRequests,ITvUpdateModel } from "../interfaces"; +import { IChildRequests, IFilter, IMovieRequestModel, IMovieRequests, IMovieUpdateModel, IRequestsViewModel, ITvRequests,ITvUpdateModel, OrderType } from "../interfaces"; import { ITvRequestViewModel } from "../interfaces"; import { ServiceHelpers } from "./service.helpers"; @@ -48,8 +48,8 @@ export class RequestService extends ServiceHelpers { return this.http.post(`${this.url}Movie/unavailable`, JSON.stringify(movie), {headers: this.headers}); } - public getMovieRequests(count: number, position: number): Observable { - return this.http.get(`${this.url}movie/${count}/${position}`, {headers: this.headers}); + public getMovieRequests(count: number, position: number, order: OrderType, filter: IFilter): Observable> { + return this.http.get>(`${this.url}movie/${count}/${position}/${order}/${filter.statusFilter}/${filter.availabilityFilter}`, {headers: this.headers}); } public searchMovieRequests(search: string): Observable { @@ -114,10 +114,7 @@ export class RequestService extends ServiceHelpers { public deleteChild(child: IChildRequests): Observable { return this.http.delete(`${this.url}tv/child/${child.id}`, {headers: this.headers}); } - public filterMovies(filter: IFilter): Observable> { - return this.http.post>(`${this.url}movie/filter`, JSON.stringify(filter), {headers: this.headers}); - } - + public subscribeToMovie(requestId: number): Observable { return this.http.post(`${this.url}movie/subscribe/${requestId}`, {headers: this.headers}); } diff --git a/src/Ombi/Controllers/RequestController.cs b/src/Ombi/Controllers/RequestController.cs index 0a56c32b6..47329a0ec 100644 --- a/src/Ombi/Controllers/RequestController.cs +++ b/src/Ombi/Controllers/RequestController.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Ombi.Store.Entities.Requests; using System.Diagnostics; +using Ombi.Core.Models.UI; using Ombi.Models; using Ombi.Store.Entities; @@ -32,10 +33,18 @@ namespace Ombi.Controllers /// /// The count of items you want to return. /// The position. - [HttpGet("movie/{count:int}/{position:int}")] - public async Task> GetRequests(int count, int position) + /// The way we want to order. + /// + /// + [HttpGet("movie/{count:int}/{position:int}/{orderType:int}/{statusType:int}/{availabilityType:int}")] + public async Task> GetRequests(int count, int position, int orderType, int statusType, int availabilityType) { - return await MovieRequestEngine.GetRequests(count, position); + return await MovieRequestEngine.GetRequests(count, position, new OrderFilterModel + { + OrderType = (OrderType)orderType, + AvailabilityFilter = (FilterType)availabilityType, + StatusFilter = (FilterType)statusType, + }); } /// @@ -170,11 +179,19 @@ namespace Ombi.Controllers /// /// The count of items you want to return. /// The position. + /// + /// + /// /// - [HttpGet("tv/{count:int}/{position:int}")] - public async Task> GetTvRequests(int count, int position) + [HttpGet("tv/{count:int}/{position:int}/{orderType:int}/{statusFilterType:int}/{availabilityFilterType:int}")] + public async Task> GetTvRequests(int count, int position, int orderType, int statusType, int availabilityType) { - return await TvRequestEngine.GetRequests(count, position); + return await TvRequestEngine.GetRequests(count, position, new OrderFilterModel + { + OrderType = (OrderType)orderType, + AvailabilityFilter = (FilterType) availabilityType, + StatusFilter = (FilterType) statusType, + }); } /// @@ -347,17 +364,6 @@ namespace Ombi.Controllers return movies || tv; } - /// - /// Returns a filtered list - /// - /// - /// - [HttpPost("movie/filter")] - public async Task> Filter([FromBody] FilterViewModel vm) - { - return await MovieRequestEngine.Filter(vm); - } - /// /// Subscribes for notifications to a movie request /// diff --git a/src/Ombi/wwwroot/translations/en.json b/src/Ombi/wwwroot/translations/en.json index cb7c0fe8b..289db8be5 100644 --- a/src/Ombi/wwwroot/translations/en.json +++ b/src/Ombi/wwwroot/translations/en.json @@ -138,10 +138,12 @@ "Filter":"Filter", "Sort":"Sort", "SeasonNumberHeading":"Season: {seasonNumber}", - "SortTitle":"Title", - "SortRequestDate": "Request Date", - "SortRequestedBy":"Requested By", - "SortStatus":"Status" + "SortTitleAsc":"Title ▲", + "SortTitleDesc":"Title ▼", + "SortRequestDateAsc": "Request Date ▲", + "SortRequestDateDesc": "Request Date ▼", + "SortStatusAsc":"Status ▲", + "SortStatusDesc":"Status ▼" }, "Issues":{ "Title":"Issues", From c354efb5001e4505c9d62c947fbb96c0ce99b990 Mon Sep 17 00:00:00 2001 From: Jamie Date: Fri, 1 Jun 2018 13:06:41 +0100 Subject: [PATCH 5/8] !wip removed debugger statement --- src/Ombi/ClientApp/app/requests/movierequests.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.ts b/src/Ombi/ClientApp/app/requests/movierequests.component.ts index ede242e1d..0848daf53 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.ts @@ -180,7 +180,6 @@ export class MovieRequestsComponent implements OnInit { public filterAvailability(filter: FilterType, el: any) { this.filterActiveStyle(el); this.filter.availabilityFilter = filter; - debugger; this.loadInit(); } From 3be460ea3b557101dd2cb25a4636d95f73309fd2 Mon Sep 17 00:00:00 2001 From: Jamie Date: Fri, 1 Jun 2018 13:23:53 +0100 Subject: [PATCH 6/8] Fixed the SickRage/Medusa Issue where it was always being set as Skipped/Ignore #2084 --- src/Ombi.Core/Senders/TvSender.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Ombi.Core/Senders/TvSender.cs b/src/Ombi.Core/Senders/TvSender.cs index 151ad0f7b..12124d270 100644 --- a/src/Ombi.Core/Senders/TvSender.cs +++ b/src/Ombi.Core/Senders/TvSender.cs @@ -314,9 +314,17 @@ namespace Ombi.Core.Senders foreach (var seasonRequests in model.SeasonRequests) { var srEpisodes = await SickRageApi.GetEpisodesForSeason(tvdbid, seasonRequests.SeasonNumber, settings.ApiKey, settings.FullUri); - while (srEpisodes.message.Equals("Show not found", StringComparison.CurrentCultureIgnoreCase) && srEpisodes.data.Count <= 0) + int retryTimes = 10; + var currentRetry = 0; + while (srEpisodes.message.Equals("Show not found", StringComparison.CurrentCultureIgnoreCase) || srEpisodes.message.Equals("Season not found", StringComparison.CurrentCultureIgnoreCase) && srEpisodes.data.Count <= 0) { + if (currentRetry > retryTimes) + { + Logger.LogWarning("Couldnt find the SR Season or Show, message: {0}", srEpisodes.message); + break; + } await Task.Delay(TimeSpan.FromSeconds(1)); + currentRetry++; srEpisodes = await SickRageApi.GetEpisodesForSeason(tvdbid, seasonRequests.SeasonNumber, settings.ApiKey, settings.FullUri); } From b6efe9760234f214d51afe00e2c8ccf78a35039d Mon Sep 17 00:00:00 2001 From: Jamie Date: Tue, 12 Jun 2018 21:33:47 +0100 Subject: [PATCH 7/8] Update build.cake --- build.cake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cake b/build.cake index a497c5f77..d200eac98 100644 --- a/build.cake +++ b/build.cake @@ -26,7 +26,7 @@ var csProj = "./src/Ombi/Ombi.csproj"; // Path to the project.csproj var solutionFile = "Ombi.sln"; // Solution file if needed GitVersion versionInfo = null; -var frameworkVer = "netcoreapp2.0"; +var frameworkVer = "netcoreapp2.1"; var buildSettings = new DotNetCoreBuildSettings { From dc30f7b6657d12169618e6774ca2cccb84260790 Mon Sep 17 00:00:00 2001 From: Jamie Date: Wed, 13 Jun 2018 08:38:18 +0100 Subject: [PATCH 8/8] Update appveyor.yml --- appveyor.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 39d67b91d..862993a21 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,19 +15,19 @@ test: off after_build: - cmd: >- - appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.0\windows.zip" + appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.1\windows.zip" - appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.0\osx.tar.gz" + appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.1\osx.tar.gz" - appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.0\linux.tar.gz" + appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.1\linux.tar.gz" - appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.0\linux-arm.tar.gz" + appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.1\linux-arm.tar.gz" - appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.0\windows-32bit.zip" + appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.1\windows-32bit.zip" # appveyor PushArtifact "%APPVEYOR_BUILD_FOLDER%\src\Ombi\bin\Release\netcoreapp2.0\linux-arm64.tar.gz"