diff --git a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs index 90a6b0011..517a1e127 100644 --- a/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IRequestEngine.cs @@ -13,5 +13,6 @@ namespace Ombi.Core.Engine.Interfaces RequestCountModel RequestCount(); Task> GetRequests(int count, int position); Task> GetRequests(); + Task UserHasRequest(string userId); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 5823578dc..91fb44d63 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -120,7 +120,10 @@ namespace Ombi.Core.Engine public async Task> GetRequests(int count, int position) { var allRequests = await MovieRepository.GetWithUser().Skip(position).Take(count).ToListAsync(); - allRequests.ForEach(x => PosterPathHelper.FixPosterPath(x.PosterPath)); + allRequests.ForEach(x => + { + x.PosterPath = PosterPathHelper.FixPosterPath(x.PosterPath); + }); return allRequests; } @@ -258,6 +261,11 @@ namespace Ombi.Core.Engine await MovieRepository.Delete(request); } + public async Task UserHasRequest(string userId) + { + return await MovieRepository.GetAll().AnyAsync(x => x.RequestedUserId == userId); + } + private async Task AddMovieRequest(MovieRequests model, string movieName) { await MovieRepository.Add(model); diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 852d5e2f0..eb38ff1d1 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -242,6 +242,11 @@ namespace Ombi.Core.Engine await TvRepository.Delete(request); } + public async Task UserHasRequest(string userId) + { + return await TvRepository.GetChild().AnyAsync(x => x.RequestedUserId == userId); + } + private async Task AddExistingRequest(ChildRequests newRequest, TvRequests existingRequest) { // Add the child diff --git a/src/Ombi.Core/Models/UI/UserViewModel.cs b/src/Ombi.Core/Models/UI/UserViewModel.cs index 87ad7a97f..dffe6000a 100644 --- a/src/Ombi.Core/Models/UI/UserViewModel.cs +++ b/src/Ombi.Core/Models/UI/UserViewModel.cs @@ -6,7 +6,7 @@ namespace Ombi.Core.Models.UI public class UserViewModel { public string Id { get; set; } - public string Username { get; set; } + public string UserName { get; set; } public string Alias { get; set; } public List Claims { get; set; } public string EmailAddress { get; set; } diff --git a/src/Ombi.Core/Rule/Rules/Request/ExistingMovieRequestRule.cs b/src/Ombi.Core/Rule/Rules/Request/ExistingMovieRequestRule.cs index 1761dcf99..d48245e9b 100644 --- a/src/Ombi.Core/Rule/Rules/Request/ExistingMovieRequestRule.cs +++ b/src/Ombi.Core/Rule/Rules/Request/ExistingMovieRequestRule.cs @@ -4,6 +4,7 @@ using Ombi.Core.Rule.Interfaces; using Ombi.Store.Entities; using Ombi.Store.Entities.Requests; using Ombi.Store.Repository; +using Ombi.Store.Repository.Requests; namespace Ombi.Core.Rule.Rules.Request { diff --git a/src/Ombi.Store/Repository/IRepository.cs b/src/Ombi.Store/Repository/IRepository.cs index 15702572d..db5f3fc15 100644 --- a/src/Ombi.Store/Repository/IRepository.cs +++ b/src/Ombi.Store/Repository/IRepository.cs @@ -14,6 +14,8 @@ namespace Ombi.Store.Repository IQueryable GetAll(); Task FirstOrDefaultAsync(Expression> predicate); Task AddRange(IEnumerable content); + Task DeleteRange(IEnumerable req); + Task Delete(T request); IIncludableQueryable Include( IQueryable source, Expression> navigationPropertyPath) diff --git a/src/Ombi.Store/Repository/Repository.cs b/src/Ombi.Store/Repository/Repository.cs index dbd0cfe7f..4900430f1 100644 --- a/src/Ombi.Store/Repository/Repository.cs +++ b/src/Ombi.Store/Repository/Repository.cs @@ -48,6 +48,18 @@ namespace Ombi.Store.Repository return content; } + public async Task Delete(T request) + { + _db.Remove(request); + await _ctx.SaveChangesAsync(); + } + + public async Task DeleteRange(IEnumerable req) + { + _db.RemoveRange(req); + await _ctx.SaveChangesAsync(); + } + public IIncludableQueryable Include( IQueryable source, Expression> navigationPropertyPath) where TEntity : class diff --git a/src/Ombi.Store/Repository/Requests/IMovieRequestRepository.cs b/src/Ombi.Store/Repository/Requests/IMovieRequestRepository.cs index 7cca5105c..64f95fd71 100644 --- a/src/Ombi.Store/Repository/Requests/IMovieRequestRepository.cs +++ b/src/Ombi.Store/Repository/Requests/IMovieRequestRepository.cs @@ -2,12 +2,11 @@ using System.Threading.Tasks; using Ombi.Store.Entities.Requests; -namespace Ombi.Store.Repository +namespace Ombi.Store.Repository.Requests { public interface IMovieRequestRepository : IRepository { Task Add(MovieRequests request); - Task Delete(MovieRequests request); Task GetRequestAsync(int theMovieDbId); MovieRequests GetRequest(int theMovieDbId); Task Update(MovieRequests request); diff --git a/src/Ombi.Store/Repository/Requests/ITvRequestRepository.cs b/src/Ombi.Store/Repository/Requests/ITvRequestRepository.cs index 588792ad9..46d2c0bf6 100644 --- a/src/Ombi.Store/Repository/Requests/ITvRequestRepository.cs +++ b/src/Ombi.Store/Repository/Requests/ITvRequestRepository.cs @@ -1,11 +1,12 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Ombi.Store.Context; using Ombi.Store.Entities.Requests; namespace Ombi.Store.Repository.Requests { - public interface ITvRequestRepository + public interface ITvRequestRepository { IOmbiContext Db { get; } Task Add(TvRequests request); @@ -19,5 +20,6 @@ namespace Ombi.Store.Repository.Requests Task UpdateChild(ChildRequests request); IQueryable GetChild(); Task Save(); + Task DeleteChildRange(IEnumerable request); } } \ No newline at end of file diff --git a/src/Ombi.Store/Repository/Requests/MovieRequestRepository.cs b/src/Ombi.Store/Repository/Requests/MovieRequestRepository.cs index c62a770a4..2c2cd05f0 100644 --- a/src/Ombi.Store/Repository/Requests/MovieRequestRepository.cs +++ b/src/Ombi.Store/Repository/Requests/MovieRequestRepository.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; @@ -46,12 +47,6 @@ namespace Ombi.Store.Repository.Requests .AsQueryable(); } - public async Task Delete(MovieRequests request) - { - Db.MovieRequests.Remove(request); - await Db.SaveChangesAsync(); - } - public async Task Update(MovieRequests request) { if (Db.Entry(request).State == EntityState.Detached) diff --git a/src/Ombi.Store/Repository/Requests/TvRequestRepository.cs b/src/Ombi.Store/Repository/Requests/TvRequestRepository.cs index 0f0a914c5..216058d67 100644 --- a/src/Ombi.Store/Repository/Requests/TvRequestRepository.cs +++ b/src/Ombi.Store/Repository/Requests/TvRequestRepository.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Ombi.Store.Context; @@ -82,13 +83,19 @@ namespace Ombi.Store.Repository.Requests Db.TvRequests.Remove(request); await Db.SaveChangesAsync(); } - + public async Task DeleteChild(ChildRequests request) { Db.ChildRequests.Remove(request); await Db.SaveChangesAsync(); } + public async Task DeleteChildRange(IEnumerable request) + { + Db.ChildRequests.RemoveRange(request); + await Db.SaveChangesAsync(); + } + public async Task Update(TvRequests request) { Db.Update(request); diff --git a/src/Ombi/.vscode/settings.json b/src/Ombi/.vscode/settings.json new file mode 100644 index 000000000..3ed807a1a --- /dev/null +++ b/src/Ombi/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cSpell.words": [ + "usermanagement" + ] +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/app.module.ts b/src/Ombi/ClientApp/app/app.module.ts index 2a8dea9d5..f7c5c240b 100644 --- a/src/Ombi/ClientApp/app/app.module.ts +++ b/src/Ombi/ClientApp/app/app.module.ts @@ -10,7 +10,7 @@ import { RouterModule, Routes } from "@angular/router"; //import { DragulaModule, DragulaService } from 'ng2-dragula/ng2-dragula'; import { NgbModule } from "@ng-bootstrap/ng-bootstrap"; import { GrowlModule } from "primeng/components/growl/growl"; -import { ButtonModule, CaptchaModule, DataTableModule,DialogModule, SharedModule, TooltipModule } from "primeng/primeng"; +import { ButtonModule, CaptchaModule,ConfirmationService, ConfirmDialogModule, DataTableModule,DialogModule, SharedModule, TooltipModule } from "primeng/primeng"; // Components import { AppComponent } from "./app.component"; @@ -80,6 +80,7 @@ const routes: Routes = [ RequestsModule, CaptchaModule, TooltipModule, + ConfirmDialogModule, ], declarations: [ AppComponent, @@ -98,6 +99,7 @@ const routes: Routes = [ IdentityService, StatusService, LandingPageService, + ConfirmationService, ImageService, //DragulaService ], diff --git a/src/Ombi/ClientApp/app/interfaces/IUser.ts b/src/Ombi/ClientApp/app/interfaces/IUser.ts index fae6a4bc1..26c48b22e 100644 --- a/src/Ombi/ClientApp/app/interfaces/IUser.ts +++ b/src/Ombi/ClientApp/app/interfaces/IUser.ts @@ -2,7 +2,7 @@ export interface IUser { id: string; - username: string; + userName: string; alias: string; claims: ICheckbox[]; emailAddress: string; diff --git a/src/Ombi/ClientApp/app/requests/movierequests.component.html b/src/Ombi/ClientApp/app/requests/movierequests.component.html index 6f4e180c8..6e5f7eef5 100644 --- a/src/Ombi/ClientApp/app/requests/movierequests.component.html +++ b/src/Ombi/ClientApp/app/requests/movierequests.component.html @@ -30,9 +30,9 @@
Requested By: - {{request.requestedUser.username}} + {{request.requestedUser.userName}} {{request.requestedUser.alias}} - {{request.requestedUser.username}} + {{request.requestedUser.userName}}
Status: diff --git a/src/Ombi/ClientApp/app/services/identity.service.ts b/src/Ombi/ClientApp/app/services/identity.service.ts index e80c73eb6..5e6601f2f 100644 --- a/src/Ombi/ClientApp/app/services/identity.service.ts +++ b/src/Ombi/ClientApp/app/services/identity.service.ts @@ -47,6 +47,10 @@ export class IdentityService extends ServiceAuthHelpers { return this.http.delete(`${this.url}${user.id}`, { headers: this.headers }).map(this.extractData); } + public hasUserRequested(userId: string): Observable { + return this.http.get(`${this.url}userhasrequest/${userId}`).map(this.extractData); + } + public submitResetPassword(email: string): Observable { return this.regularHttp.post(this.url + "reset", JSON.stringify({email}), { headers: this.headers }).map(this.extractData); } diff --git a/src/Ombi/ClientApp/app/usermanagement/updatedetails.component.ts b/src/Ombi/ClientApp/app/usermanagement/updatedetails.component.ts index fb597b55e..ef8d3b2a2 100644 --- a/src/Ombi/ClientApp/app/usermanagement/updatedetails.component.ts +++ b/src/Ombi/ClientApp/app/usermanagement/updatedetails.component.ts @@ -20,7 +20,7 @@ export class UpdateDetailsComponent implements OnInit { const localUser = x as IUpdateLocalUser; this.form = this.fb.group({ id:[localUser.id], - username: [localUser.username], + username: [localUser.userName], emailAddress: [localUser.emailAddress, [Validators.email]], confirmNewPassword: [localUser.confirmNewPassword], currentPassword: [localUser.currentPassword, [Validators.required]], diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.html b/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.html index bc23a6141..9f2f5328c 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.html +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.html @@ -14,7 +14,7 @@
- +
diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts b/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts index 5100f675e..6eab25736 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement-add.component.ts @@ -24,7 +24,7 @@ export class UserManagementAddComponent implements OnInit { emailAddress: "", id: "", password: "", - username: "", + userName: "", userType: UserType.LocalUser, checked:false, hasLoggedIn: false, @@ -54,7 +54,7 @@ export class UserManagementAddComponent implements OnInit { this.identityService.createUser(this.user).subscribe(x => { if (x.successful) { - this.notificationSerivce.success("Updated", `The user ${this.user.username} has been created successfully`); + this.notificationSerivce.success("Updated", `The user ${this.user.userName} has been created successfully`); this.router.navigate(["usermanagement"]); } else { x.errors.forEach((val) => { diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement-edit.component.html b/src/Ombi/ClientApp/app/usermanagement/usermanagement-edit.component.html index b27e82cf4..23038e68e 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement-edit.component.html +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement-edit.component.html @@ -1,8 +1,10 @@ 
-

User: {{user.username}}

+

User: {{user.userName}}

+ +