From df1ab01e46b80ed6e72e87150d672b46268ddc6b Mon Sep 17 00:00:00 2001 From: tidusjar Date: Sat, 23 Sep 2017 23:38:18 +0100 Subject: [PATCH] #1513 #865 Fixed the issue where we do not send the requests to Radarr/Sonarr when approving Also fixed a landing page issue --- .../Engine/Interfaces/IMovieRequestEngine.cs | 1 + .../Engine/Interfaces/ITvRequestEngine.cs | 1 + src/Ombi.Core/Engine/MovieRequestEngine.cs | 36 +++++++++++++++ src/Ombi.Core/Engine/TvRequestEngine.cs | 16 ++++++- src/Ombi/ClientApp/app/interfaces/IPlex.ts | 2 +- .../landingpage/landingpage.component.html | 2 +- .../app/landingpage/landingpage.component.ts | 4 +- .../app/requests/movierequests.component.ts | 44 +++++++++---------- .../requests/tvrequest-children.component.ts | 18 ++++++-- .../ClientApp/app/services/request.service.ts | 7 +++ src/Ombi/Controllers/RequestController.cs | 22 ++++++++++ src/Ombi/Controllers/SettingsController.cs | 15 ++++--- src/Ombi/tslint.json | 3 ++ 13 files changed, 134 insertions(+), 37 deletions(-) diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs index 46d59be80..6559b13ef 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs @@ -15,5 +15,6 @@ namespace Ombi.Core.Engine.Interfaces Task RemoveMovieRequest(int requestId); Task UpdateMovieRequest(MovieRequests request); + Task ApproveMovie(MovieRequests request); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs index e85b793de..760a784de 100644 --- a/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs @@ -20,5 +20,6 @@ namespace Ombi.Core.Engine.Interfaces Task> GetAllChldren(int tvId); Task UpdateChildRequest(ChildRequests request); Task RemoveTvChild(int requestId); + Task ApproveChildRequest(ChildRequests request); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 80306fc0b..fe31bdf19 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -141,6 +141,42 @@ namespace Ombi.Core.Engine return results; } + /// + /// This is the method that is triggered by pressing Approve on the requests page + /// + /// + /// + public async Task ApproveMovie(MovieRequests request) + { + if (request.Approved) + { + var result = await Sender.Send(request); + if (result.Success && result.MovieSent) + { + return new RequestEngineResult + { + RequestAdded = true + }; + } + if (!result.Success) + { + Logger.LogWarning("Tried auto sending movie but failed. Message: {0}", result.Message); + return new RequestEngineResult + { + Message = result.Message, + ErrorMessage = result.Message, + RequestAdded = false + }; + } + // If there are no providers then it's successful but movie has not been sent + } + + return new RequestEngineResult + { + RequestAdded = true + }; + } + /// /// Updates the movie request. /// diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 867b1ea1d..df3ff79e2 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -159,11 +159,25 @@ namespace Ombi.Core.Engine var allRequests = TvRepository.Get(); var results = await allRequests.FirstOrDefaultAsync(x => x.Id == request.Id); - // TODO need to check if we need to approve any child requests since they may have updated await TvRepository.Update(results); return results; } + public async Task ApproveChildRequest(ChildRequests request) + { + if (request.Approved) + { + await Audit.Record(AuditType.Approved, AuditArea.TvRequest, $"Approved Request {request.Title}", Username); + // Autosend + await TvSender.SendToSonarr(request); + } + await TvRepository.UpdateChild(request); + return new RequestEngineResult + { + RequestAdded = true + }; + } + public async Task UpdateChildRequest(ChildRequests request) { await Audit.Record(AuditType.Updated, AuditArea.TvRequest, $"Updated Request {request.Title}", Username); diff --git a/src/Ombi/ClientApp/app/interfaces/IPlex.ts b/src/Ombi/ClientApp/app/interfaces/IPlex.ts index 9213db550..d8ce4ed06 100644 --- a/src/Ombi/ClientApp/app/interfaces/IPlex.ts +++ b/src/Ombi/ClientApp/app/interfaces/IPlex.ts @@ -17,7 +17,7 @@ export interface IPlexLibraries { export interface IPlexLibResponse { successful: boolean; message: string; - data:IPlexLibraries; + data: IPlexLibraries; } export interface IMediaContainer { diff --git a/src/Ombi/ClientApp/app/landingpage/landingpage.component.html b/src/Ombi/ClientApp/app/landingpage/landingpage.component.html index 951756ebc..fc155eeab 100644 --- a/src/Ombi/ClientApp/app/landingpage/landingpage.component.html +++ b/src/Ombi/ClientApp/app/landingpage/landingpage.component.html @@ -18,7 +18,7 @@

Notice

-
+

Currently Online

