diff --git a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs index 517a1e127..bfb8be4e8 100644 --- a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs @@ -14,5 +14,8 @@ namespace Ombi.Core.Engine.Interfaces Task> GetRequests(int count, int position); Task> GetRequests(); Task UserHasRequest(string userId); + + Task MarkUnavailable(int modelId); + Task MarkAvailable(int modelId); } } \ 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 32e1a150b..30f415aad 100644 --- a/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs @@ -11,7 +11,6 @@ namespace Ombi.Core.Engine.Interfaces Task RemoveTvRequest(int requestId); Task RequestTvShow(SearchTvShowViewModel tv); Task DenyChildRequest(int requestId); - Task ChangeAvailability(ChildRequests request); Task> SearchTvRequest(string search); Task>>> SearchTvRequestTree(string search); Task UpdateTvRequest(TvRequests request); diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 7f2ee0599..c0e514938 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -9,7 +9,6 @@ using System.Globalization; using System.Linq; using System.Security.Principal; using System.Threading.Tasks; -using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Ombi.Core.Authentication; @@ -48,7 +47,7 @@ namespace Ombi.Core.Engine { return new RequestEngineResult { - RequestAdded = false, + Result = false, Message = "There was an issue adding this movie!", ErrorMessage = $"TheMovieDb didn't have any information for ID {model.Id}" }; @@ -87,7 +86,7 @@ namespace Ombi.Core.Engine if (requestModel.Approved) // The rules have auto approved this { var requestEngineResult = await AddMovieRequest(requestModel, fullMovieName); - if (requestEngineResult.RequestAdded) + if (requestEngineResult.Result) { var result = await ApproveMovie(requestModel); if (result.IsError) @@ -97,7 +96,7 @@ namespace Ombi.Core.Engine { Message = result.Message, ErrorMessage = result.Message, - RequestAdded = false + Result = false }; } @@ -203,7 +202,7 @@ namespace Ombi.Core.Engine { return new RequestEngineResult { - RequestAdded = true + Result = true }; } if (!result.Success) @@ -213,7 +212,7 @@ namespace Ombi.Core.Engine { Message = result.Message, ErrorMessage = result.Message, - RequestAdded = false + Result = false }; } // If there are no providers then it's successful but movie has not been sent @@ -221,7 +220,7 @@ namespace Ombi.Core.Engine return new RequestEngineResult { - RequestAdded = true + Result = true }; } @@ -267,6 +266,47 @@ namespace Ombi.Core.Engine return await MovieRepository.GetAll().AnyAsync(x => x.RequestedUserId == userId); } + public async Task MarkUnavailable(int modelId) + { + var request = await MovieRepository.Find(modelId); + if (request == null) + { + return new RequestEngineResult + { + ErrorMessage = "Request does not exist" + }; + } + request.Available = false; + await MovieRepository.Update(request); + + return new RequestEngineResult + { + Message = "Request is now unavailable", + Result = true + }; + } + + public async Task MarkAvailable(int modelId) + { + var request = await MovieRepository.Find(modelId); + if (request == null) + { + return new RequestEngineResult + { + ErrorMessage = "Request does not exist" + }; + } + request.Available = true; + NotificationHelper.Notify(request, NotificationType.RequestAvailable); + await MovieRepository.Update(request); + + return new RequestEngineResult + { + Message = "Request is now available", + Result = true + }; + } + private async Task AddMovieRequest(MovieRequests model, string movieName) { await MovieRepository.Add(model); @@ -277,7 +317,7 @@ namespace Ombi.Core.Engine NotificationHelper.NewRequest(model); } - return new RequestEngineResult { RequestAdded = true, Message = $"{movieName} has been successfully added!" }; + return new RequestEngineResult { Result = true, Message = $"{movieName} has been successfully added!" }; } public async Task> GetApprovedRequests() diff --git a/src/Ombi.Core/Engine/RequestEngineResult.cs b/src/Ombi.Core/Engine/RequestEngineResult.cs index a31c52d40..1dc78d4b4 100644 --- a/src/Ombi.Core/Engine/RequestEngineResult.cs +++ b/src/Ombi.Core/Engine/RequestEngineResult.cs @@ -2,7 +2,7 @@ { public class RequestEngineResult { - public bool RequestAdded { get; set; } + public bool Result { get; set; } public string Message { get; set; } public bool IsError => !string.IsNullOrEmpty(ErrorMessage); public string ErrorMessage { get; set; } diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 10db95e76..9d0fec43f 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -111,7 +111,7 @@ namespace Ombi.Core.Engine // Looks like we have removed them all! They were all duplicates... return new RequestEngineResult { - RequestAdded = false, + Result = false, ErrorMessage = "This has already been requested" }; } @@ -201,7 +201,7 @@ namespace Ombi.Core.Engine } return new RequestEngineResult { - RequestAdded = true + Result = true }; } @@ -220,19 +220,10 @@ namespace Ombi.Core.Engine NotificationHelper.Notify(request, NotificationType.RequestDeclined); return new RequestEngineResult { - RequestAdded = true + Result = true }; } - public async Task ChangeAvailability(ChildRequests request) - { - if (request.Available) - { - NotificationHelper.Notify(request, NotificationType.RequestAvailable); - } - return await UpdateChildRequest(request); - } - public async Task UpdateChildRequest(ChildRequests request) { await Audit.Record(AuditType.Updated, AuditArea.TvRequest, $"Updated Request {request.Title}", Username); @@ -272,6 +263,46 @@ namespace Ombi.Core.Engine return await TvRepository.GetChild().AnyAsync(x => x.RequestedUserId == userId); } + public async Task MarkUnavailable(int modelId) + { + var request = await TvRepository.GetChild().FirstOrDefaultAsync(x => x.Id == modelId); + if (request == null) + { + return new RequestEngineResult + { + ErrorMessage = "Child Request does not exist" + }; + } + request.Available = false; + await TvRepository.UpdateChild(request); + NotificationHelper.Notify(request, NotificationType.RequestAvailable); + return new RequestEngineResult + { + Result = true, + Message = "Request is now unavailable", + }; + } + + public async Task MarkAvailable(int modelId) + { + var request = await TvRepository.GetChild().FirstOrDefaultAsync(x => x.Id == modelId); + if (request == null) + { + return new RequestEngineResult + { + ErrorMessage = "Child Request does not exist" + }; + } + request.Available = true; + await TvRepository.UpdateChild(request); + NotificationHelper.Notify(request, NotificationType.RequestAvailable); + return new RequestEngineResult + { + Result = true, + Message = "Request is now available", + }; + } + private async Task AddExistingRequest(ChildRequests newRequest, TvRequests existingRequest) { // Add the child @@ -339,7 +370,7 @@ namespace Ombi.Core.Engine var result = await TvSender.Send(model); if (result.Success) { - return new RequestEngineResult {RequestAdded = true}; + return new RequestEngineResult {Result = true}; } return new RequestEngineResult { @@ -347,7 +378,7 @@ namespace Ombi.Core.Engine }; } - return new RequestEngineResult {RequestAdded = true}; + return new RequestEngineResult {Result = true}; } } } \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/interfaces/IRequestEngineResult.ts b/src/Ombi/ClientApp/app/interfaces/IRequestEngineResult.ts index 68bbfbf7a..1d902261f 100644 --- a/src/Ombi/ClientApp/app/interfaces/IRequestEngineResult.ts +++ b/src/Ombi/ClientApp/app/interfaces/IRequestEngineResult.ts @@ -1,5 +1,5 @@ export interface IRequestEngineResult { - requestAdded: boolean; + result: boolean; message: string; errorMessage: string; } diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.ts b/src/Ombi/ClientApp/app/requests/movierequests.component.ts index aeb694158..7d088b7e7 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.ts @@ -71,7 +71,27 @@ export class MovieRequestsComponent implements OnInit { public changeAvailability(request: IMovieRequests, available: boolean) { request.available = available; - this.updateRequest(request); + if(available) { + this.requestService.markMovieAvailable({ id: request.id }).subscribe(x => { + if (x.result) { + this.notificationService.success("Request Available", + `${request.title} Is now available`); + } else { + this.notificationService.warning("Request Available", x.message ? x.message : x.errorMessage); + request.approved = false; + } + }); + } else { + this.requestService.markMovieUnavailable({ id: request.id }).subscribe(x => { + if (x.result) { + this.notificationService.success("Request Available", + `${request.title} Is now unavailable`); + } else { + this.notificationService.warning("Request Available", x.message ? x.message : x.errorMessage); + request.approved = false; + } + }); + } } public approve(request: IMovieRequests) { @@ -119,7 +139,7 @@ export class MovieRequestsComponent implements OnInit { this.requestService.approveMovie({ id: request.id }) .subscribe(x => { - if (x.requestAdded) { + if (x.result) { this.notificationService.success("Request Approved", `Request for ${request.title} has been approved successfully`); } else { diff --git a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts index 05ed2def1..789ca5854 100644 --- a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts +++ b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts @@ -25,6 +25,27 @@ export class TvRequestChildrenComponent { public changeAvailability(request: IChildRequests, available: boolean) { request.available = available; + if(available) { + this.requestService.markTvAvailable({ id: request.id }).subscribe(x => { + if (x.result) { + this.notificationService.success("Request Available", + `This request is now available`); + } else { + this.notificationService.warning("Request Available", x.message ? x.message : x.errorMessage); + request.approved = false; + } + }); + } else { + this.requestService.markTvUnavailable({ id: request.id }).subscribe(x => { + if (x.result) { + this.notificationService.success("Request Available", + `This request is now unavailable`); + } else { + this.notificationService.warning("Request Available", x.message ? x.message : x.errorMessage); + request.approved = false; + } + }); + } } public deny(request: IChildRequests) { @@ -37,7 +58,7 @@ export class TvRequestChildrenComponent { }); this.requestService.denyChild({ id: request.id }) .subscribe(x => { - if (x.requestAdded) { + if (x.result) { this.notificationService.success("Request Denied", `Request has been denied successfully`); } else { @@ -57,7 +78,7 @@ export class TvRequestChildrenComponent { }); this.requestService.approveChild({ id: request.id }) .subscribe(x => { - if (x.requestAdded) { + if (x.result) { this.notificationService.success("Request Approved", `Request has been approved successfully`); } else { diff --git a/src/Ombi/ClientApp/app/search/moviesearch.component.ts b/src/Ombi/ClientApp/app/search/moviesearch.component.ts index f5119bc81..bc30cf56e 100644 --- a/src/Ombi/ClientApp/app/search/moviesearch.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearch.component.ts @@ -49,7 +49,7 @@ export class MovieSearchComponent implements OnInit { this.movieResults = []; this.result = { message: "", - requestAdded: false, + result: false, errorMessage: "", }; } @@ -70,7 +70,7 @@ export class MovieSearchComponent implements OnInit { .subscribe(x => { this.result = x; - if (this.result.requestAdded) { + if (this.result.result) { this.notificationService.success("Request Added", `Request for ${searchResult.title} has been added successfully`); searchResult.processed = true; diff --git a/src/Ombi/ClientApp/app/search/moviesearchgrid.component.ts b/src/Ombi/ClientApp/app/search/moviesearchgrid.component.ts index aa1e26d80..b1b1789a3 100644 --- a/src/Ombi/ClientApp/app/search/moviesearchgrid.component.ts +++ b/src/Ombi/ClientApp/app/search/moviesearchgrid.component.ts @@ -50,7 +50,7 @@ export class MovieSearchGridComponent implements OnInit { this.movieResults = []; this.result = { message: "", - requestAdded: false, + result: false, errorMessage: "", }; } @@ -71,7 +71,7 @@ export class MovieSearchGridComponent implements OnInit { .subscribe(x => { this.result = x; - if (this.result.requestAdded) { + if (this.result.result) { this.notificationService.success("Request Added", `Request for ${searchResult.title} has been added successfully`); searchResult.processed = true; diff --git a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts index 8fb6c1650..f5cc98e0f 100644 --- a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts +++ b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts @@ -43,7 +43,7 @@ export class SeriesInformationComponent implements OnInit, OnDestroy { .takeUntil(this.subscriptions) .subscribe(x => { this.result = x as IRequestEngineResult; - if (this.result.requestAdded) { + if (this.result.result) { this.notificationService.success("Request Added", `Request for ${this.series.title} has been added successfully`); diff --git a/src/Ombi/ClientApp/app/search/tvsearch.component.ts b/src/Ombi/ClientApp/app/search/tvsearch.component.ts index bd6cdf31c..43d23b079 100644 --- a/src/Ombi/ClientApp/app/search/tvsearch.component.ts +++ b/src/Ombi/ClientApp/app/search/tvsearch.component.ts @@ -79,7 +79,7 @@ export class TvSearchComponent implements OnInit, OnDestroy { this.tvResults = []; this.result = { message: "", - requestAdded: false, + result: false, errorMessage:"", }; } @@ -154,7 +154,7 @@ export class TvSearchComponent implements OnInit, OnDestroy { .takeUntil(this.subscriptions) .subscribe(x => { this.result = x; - if (this.result.requestAdded) { + if (this.result.result) { this.notificationService.success("Request Added", `Request for ${searchResult.title} has been added successfully`); } else { diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index cbd3b0f71..83b722674 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -33,6 +33,14 @@ export class RequestService extends ServiceAuthHelpers { return this.http.put(`${this.url}Movie/Deny`, JSON.stringify(movie), { headers: this.headers }).map(this.extractData); } + public markMovieAvailable(movie: IMovieUpdateModel): Observable { + return this.http.post(`${this.url}Movie/available`, JSON.stringify(movie), { headers: this.headers }).map(this.extractData); + } + + public markMovieUnavailable(movie: IMovieUpdateModel): Observable { + return this.http.post(`${this.url}Movie/unavailable`, 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); } @@ -75,19 +83,27 @@ export class RequestService extends ServiceAuthHelpers { public removeTvRequest(request: ITvRequests) { this.http.delete(`${this.url}tv/${request.id}`).map(this.extractData).subscribe(); } + + public markTvAvailable(movie: ITvUpdateModel): Observable { + return this.http.post(`${this.url}tv/available`, JSON.stringify(movie), { headers: this.headers }).map(this.extractData); + } + + public markTvUnavailable(movie: ITvUpdateModel): Observable { + return this.http.post(`${this.url}tv/unavailable`, JSON.stringify(movie), { headers: this.headers }).map(this.extractData); + } public updateTvRequest(request: ITvRequests): Observable { return this.http.put(`${this.url}tv/`, JSON.stringify(request), { headers: this.headers }).map(this.extractData); } + public updateChild(child: IChildRequests): Observable { return this.http.put(`${this.url}tv/child`, JSON.stringify(child), { headers: this.headers }).map(this.extractData); } + public denyChild(child: ITvUpdateModel): Observable { return this.http.put(`${this.url}tv/deny`, JSON.stringify(child), { headers: this.headers }).map(this.extractData); } - public changeAvailabilityChild(child: IChildRequests): Observable { - return this.http.put(`${this.url}tv/changeavailability`, JSON.stringify(child), { headers: this.headers }).map(this.extractData); - } + public approveChild(child: ITvUpdateModel): Observable { return this.http.post(`${this.url}tv/approve`, JSON.stringify(child), { headers: this.headers }).map(this.extractData); } diff --git a/src/Ombi/Controllers/RequestController.cs b/src/Ombi/Controllers/RequestController.cs index 60fd9fe0c..84d0ed06b 100644 --- a/src/Ombi/Controllers/RequestController.cs +++ b/src/Ombi/Controllers/RequestController.cs @@ -101,6 +101,28 @@ namespace Ombi.Controllers return await MovieRequestEngine.ApproveMovieById(model.Id); } + /// + /// Set's the specified Movie as available + /// + /// The Movie's ID + /// + [HttpPost("movie/available")] + public async Task MarkMovieAvailable([FromBody] MovieUpdateModel model) + { + return await MovieRequestEngine.MarkAvailable(model.Id); + } + + /// + /// Set's the specified Movie as unavailable + /// + /// The Movie's ID + /// + [HttpPost("movie/unavailable")] + public async Task MarkMovieUnAvailable([FromBody] MovieUpdateModel model) + { + return await MovieRequestEngine.MarkUnavailable(model.Id); + } + /// /// Denies the specified movie request. /// @@ -224,14 +246,25 @@ namespace Ombi.Controllers } /// - /// Changes the availability of the a specific child request + /// Set's the specified tv child as available /// - /// The model. + /// The Movie's ID /// - [HttpPut("tv/changeavailability")] - public async Task ChangeAvailability([FromBody] ChildRequests child) + [HttpPost("tv/available")] + public async Task MarkTvAvailable([FromBody] TvUpdateModel model) { - return await TvRequestEngine.ChangeAvailability(child); + return await TvRequestEngine.MarkAvailable(model.Id); + } + + /// + /// Set's the specified tv child as unavailable + /// + /// The Movie's ID + /// + [HttpPost("tv/unavailable")] + public async Task MarkTvUnAvailable([FromBody] TvUpdateModel model) + { + return await TvRequestEngine.MarkUnavailable(model.Id); } ///