mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-31 03:50:08 -07:00
feat(request-limits): ✨ Added the UI portion to set the new limits
This commit is contained in:
parent
a6e8eefecc
commit
978d4ea33b
7 changed files with 69 additions and 16 deletions
|
@ -24,6 +24,9 @@ namespace Ombi.Core.Models.UI
|
||||||
public RequestQuotaCountModel MusicRequestQuota { get; set; }
|
public RequestQuotaCountModel MusicRequestQuota { get; set; }
|
||||||
public int MusicRequestLimit { get; set; }
|
public int MusicRequestLimit { get; set; }
|
||||||
public UserQualityProfiles UserQualityProfiles { get; set; }
|
public UserQualityProfiles UserQualityProfiles { get; set; }
|
||||||
|
public RequestLimitType MovieRequestLimitType { get; set; }
|
||||||
|
public RequestLimitType MusicRequestLimitType { get; set; }
|
||||||
|
public RequestLimitType EpisodeRequestLimitType { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ClaimCheckboxes
|
public class ClaimCheckboxes
|
||||||
|
|
|
@ -20,12 +20,16 @@ namespace Ombi.Core.Services
|
||||||
Task<RequestQuotaCountModel> GetRemainingTvRequests(OmbiUser user = default);
|
Task<RequestQuotaCountModel> GetRemainingTvRequests(OmbiUser user = default);
|
||||||
Task<RequestQuotaCountModel> GetRemainingMusicRequests(OmbiUser user = default);
|
Task<RequestQuotaCountModel> GetRemainingMusicRequests(OmbiUser user = default);
|
||||||
}
|
}
|
||||||
public class RequestLimitService : BaseEngine, IRequestLimitService
|
public class RequestLimitService : IRequestLimitService
|
||||||
{
|
{
|
||||||
|
private readonly IPrincipal _user;
|
||||||
|
private readonly OmbiUserManager _userManager;
|
||||||
private readonly IRepository<RequestLog> _requestLog;
|
private readonly IRepository<RequestLog> _requestLog;
|
||||||
|
|
||||||
public RequestLimitService(IPrincipal user, OmbiUserManager um, IRuleEvaluator rules, IRepository<RequestLog> rl) : base(user, um, rules)
|
public RequestLimitService(IPrincipal user, OmbiUserManager userManager, IRepository<RequestLog> rl)
|
||||||
{
|
{
|
||||||
|
_user = user;
|
||||||
|
_userManager = userManager;
|
||||||
_requestLog = rl;
|
_requestLog = rl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,6 +133,12 @@ namespace Ombi.Core.Services
|
||||||
return await CalculateBasicRemaingRequests(user, limit, user.MusicRequestLimitType ?? RequestLimitType.Day, log);
|
return await CalculateBasicRemaingRequests(user, limit, user.MusicRequestLimitType ?? RequestLimitType.Day, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<OmbiUser> GetUser()
|
||||||
|
{
|
||||||
|
var username = _user.Identity.Name.ToUpper();
|
||||||
|
return await _userManager.Users.FirstOrDefaultAsync(x => x.NormalizedUserName == username);
|
||||||
|
}
|
||||||
|
|
||||||
private static async Task<RequestQuotaCountModel> CalculateBasicRemaingRequests(OmbiUser user, int limit, RequestLimitType type, IQueryable<RequestLog> log)
|
private static async Task<RequestQuotaCountModel> CalculateBasicRemaingRequests(OmbiUser user, int limit, RequestLimitType type, IQueryable<RequestLog> log)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
|
@ -81,10 +81,10 @@ namespace Ombi.DependencyInjection
|
||||||
services.RegisterEngines();
|
services.RegisterEngines();
|
||||||
services.RegisterEnginesV2();
|
services.RegisterEnginesV2();
|
||||||
services.RegisterApi();
|
services.RegisterApi();
|
||||||
|
services.RegisterHttp();
|
||||||
services.RegisterServices();
|
services.RegisterServices();
|
||||||
services.RegisterStore();
|
services.RegisterStore();
|
||||||
services.RegisterJobs();
|
services.RegisterJobs();
|
||||||
services.RegisterHttp();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RegisterEngines(this IServiceCollection services)
|
public static void RegisterEngines(this IServiceCollection services)
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
import { Component, Input, OnInit } from "@angular/core";
|
import { Component, Input, OnInit } from "@angular/core";
|
||||||
import { TranslateService } from "@ngx-translate/core";
|
|
||||||
import { RequestType } from "../../interfaces";
|
|
||||||
import { IRemainingRequests } from "../../interfaces/IRemainingRequests";
|
import { IRemainingRequests } from "../../interfaces/IRemainingRequests";
|
||||||
import { RequestService } from "../../services";
|
import { RequestService } from "../../services";
|
||||||
|
import { RequestType } from "../../interfaces";
|
||||||
|
import { TranslateService } from "@ngx-translate/core";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: "app-remaining-requests",
|
selector: "app-remaining-requests",
|
||||||
templateUrl: "remaining-requests.component.html",
|
templateUrl: "remaining-requests.component.html",
|
||||||
|
|
|
@ -42,21 +42,51 @@
|
||||||
|
|
||||||
<div class="col-md-3 col-sm-12">
|
<div class="col-md-3 col-sm-12">
|
||||||
<label class="control-label"><h3>Request Limits</h3></label>
|
<label class="control-label"><h3>Request Limits</h3></label>
|
||||||
<div>
|
<div class="row">
|
||||||
<mat-form-field>
|
<div class="col-6">
|
||||||
<input id="movieRequestLimit" matInput placeholder="Movie Request Limit" [(ngModel)]="user.movieRequestLimit">
|
<mat-form-field>
|
||||||
</mat-form-field>
|
<input id="movieRequestLimit" matInput placeholder="Movie Request Limit" [(ngModel)]="user.movieRequestLimit">
|
||||||
|
</mat-form-field>
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
<mat-label>Movie Request Limit Type</mat-label>
|
||||||
|
<mat-select [(value)]="user.movieRequestLimitType">
|
||||||
|
<mat-option *ngFor="let value of requestLimitTypes" [value]="value">
|
||||||
|
{{RequestLimitType[value]}}
|
||||||
|
</mat-option>
|
||||||
|
</mat-select>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div class="row">
|
||||||
<mat-form-field>
|
<div class="col-6">
|
||||||
<input id="episodeRequestLimit" matInput placeholder="Episode Request Limit" [(ngModel)]="user.episodeRequestLimit">
|
<mat-form-field>
|
||||||
</mat-form-field>
|
<input id="episodeRequestLimit" matInput placeholder="Episode Request Limit" [(ngModel)]="user.episodeRequestLimit">
|
||||||
|
</mat-form-field>
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
<mat-label>Episode Request Limit Type</mat-label>
|
||||||
|
<mat-select [(value)]="user.episodeRequestLimitType">
|
||||||
|
<mat-option *ngFor="let value of requestLimitTypes" [value]="value">
|
||||||
|
{{RequestLimitType[value]}}
|
||||||
|
</mat-option>
|
||||||
|
</mat-select>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div class="row">
|
||||||
|
<div class="col-6">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input id="musicRequestLimit" matInput placeholder="Music Request Limit" [(ngModel)]="user.musicRequestLimit">
|
<input id="musicRequestLimit" matInput placeholder="Music Request Limit" [(ngModel)]="user.musicRequestLimit">
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
<mat-label>Music Request Limit Type</mat-label>
|
||||||
|
<mat-select [(value)]="user.musicRequestLimitType">
|
||||||
|
<mat-option *ngFor="let value of requestLimitTypes" [value]="value">
|
||||||
|
{{RequestLimitType[value]}}
|
||||||
|
</mat-option>
|
||||||
|
</mat-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<label class="control-label"><h3>Quality & Root Path Preferences</h3></label>
|
<label class="control-label"><h3>Quality & Root Path Preferences</h3></label>
|
||||||
<mat-form-field *ngIf="sonarrQualities">
|
<mat-form-field *ngIf="sonarrQualities">
|
||||||
<mat-label>Sonarr Quality Profile</mat-label>
|
<mat-label>Sonarr Quality Profile</mat-label>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { ActivatedRoute, Router } from "@angular/router";
|
import { ActivatedRoute, Router } from "@angular/router";
|
||||||
import { Component, OnInit } from "@angular/core";
|
import { Component, OnInit } from "@angular/core";
|
||||||
import { ICheckbox, ICustomizationSettings, INotificationAgent, INotificationPreferences, IRadarrProfile, IRadarrRootFolder, ISonarrProfile, ISonarrRootFolder, IUser, UserType } from "../interfaces";
|
import { ICheckbox, ICustomizationSettings, INotificationAgent, INotificationPreferences, IRadarrProfile, IRadarrRootFolder, ISonarrProfile, ISonarrRootFolder, IUser, RequestLimitType, UserType } from "../interfaces";
|
||||||
import { IdentityService, MessageService, RadarrService, SettingsService, SonarrService } from "../services";
|
import { IdentityService, MessageService, RadarrService, SettingsService, SonarrService } from "../services";
|
||||||
|
|
||||||
import { Clipboard } from '@angular/cdk/clipboard';
|
import { Clipboard } from '@angular/cdk/clipboard';
|
||||||
|
@ -27,6 +27,8 @@ export class UserManagementUserComponent implements OnInit {
|
||||||
public edit: boolean;
|
public edit: boolean;
|
||||||
|
|
||||||
public countries: string[];
|
public countries: string[];
|
||||||
|
public requestLimitTypes: RequestLimitType[];
|
||||||
|
public RequestLimitType = RequestLimitType;
|
||||||
|
|
||||||
private customization: ICustomizationSettings;
|
private customization: ICustomizationSettings;
|
||||||
private accessToken: string;
|
private accessToken: string;
|
||||||
|
@ -53,7 +55,7 @@ export class UserManagementUserComponent implements OnInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ngOnInit() {
|
public ngOnInit() {
|
||||||
|
this.requestLimitTypes = [RequestLimitType.Day, RequestLimitType.Week, RequestLimitType.Month];
|
||||||
this.identityService.getSupportedStreamingCountries().subscribe(x => this.countries = x);
|
this.identityService.getSupportedStreamingCountries().subscribe(x => this.countries = x);
|
||||||
this.identityService.getAllAvailableClaims().subscribe(x => this.availableClaims = x);
|
this.identityService.getAllAvailableClaims().subscribe(x => this.availableClaims = x);
|
||||||
if(this.edit) {
|
if(this.edit) {
|
||||||
|
|
|
@ -399,6 +399,9 @@ namespace Ombi.Controllers.V1
|
||||||
EpisodeRequestLimit = user.EpisodeRequestLimit ?? 0,
|
EpisodeRequestLimit = user.EpisodeRequestLimit ?? 0,
|
||||||
MovieRequestLimit = user.MovieRequestLimit ?? 0,
|
MovieRequestLimit = user.MovieRequestLimit ?? 0,
|
||||||
MusicRequestLimit = user.MusicRequestLimit ?? 0,
|
MusicRequestLimit = user.MusicRequestLimit ?? 0,
|
||||||
|
MovieRequestLimitType = user.MovieRequestLimitType ?? RequestLimitType.Week,
|
||||||
|
EpisodeRequestLimitType = user.EpisodeRequestLimitType ?? RequestLimitType.Week,
|
||||||
|
MusicRequestLimitType = user.MusicRequestLimitType ?? RequestLimitType.Week,
|
||||||
Language = user.Language,
|
Language = user.Language,
|
||||||
StreamingCountry = user.StreamingCountry
|
StreamingCountry = user.StreamingCountry
|
||||||
};
|
};
|
||||||
|
@ -641,6 +644,9 @@ namespace Ombi.Controllers.V1
|
||||||
user.MovieRequestLimit = ui.MovieRequestLimit;
|
user.MovieRequestLimit = ui.MovieRequestLimit;
|
||||||
user.EpisodeRequestLimit = ui.EpisodeRequestLimit;
|
user.EpisodeRequestLimit = ui.EpisodeRequestLimit;
|
||||||
user.MusicRequestLimit = ui.MusicRequestLimit;
|
user.MusicRequestLimit = ui.MusicRequestLimit;
|
||||||
|
user.EpisodeRequestLimitType = ui.EpisodeRequestLimitType;
|
||||||
|
user.MusicRequestLimitType = ui.MusicRequestLimitType;
|
||||||
|
user.MovieRequestLimitType = ui.MovieRequestLimitType;
|
||||||
if (ui.Password.HasValue())
|
if (ui.Password.HasValue())
|
||||||
{
|
{
|
||||||
user.PasswordHash = UserManager.PasswordHasher.HashPassword(user, ui.Password);
|
user.PasswordHash = UserManager.PasswordHasher.HashPassword(user, ui.Password);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue