From 9c574fb7e901ac16fd9c76e1a5dd3744140632f7 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 5 Sep 2018 00:12:19 +0100 Subject: [PATCH 1/4] Add quota fields to user view model --- .../Engine/Interfaces/IRequestEngine.cs | 2 +- src/Ombi.Core/Engine/MovieRequestEngine.cs | 8 ++++++-- src/Ombi.Core/Engine/TvRequestEngine.cs | 8 ++++++-- src/Ombi.Core/Models/UI/UserViewModel.cs | 2 ++ src/Ombi/ClientApp/app/interfaces/IUser.ts | 4 ++++ .../usermanagement-add.component.ts | 2 ++ src/Ombi/Controllers/IdentityController.cs | 20 +++++++++++++++++-- 7 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs index 53111fd95..c8b7746f0 100644 --- a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs @@ -23,6 +23,6 @@ namespace Ombi.Core.Engine.Interfaces Task GetTotal(); Task UnSubscribeRequest(int requestId, RequestType type); Task SubscribeToRequest(int requestId, RequestType type); - Task GetRemainingRequests(); + Task GetRemainingRequests(OmbiUser user = null); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 733ba4b4f..0cce7af58 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -486,9 +486,13 @@ namespace Ombi.Core.Engine return new RequestEngineResult {Result = true, Message = $"{movieName} has been successfully added!"}; } - public async Task GetRemainingRequests() + public async Task GetRemainingRequests(OmbiUser user) { - OmbiUser user = await GetUser(); + if (user == null) + { + user = await GetUser(); + } + int limit = user.MovieRequestLimit ?? 0; if (limit <= 0) diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index f9a6e640d..a700035a0 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -615,9 +615,13 @@ namespace Ombi.Core.Engine return new RequestEngineResult { Result = true }; } - public async Task GetRemainingRequests() + public async Task GetRemainingRequests(OmbiUser user) { - OmbiUser user = await GetUser(); + if (user == null) + { + user = await GetUser(); + } + int limit = user.EpisodeRequestLimit ?? 0; if (limit <= 0) diff --git a/src/Ombi.Core/Models/UI/UserViewModel.cs b/src/Ombi.Core/Models/UI/UserViewModel.cs index 1c1e6162b..cddc32b90 100644 --- a/src/Ombi.Core/Models/UI/UserViewModel.cs +++ b/src/Ombi.Core/Models/UI/UserViewModel.cs @@ -16,6 +16,8 @@ namespace Ombi.Core.Models.UI public UserType UserType { get; set; } public int MovieRequestLimit { get; set; } public int EpisodeRequestLimit { get; set; } + public RequestQuotaCountModel EpisodeRequestQuota { get; set; } + public RequestQuotaCountModel MovieRequestQuota { get; set; } } public class ClaimCheckboxes diff --git a/src/Ombi/ClientApp/app/interfaces/IUser.ts b/src/Ombi/ClientApp/app/interfaces/IUser.ts index cd96848fb..9e14dcfb4 100644 --- a/src/Ombi/ClientApp/app/interfaces/IUser.ts +++ b/src/Ombi/ClientApp/app/interfaces/IUser.ts @@ -1,4 +1,5 @@ import { ICheckbox } from "."; +import { IRemainingRequests } from "./IRemainingRequests"; export interface IUser { id: string; @@ -13,7 +14,10 @@ export interface IUser { movieRequestLimit: number; episodeRequestLimit: number; userAccessToken: string; + // FOR UI + episodeRequestQuota: IRemainingRequests | null; + movieRequestQuota: IRemainingRequests | null; checked: boolean; } diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts b/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts index 36b187e79..5e0799552 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts @@ -32,6 +32,8 @@ export class UserManagementAddComponent implements OnInit { episodeRequestLimit: 0, movieRequestLimit: 0, userAccessToken: "", + episodeRequestQuota: null, + movieRequestQuota: null, }; } diff --git a/src/Ombi/Controllers/IdentityController.cs b/src/Ombi/Controllers/IdentityController.cs index 742d75b34..3ecb9c3e7 100644 --- a/src/Ombi/Controllers/IdentityController.cs +++ b/src/Ombi/Controllers/IdentityController.cs @@ -16,6 +16,7 @@ using Ombi.Api.Plex; using Ombi.Attributes; using Ombi.Config; using Ombi.Core.Authentication; +using Ombi.Core.Engine.Interfaces; using Ombi.Core.Helpers; using Ombi.Core.Models.UI; using Ombi.Core.Settings; @@ -60,7 +61,9 @@ namespace Ombi.Controllers IRepository issueComments, IRepository notificationRepository, IRepository subscriptionRepository, - ISettingsService umSettings) + ISettingsService umSettings, + IMovieRequestEngine movieRequestEngine, + ITvRequestEngine tvRequestEngine) { UserManager = user; Mapper = mapper; @@ -81,6 +84,8 @@ namespace Ombi.Controllers _requestSubscriptionRepository = subscriptionRepository; _notificationRepository = notificationRepository; _userManagementSettings = umSettings; + TvRequestEngine = tvRequestEngine; + MovieRequestEngine = movieRequestEngine; } private OmbiUserManager UserManager { get; } @@ -94,6 +99,8 @@ namespace Ombi.Controllers private IWelcomeEmail WelcomeEmail { get; } private IMovieRequestRepository MovieRepo { get; } private ITvRequestRepository TvRepo { get; } + private IMovieRequestEngine MovieRequestEngine { get; } + private ITvRequestEngine TvRequestEngine { get; } private readonly ILogger _log; private readonly IPlexApi _plexApi; private readonly ISettingsService _plexSettings; @@ -103,7 +110,6 @@ namespace Ombi.Controllers private readonly IRepository _notificationRepository; private readonly IRepository _requestSubscriptionRepository; - /// /// This is what the Wizard will call when creating the user for the very first time. /// This should never be called after this. @@ -316,6 +322,16 @@ namespace Ombi.Controllers }); } + if (vm.EpisodeRequestLimit > 0) + { + vm.EpisodeRequestQuota = await TvRequestEngine.GetRemainingRequests(user); + } + + if (vm.MovieRequestLimit > 0) + { + vm.MovieRequestQuota = await MovieRequestEngine.GetRemainingRequests(user); + } + return vm; } From 30c9de818b9a93766a0fdb7145cbe14f0865c13f Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 5 Sep 2018 18:48:03 +0100 Subject: [PATCH 2/4] Add html for displaying remaining requests on users page --- .../usermanagement.component.html | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html b/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html index 519db023f..98bc8749b 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html @@ -48,6 +48,12 @@ Roles + + Requests Remaining + + + Next Request Due + Last Logged In @@ -85,6 +91,22 @@ + +
+ Movies: {{u.movieRequestQuota.remaining}}/{{u.movieRequestLimit}} remaining +
+
+ TV: {{u.episodeRequestQuota.remaining}}/{{u.episodeRequestLimit}} remaining +
+ + +
+ Movie: {{u.movieRequestQuota.nextRequest | date: 'short'}} +
+
+ TV: {{u.episodeRequestQuota.nextRequest | date: 'short'}} +
+ {{u.lastLoggedIn | date: 'short'}} From c9b6f5f05eb56f108eac7beff797892fe9f6da26 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 5 Sep 2018 20:25:51 +0100 Subject: [PATCH 3/4] Add to translations --- src/Ombi.Core/Engine/MovieRequestEngine.cs | 6 ++++++ src/Ombi.Core/Engine/TvRequestEngine.cs | 6 ++++++ .../app/usermanagement/usermanagement.component.html | 8 ++++---- .../ClientApp/app/usermanagement/usermanagement.module.ts | 3 +++ src/Ombi/wwwroot/translations/en.json | 6 ++++++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 0cce7af58..9fd6033bf 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -491,6 +491,12 @@ namespace Ombi.Core.Engine if (user == null) { user = await GetUser(); + + // If user is still null after attempting to get the logged in user, return null. + if (user == null) + { + return null; + } } int limit = user.MovieRequestLimit ?? 0; diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index a700035a0..6a7f370d9 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -620,6 +620,12 @@ namespace Ombi.Core.Engine if (user == null) { user = await GetUser(); + + // If user is still null after attempting to get the logged in user, return null. + if (user == null) + { + return null; + } } int limit = user.EpisodeRequestLimit ?? 0; diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html b/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html index 98bc8749b..431ea7ddf 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html @@ -93,18 +93,18 @@
- Movies: {{u.movieRequestQuota.remaining}}/{{u.movieRequestLimit}} remaining + {{'UserManagment.MovieRemaining' | translate: {remaining: u.movieRequestQuota.remaining, total: u.movieRequestLimit} }}
- TV: {{u.episodeRequestQuota.remaining}}/{{u.episodeRequestLimit}} remaining + {{'UserManagment.TvRemaining' | translate: {remaining: u.episodeRequestQuota.remaining, total: u.episodeRequestLimit} }}
- Movie: {{u.movieRequestQuota.nextRequest | date: 'short'}} + {{'UserManagment.MovieDue' | translate: {date: (u.movieRequestQuota.nextRequest | date: 'short')} }}
- TV: {{u.episodeRequestQuota.nextRequest | date: 'short'}} + {{'UserManagment.TvDue' | translate: {date: (u.episodeRequestQuota.nextRequest | date: 'short')} }}
diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement.module.ts b/src/Ombi/ClientApp/app/usermanagement/usermanagement.module.ts index cf25446f5..1a91cf295 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement.module.ts +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement.module.ts @@ -19,6 +19,8 @@ import { AuthGuard } from "../auth/auth.guard"; import { OrderModule } from "ngx-order-pipe"; import { AddPlexUserComponent } from "./addplexuser.component"; +import { SharedModule } from "../shared/shared.module"; + const routes: Routes = [ { path: "", component: UserManagementComponent, canActivate: [AuthGuard] }, { path: "add", component: UserManagementAddComponent, canActivate: [AuthGuard] }, @@ -39,6 +41,7 @@ const routes: Routes = [ TooltipModule, OrderModule, SidebarModule, + SharedModule, ], declarations: [ UserManagementComponent, diff --git a/src/Ombi/wwwroot/translations/en.json b/src/Ombi/wwwroot/translations/en.json index b38f5fb95..c53229c3d 100644 --- a/src/Ombi/wwwroot/translations/en.json +++ b/src/Ombi/wwwroot/translations/en.json @@ -184,5 +184,11 @@ "FilterHeaderRequestStatus":"Status", "Approved":"Approved", "PendingApproval": "Pending Approval" + }, + "UserManagment": { + "TvRemaining": "TV: {{remaining}}/{{total}} remaining", + "MovieRemaining": "Movies: {{remaining}}/{{total}} remaining", + "TvDue": "TV: {{date}}", + "MovieDue": "Movie: {{date}}" } } From d081526e3f534c9d0d43ff7f7fd394ea95902d48 Mon Sep 17 00:00:00 2001 From: Kenton Royal Date: Wed, 5 Sep 2018 20:56:41 +0100 Subject: [PATCH 4/4] Fix bug in which requested TV wasn't logging for some users --- src/Ombi.Core/Engine/TvRequestEngine.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 6a7f370d9..7994b23aa 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -588,6 +588,15 @@ namespace Ombi.Core.Engine NotificationHelper.NewRequest(model); } + await _requestLog.Add(new RequestLog + { + UserId = (await GetUser()).Id, + RequestDate = DateTime.UtcNow, + RequestId = model.Id, + RequestType = RequestType.TvShow, + EpisodeCount = model.SeasonRequests.Select(m => m.Episodes.Count).Sum(), + }); + if (model.Approved) { // Autosend @@ -603,15 +612,6 @@ namespace Ombi.Core.Engine }; } - await _requestLog.Add(new RequestLog - { - UserId = (await GetUser()).Id, - RequestDate = DateTime.UtcNow, - RequestId = model.Id, - RequestType = RequestType.TvShow, - EpisodeCount = model.SeasonRequests.Select(m => m.Episodes.Count).Sum(), - }); - return new RequestEngineResult { Result = true }; }