working on the requests page #1457 #865

This commit is contained in:
tidusjar 2017-07-23 00:03:49 +01:00
parent 50a81aaf77
commit da041cabc3
14 changed files with 3129 additions and 452 deletions

View file

@ -11,6 +11,8 @@ using Ombi.Core.Rule.Interfaces;
using Ombi.Store.Entities.Requests; using Ombi.Store.Entities.Requests;
using Ombi.Store.Repository; using Ombi.Store.Repository;
using Ombi.Store.Repository.Requests; using Ombi.Store.Repository.Requests;
using Ombi.Store.Entities;
using Microsoft.AspNetCore.Identity;
namespace Ombi.Core.Engine namespace Ombi.Core.Engine
{ {
@ -21,7 +23,7 @@ namespace Ombi.Core.Engine
private Dictionary<int, TvRequests> _dbTv; private Dictionary<int, TvRequests> _dbTv;
protected BaseMediaEngine(IPrincipal identity, IRequestServiceMain requestService, protected BaseMediaEngine(IPrincipal identity, IRequestServiceMain requestService,
IRuleEvaluator rules) : base(identity, rules) IRuleEvaluator rules, UserManager<OmbiUser> um) : base(identity, um, rules)
{ {
RequestService = requestService; RequestService = requestService;
} }

View file

@ -5,24 +5,44 @@ using System.Threading.Tasks;
using Ombi.Core.Models.Search; using Ombi.Core.Models.Search;
using Ombi.Core.Rule.Interfaces; using Ombi.Core.Rule.Interfaces;
using Ombi.Store.Entities.Requests; using Ombi.Store.Entities.Requests;
using Ombi.Store.Entities;
using Microsoft.AspNetCore.Identity;
using System.Linq;
using Microsoft.EntityFrameworkCore;
namespace Ombi.Core.Engine.Interfaces namespace Ombi.Core.Engine.Interfaces
{ {
public abstract class BaseEngine public abstract class BaseEngine
{ {
protected BaseEngine(IPrincipal user, IRuleEvaluator rules) protected BaseEngine(IPrincipal user, UserManager<OmbiUser> um, IRuleEvaluator rules)
{ {
User = user; UserPrinciple = user;
Rules = rules; Rules = rules;
UserManager = um;
} }
protected IPrincipal User { get; } protected IPrincipal UserPrinciple { get; }
protected IRuleEvaluator Rules { get; } protected IRuleEvaluator Rules { get; }
protected string Username => User.Identity.Name; protected UserManager<OmbiUser> UserManager { get; }
protected string Username => UserPrinciple.Identity.Name;
protected bool HasRole(string roleName) private OmbiUser _user;
protected async Task<OmbiUser> User()
{ {
return User.IsInRole(roleName); if(_user == null)
_user = await UserManager.Users.FirstOrDefaultAsync(x => x.UserName == Username);
return _user;
}
protected async Task<string> UserAlias()
{
return (await User()).UserAlias;
}
protected async Task<bool> IsInRole(string roleName)
{
return await UserManager.IsInRoleAsync(await User(), roleName);
} }
public async Task<IEnumerable<RuleResult>> RunRequestRules(BaseRequest model) public async Task<IEnumerable<RuleResult>> RunRequestRules(BaseRequest model)

View file

@ -16,5 +16,7 @@ namespace Ombi.Core.Engine.Interfaces
Task<TvRequests> UpdateTvRequest(TvRequests request); Task<TvRequests> UpdateTvRequest(TvRequests request);
Task<IEnumerable<ChildRequests>> GetAllChldren(int tvId); Task<IEnumerable<ChildRequests>> GetAllChldren(int tvId);
Task<ChildRequests> UpdateChildRequest(ChildRequests request);
Task RemoveTvChild(int requestId);
} }
} }

View file

@ -23,20 +23,19 @@ namespace Ombi.Core.Engine
public class MovieRequestEngine : BaseMediaEngine, IMovieRequestEngine public class MovieRequestEngine : BaseMediaEngine, IMovieRequestEngine
{ {
public MovieRequestEngine(IMovieDbApi movieApi, IRequestServiceMain requestService, IPrincipal user, public MovieRequestEngine(IMovieDbApi movieApi, IRequestServiceMain requestService, IPrincipal user,
INotificationHelper helper, IRuleEvaluator r, IMovieSender sender, ILogger<MovieRequestEngine> log, UserManager<OmbiUser> manager) : base(user, requestService, r) INotificationHelper helper, IRuleEvaluator r, IMovieSender sender, ILogger<MovieRequestEngine> log,
UserManager<OmbiUser> manager) : base(user, requestService, r, manager)
{ {
MovieApi = movieApi; MovieApi = movieApi;
NotificationHelper = helper; NotificationHelper = helper;
Sender = sender; Sender = sender;
Logger = log; Logger = log;
UserManager = manager;
} }
private IMovieDbApi MovieApi { get; } private IMovieDbApi MovieApi { get; }
private INotificationHelper NotificationHelper { get; } private INotificationHelper NotificationHelper { get; }
private IMovieSender Sender { get; } private IMovieSender Sender { get; }
private ILogger<MovieRequestEngine> Logger { get; } private ILogger<MovieRequestEngine> Logger { get; }
private UserManager<OmbiUser> UserManager { get; }
/// <summary> /// <summary>
/// Requests the movie. /// Requests the movie.
@ -58,7 +57,7 @@ namespace Ombi.Core.Engine
var fullMovieName = var fullMovieName =
$"{movieInfo.Title}{(!string.IsNullOrEmpty(movieInfo.ReleaseDate) ? $" ({DateTime.Parse(movieInfo.ReleaseDate).Year})" : string.Empty)}"; $"{movieInfo.Title}{(!string.IsNullOrEmpty(movieInfo.ReleaseDate) ? $" ({DateTime.Parse(movieInfo.ReleaseDate).Year})" : string.Empty)}";
var userDetails = await UserManager.GetUserAsync(new ClaimsPrincipal(User)); var userDetails = await User();
var requestModel = new MovieRequests var requestModel = new MovieRequests
{ {

View file

@ -13,14 +13,16 @@ using System.Security.Principal;
using System.Threading.Tasks; using System.Threading.Tasks;
using Ombi.Core.Rule.Interfaces; using Ombi.Core.Rule.Interfaces;
using StackExchange.Profiling; using StackExchange.Profiling;
using Ombi.Store.Entities;
using Microsoft.AspNetCore.Identity;
namespace Ombi.Core.Engine namespace Ombi.Core.Engine
{ {
public class MovieSearchEngine : BaseMediaEngine, IMovieEngine public class MovieSearchEngine : BaseMediaEngine, IMovieEngine
{ {
public MovieSearchEngine(IPrincipal identity, IRequestServiceMain service, IMovieDbApi movApi, IMapper mapper, public MovieSearchEngine(IPrincipal identity, IRequestServiceMain service, IMovieDbApi movApi, IMapper mapper,
ILogger<MovieSearchEngine> logger, IRuleEvaluator r) ILogger<MovieSearchEngine> logger, IRuleEvaluator r, UserManager<OmbiUser> um)
: base(identity, service, r) : base(identity, service, r, um)
{ {
MovieApi = movApi; MovieApi = movApi;
Mapper = mapper; Mapper = mapper;

View file

@ -28,24 +28,22 @@ namespace Ombi.Core.Engine
public TvRequestEngine(ITvMazeApi tvApi, IRequestServiceMain requestService, IPrincipal user, public TvRequestEngine(ITvMazeApi tvApi, IRequestServiceMain requestService, IPrincipal user,
INotificationHelper helper, IMapper map, INotificationHelper helper, IMapper map,
IRuleEvaluator rule, UserManager<OmbiUser> manager, IRuleEvaluator rule, UserManager<OmbiUser> manager,
ITvSender sender) : base(user, requestService, rule) ITvSender sender) : base(user, requestService, rule, manager)
{ {
TvApi = tvApi; TvApi = tvApi;
NotificationHelper = helper; NotificationHelper = helper;
Mapper = map; Mapper = map;
UserManager = manager;
TvSender = sender; TvSender = sender;
} }
private INotificationHelper NotificationHelper { get; } private INotificationHelper NotificationHelper { get; }
private ITvMazeApi TvApi { get; } private ITvMazeApi TvApi { get; }
private IMapper Mapper { get; } private IMapper Mapper { get; }
private UserManager<OmbiUser> UserManager { get; }
private ITvSender TvSender {get;} private ITvSender TvSender {get;}
public async Task<RequestEngineResult> RequestTvShow(SearchTvShowViewModel tv) public async Task<RequestEngineResult> RequestTvShow(SearchTvShowViewModel tv)
{ {
var user = await UserManager.GetUserAsync(new ClaimsPrincipal(User)); var user = await User();
var tvBuilder = new TvShowRequestBuilder(TvApi); var tvBuilder = new TvShowRequestBuilder(TvApi);
(await tvBuilder (await tvBuilder
@ -132,13 +130,28 @@ namespace Ombi.Core.Engine
{ {
var allRequests = TvRepository.Get(); var allRequests = TvRepository.Get();
var results = await allRequests.FirstOrDefaultAsync(x => x.Id == request.Id); var results = await allRequests.FirstOrDefaultAsync(x => x.Id == request.Id);
results = Mapper.Map<TvRequests>(request);
// TODO need to check if we need to approve any child requests since they may have updated // TODO need to check if we need to approve any child requests since they may have updated
await TvRepository.Update(results); await TvRepository.Update(results);
return results; return results;
} }
public async Task<ChildRequests> UpdateChildRequest(ChildRequests request)
{
var allRequests = TvRepository.GetChild();
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.UpdateChild(results);
return results;
}
public async Task RemoveTvChild(int requestId)
{
var request = await TvRepository.GetChild().FirstOrDefaultAsync(x => x.Id == requestId);
await TvRepository.DeleteChild(request);
}
public async Task RemoveTvRequest(int requestId) public async Task RemoveTvRequest(int requestId)
{ {
var request = await TvRepository.Get().FirstOrDefaultAsync(x => x.Id == requestId); var request = await TvRepository.Get().FirstOrDefaultAsync(x => x.Id == requestId);

View file

@ -17,14 +17,16 @@ using System.Threading.Tasks;
using Ombi.Core.Rule.Interfaces; using Ombi.Core.Rule.Interfaces;
using Ombi.Store.Entities.Requests; using Ombi.Store.Entities.Requests;
using Ombi.Store.Repository.Requests; using Ombi.Store.Repository.Requests;
using Ombi.Store.Entities;
using Microsoft.AspNetCore.Identity;
namespace Ombi.Core.Engine namespace Ombi.Core.Engine
{ {
public class TvSearchEngine : BaseMediaEngine, ITvSearchEngine public class TvSearchEngine : BaseMediaEngine, ITvSearchEngine
{ {
public TvSearchEngine(IPrincipal identity, IRequestServiceMain service, ITvMazeApi tvMaze, IMapper mapper, ISettingsService<PlexSettings> plexSettings, public TvSearchEngine(IPrincipal identity, IRequestServiceMain service, ITvMazeApi tvMaze, IMapper mapper, ISettingsService<PlexSettings> plexSettings,
ISettingsService<EmbySettings> embySettings, IPlexContentRepository repo, ITraktApi trakt, IRuleEvaluator r) ISettingsService<EmbySettings> embySettings, IPlexContentRepository repo, ITraktApi trakt, IRuleEvaluator r, UserManager<OmbiUser> um)
: base(identity, service, r) : base(identity, service, r, um)
{ {
TvMazeApi = tvMaze; TvMazeApi = tvMaze;
Mapper = mapper; Mapper = mapper;

View file

@ -35,6 +35,10 @@ namespace Ombi.Core
public async Task<NewSeries> SendToSonarr(ChildRequests model, string qualityId = null) public async Task<NewSeries> SendToSonarr(ChildRequests model, string qualityId = null)
{ {
var s = await Settings.GetSettingsAsync(); var s = await Settings.GetSettingsAsync();
if(string.IsNullOrEmpty(s.ApiKey))
{
return null;
}
var qualityProfile = 0; var qualityProfile = 0;
if (!string.IsNullOrEmpty(qualityId)) // try to parse the passed in quality, otherwise use the settings default quality if (!string.IsNullOrEmpty(qualityId)) // try to parse the passed in quality, otherwise use the settings default quality
{ {

View file

@ -2,9 +2,34 @@
<div *ngFor="let child of childRequests"> <div *ngFor="let child of childRequests">
<div class="col-md-12"> <div class="col-md-12">
<div class="col-md-6"> <div class="col-md-2">
<span>Requested By: {{child.requestedUser.alias}}</span> <span>Requested By: {{child.requestedUser.userName}}</span>
<div *ngFor="let season of child.seasonRequests">
<span>Season {{season.seasonNumber}}</span>
<div>Episodes:</div>
<span *ngFor="let episode of season.episodes">
<span [ngStyle]="{ 'color': getColour(episode) }">{{episode.episodeNumber}}</span>
</span>
<br />
<br />
</div> </div>
</div> </div>
<div class="col-md-1 col-md-push-9">
<form>
<button style="text-align: right" (click)="approve(child)" class="btn btn-sm btn-success-outline" type="submit"><i class="fa fa-plus"></i> Approve</button>
</form>
<form>
<button type="button" (click)="deny(child)" class="btn btn-sm btn-danger-outline deny"><i class="fa fa-times"></i> Deny</button>
</form>
<form>
<button type="button" (click)="deny(child)" class="btn btn-sm btn-danger-outline deny"><i class="fa fa-times"></i> Remove</button>
</form>
</div>
</div>
<br />
<br />
<hr />
</div> </div>
</div> </div>

View file

@ -4,7 +4,7 @@ import { ActivatedRoute } from '@angular/router';
import { RequestService } from '../services/request.service'; import { RequestService } from '../services/request.service';
import { IdentityService } from '../services/identity.service'; import { IdentityService } from '../services/identity.service';
import { IChildRequests } from '../interfaces/IRequestModel'; import { IChildRequests, IEpisodesRequests } from '../interfaces/IRequestModel';
@Component({ @Component({
templateUrl: './tvrequest-manage.component.html' templateUrl: './tvrequest-manage.component.html'
@ -29,7 +29,8 @@ export class TvRequestManageComponent {
isAdmin: boolean; isAdmin: boolean;
public removeRequest(request: IChildRequests) { public removeRequest(request: IChildRequests) {
//this.requestService.removeTvRequest(request); this.requestService.deleteChild(request)
.subscribe();
this.removeRequestFromUi(request); this.removeRequestFromUi(request);
} }
@ -37,31 +38,38 @@ export class TvRequestManageComponent {
request.available = available; request.available = available;
} }
public approve(request: IChildRequests) {
request.approved = true;
request.denied = false;
}
public deny(request: IChildRequests) { public deny(request: IChildRequests) {
request.approved = false; request.approved = false;
request.denied = true; request.denied = true;
this.requestService.updateChild(request)
.subscribe();
} }
public approveSeasonRequest(request: IChildRequests) { public approve(request: IChildRequests) {
request.approved = true; request.approved = true;
request.denied = false; request.denied = false;
// this.requestService.updateTvRequest(this.selectedSeason) this.requestService.updateChild(request)
// .subscribe(); .subscribe();
} }
public denySeasonRequest(request: IChildRequests) { public denySeasonRequest(request: IChildRequests) {
request.approved = false; request.approved = false;
request.denied = true; request.denied = true;
// this.requestService.updateTvRequest(this.selectedSeason) this.requestService.updateChild(request)
// .subscribe(); .subscribe();
} }
public getColour(ep: IEpisodesRequests): string {
if (ep.available)
{
return "lime";
}
if (ep.approved)
{
return "#00c0ff";
}
return "white";
}
private removeRequestFromUi(key: IChildRequests) { private removeRequestFromUi(key: IChildRequests) {
var index = this.childRequests.indexOf(key, 0); var index = this.childRequests.indexOf(key, 0);

View file

@ -60,6 +60,12 @@ export class RequestService extends ServiceAuthHelpers {
updateTvRequest(request: ITvRequests): Observable<ITvRequests> { updateTvRequest(request: ITvRequests): Observable<ITvRequests> {
return this.http.put(`${this.url}tv/`, JSON.stringify(request), { headers: this.headers }).map(this.extractData); return this.http.put(`${this.url}tv/`, JSON.stringify(request), { headers: this.headers }).map(this.extractData);
} }
updateChild(child: IChildRequests): Observable<IChildRequests> {
return this.http.put(`${this.url}tv/child`, JSON.stringify(child), { headers: this.headers }).map(this.extractData);
}
deleteChild(child: IChildRequests): Observable<IChildRequests> {
return this.http.delete(`${this.url}tv/child/${child.id}`, { headers: this.headers }).map(this.extractData);
}
getRequestsCount(): Observable<IRequestCountModel> { getRequestsCount(): Observable<IRequestCountModel> {
return this.basicHttp.get(`${this.url}count`).map(this.extractData); return this.basicHttp.get(`${this.url}count`).map(this.extractData);

View file

@ -162,6 +162,29 @@ namespace Ombi.Controllers
return await TvRequestEngine.UpdateTvRequest(model); return await TvRequestEngine.UpdateTvRequest(model);
} }
/// <summary>
/// Updates the a specific child request
/// </summary>
/// <param name="child">The model.</param>
/// <returns></returns>
[HttpPut("tv/child")]
public async Task<ChildRequests> UpdateChild([FromBody] ChildRequests child)
{
return await TvRequestEngine.UpdateChildRequest(child);
}
/// <summary>
/// Deletes the a specific tv request
/// </summary>
/// <param name="requestId">The model.</param>
/// <returns></returns>
[HttpDelete("tv/child/{requestId:int}")]
public async Task DeleteChildRequest(int requestId)
{
await TvRequestEngine.RemoveTvChild(requestId);
}
/// <summary> /// <summary>
/// Retuns all children requests for the request id /// Retuns all children requests for the request id
/// </summary> /// </summary>

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
{ {
"name": "Ombi", "name": "ombi",
"private": true, "private": true,
"version": "1.0.0", "version": "1.0.0",
"scripts": { "scripts": {