The media server is currently online diff --git a/src/Ombi/ClientApp/app/landingpage/landingpage.component.ts b/src/Ombi/ClientApp/app/landingpage/landingpage.component.ts index bfa96fb9e..f5d13420b 100644 --- a/src/Ombi/ClientApp/app/landingpage/landingpage.component.ts +++ b/src/Ombi/ClientApp/app/landingpage/landingpage.component.ts @@ -29,6 +29,8 @@ export class LandingPageComponent implements OnInit { }); - this.landingPageService.getServerStatus().subscribe(x => this.mediaServerStatus = x); + this.landingPageService.getServerStatus().subscribe(x => { + this.mediaServerStatus = x; + }); } } diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.ts b/src/Ombi/ClientApp/app/requests/movierequests.component.ts index 604841e53..11aa1a723 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.ts @@ -1,16 +1,11 @@ -import { Component, OnDestroy, OnInit } from "@angular/core"; +import { Component, OnInit } from "@angular/core"; import "rxjs/add/operator/debounceTime"; import "rxjs/add/operator/distinctUntilChanged"; import "rxjs/add/operator/map"; -import "rxjs/add/operator/takeUntil"; import { Subject } from "rxjs/Subject"; -import "rxjs/add/operator/debounceTime"; -import "rxjs/add/operator/distinctUntilChanged"; -import "rxjs/add/operator/map"; - import { AuthService } from "../auth/auth.service"; -import { RequestService } from "../services"; +import { NotificationService, RequestService } from "../services"; import { IMovieRequests } from "../interfaces"; @@ -18,7 +13,7 @@ import { IMovieRequests } from "../interfaces"; selector: "movie-requests", templateUrl: "./movierequests.component.html", }) -export class MovieRequestsComponent implements OnInit, OnDestroy { +export class MovieRequestsComponent implements OnInit { public movieRequests: IMovieRequests[]; public searchChanged: Subject = new Subject(); @@ -29,14 +24,12 @@ export class MovieRequestsComponent implements OnInit, OnDestroy { private currentlyLoaded: number; private amountToLoad: number; - private subscriptions = new Subject(); - constructor(private requestService: RequestService, - private auth: AuthService) { + private auth: AuthService, + private notificationService: NotificationService) { this.searchChanged - .debounceTime(600) // Wait Xms afterthe last event before emitting last event + .debounceTime(600) // Wait Xms after the last event before emitting last event .distinctUntilChanged() // only emit if value is different from previous value - .takeUntil(this.subscriptions) .subscribe(x => { this.searchText = x as string; if (this.searchText === "") { @@ -44,7 +37,6 @@ export class MovieRequestsComponent implements OnInit, OnDestroy { return; } this.requestService.searchMovieRequests(this.searchText) - .takeUntil(this.subscriptions) .subscribe(m => this.movieRequests = m); }); } @@ -79,7 +71,7 @@ export class MovieRequestsComponent implements OnInit, OnDestroy { public approve(request: IMovieRequests) { request.approved = true; request.denied = false; - this.updateRequest(request); + this.approveRequest(request); } public deny(request: IMovieRequests) { @@ -88,14 +80,8 @@ export class MovieRequestsComponent implements OnInit, OnDestroy { this.updateRequest(request); } - public ngOnDestroy() { - this.subscriptions.next(); - this.subscriptions.complete(); - } - private loadRequests(amountToLoad: number, currentlyLoaded: number) { this.requestService.getMovieRequests(amountToLoad, currentlyLoaded + 1) - .takeUntil(this.subscriptions) .subscribe(x => { this.movieRequests.push.apply(this.movieRequests, x); this.currentlyLoaded = currentlyLoaded + amountToLoad; @@ -104,13 +90,25 @@ export class MovieRequestsComponent implements OnInit, OnDestroy { private updateRequest(request: IMovieRequests) { this.requestService.updateMovieRequest(request) - .takeUntil(this.subscriptions) .subscribe(x => request = x); } + private approveRequest(request: IMovieRequests) { + this.requestService.approveMovie(request) + .subscribe(x => { + + if (x.requestAdded) { + this.notificationService.success("Request Approved", + `Request for ${request.title} has been approved successfully`); + } else { + this.notificationService.warning("Request Approved", x.message ? x.message : x.errorMessage); + request.approved = false; + } + }); + } + private loadInit() { this.requestService.getMovieRequests(this.amountToLoad, 0) - .takeUntil(this.subscriptions) .subscribe(x => this.movieRequests = x); } diff --git a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts index d4d3a011d..5bccbd17e 100644 --- a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts +++ b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts @@ -1,6 +1,6 @@ import { Component, Input } from "@angular/core"; import { IChildRequests, IEpisodesRequests } from "../interfaces"; -import { RequestService } from "../services"; +import { NotificationService, RequestService } from "../services"; @Component({ selector:"tvrequests-children", @@ -9,7 +9,9 @@ import { RequestService } from "../services"; export class TvRequestChildrenComponent { @Input() public childRequests: IChildRequests[]; @Input() public isAdmin: boolean; - constructor(private requestService: RequestService ) { } + constructor(private requestService: RequestService, + private notificationService: NotificationService) { } + public removeRequest(request: IChildRequests) { this.requestService.deleteChild(request) .subscribe(); @@ -41,8 +43,16 @@ export class TvRequestChildrenComponent { ep.approved = true; }); }); - this.requestService.updateChild(request) - .subscribe(); + this.requestService.approveChild(request) + .subscribe(x => { + if (x.requestAdded) { + this.notificationService.success("Request Approved", + `Request has been approved successfully`); + } else { + this.notificationService.warning("Request Approved", x.message ? x.message : x.errorMessage); + request.approved = false; + } + }); } public denySeasonRequest(request: IChildRequests) { diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index 46cbb3c3b..adc24f2eb 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -24,6 +24,10 @@ export class RequestService extends ServiceAuthHelpers { return this.http.post(`${this.url}TV/`, JSON.stringify(tv), { headers: this.headers }).map(this.extractData); } + public approveMovie(movie: IMovieRequests): Observable { + return this.http.post(`${this.url}Movie/Approve`, JSON.stringify(movie), { headers: this.headers }).map(this.extractData); + } + public getMovieRequests(count: number, position: number): Observable { return this.http.get(`${this.url}movie/${count}/${position}`).map(this.extractData); } @@ -72,6 +76,9 @@ export class RequestService extends ServiceAuthHelpers { } public updateChild(child: IChildRequests): Observable { return this.http.put(`${this.url}tv/child`, JSON.stringify(child), { headers: this.headers }).map(this.extractData); + } + public approveChild(child: IChildRequests): Observable { + return this.http.post(`${this.url}tv/child/approve`, JSON.stringify(child), { headers: this.headers }).map(this.extractData); } public deleteChild(child: IChildRequests): Observable { return this.http.delete(`${this.url}tv/child/${child.id}`, { headers: this.headers }).map(this.extractData); diff --git a/src/Ombi/Controllers/RequestController.cs b/src/Ombi/Controllers/RequestController.cs index 467df7888..914278c90 100644 --- a/src/Ombi/Controllers/RequestController.cs +++ b/src/Ombi/Controllers/RequestController.cs @@ -89,6 +89,17 @@ namespace Ombi.Controllers return await MovieRequestEngine.UpdateMovieRequest(model); } + /// + /// Updates the specified movie request. + /// + /// The model. + /// + [HttpPost("movie/approve")] + public async Task ApproveMovie([FromBody] MovieRequests model) + { + return await MovieRequestEngine.ApproveMovie(model); + } + /// /// Gets the tv requests. /// @@ -189,6 +200,17 @@ namespace Ombi.Controllers return await TvRequestEngine.UpdateChildRequest(child); } + /// + /// Updates the a specific child request + /// + /// The model. + /// + [HttpPost("tv/child/approve")] + public async Task ApproveChild([FromBody] ChildRequests child) + { + return await TvRequestEngine.ApproveChildRequest(child); + } + /// /// Deletes the a specific tv request /// diff --git a/src/Ombi/Controllers/SettingsController.cs b/src/Ombi/Controllers/SettingsController.cs index 35d620f01..72599d8ac 100644 --- a/src/Ombi/Controllers/SettingsController.cs +++ b/src/Ombi/Controllers/SettingsController.cs @@ -118,7 +118,7 @@ namespace Ombi.Controllers public async Task PlexSettings([FromBody]PlexSettings plex) { var result = await Save(plex); - if (result) + if (result && plex.Enable) { BackgroundJob.Enqueue(() => _plexContentCacher.CacheContent()); } @@ -143,14 +143,17 @@ namespace Ombi.Controllers [HttpPost("emby")] public async Task EmbySettings([FromBody]EmbySettings emby) { - foreach (var server in emby.Servers) + if (emby.Enable) { - var users = await _embyApi.GetUsers(server.FullUri, server.ApiKey); - var admin = users.FirstOrDefault(x => x.Policy.IsAdministrator); - server.AdministratorId = admin?.Id; + foreach (var server in emby.Servers) + { + var users = await _embyApi.GetUsers(server.FullUri, server.ApiKey); + var admin = users.FirstOrDefault(x => x.Policy.IsAdministrator); + server.AdministratorId = admin?.Id; + } } var result = await Save(emby); - if (result) + if (result && emby.Enable) { BackgroundJob.Enqueue(() => _embyContentCacher.Start()); } diff --git a/src/Ombi/tslint.json b/src/Ombi/tslint.json index 746e08bcd..73a2ee413 100644 --- a/src/Ombi/tslint.json +++ b/src/Ombi/tslint.json @@ -23,6 +23,9 @@ true, "allow-new" ], + "no-trailing-whitespace": [ + false + ], "max-classes-per-file": [ false ],