From b7bb0869da1163af78f94891dc1a16c6c5b0b0bf Mon Sep 17 00:00:00 2001 From: tidusjar Date: Fri, 12 Feb 2021 21:39:57 +0000 Subject: [PATCH] Made a start on the issues rework --- src/Ombi.Core/Engine/V2/IssuesEngine.cs | 59 +++++++++++++++++++ src/Ombi.DependencyInjection/IocExtensions.cs | 1 + src/Ombi/ClientApp/angular.json | 5 +- .../ClientApp/src/app/interfaces/IIssues.ts | 6 ++ .../src/app/issues/components/index.ts | 5 ++ .../src/app/issues/issues.component.ts | 17 +++--- .../ClientApp/src/app/issues/issues.module.ts | 3 +- .../src/app/issues/issuestable.component.html | 25 ++------ .../src/app/issues/issuestable.component.ts | 10 +++- .../src/app/services/issuesv2.service.ts | 19 ++++++ src/Ombi/Controllers/V2/IssuesController.cs | 24 ++++++++ 11 files changed, 139 insertions(+), 35 deletions(-) create mode 100644 src/Ombi.Core/Engine/V2/IssuesEngine.cs create mode 100644 src/Ombi/ClientApp/src/app/services/issuesv2.service.ts create mode 100644 src/Ombi/Controllers/V2/IssuesController.cs diff --git a/src/Ombi.Core/Engine/V2/IssuesEngine.cs b/src/Ombi.Core/Engine/V2/IssuesEngine.cs new file mode 100644 index 000000000..a596e7ac9 --- /dev/null +++ b/src/Ombi.Core/Engine/V2/IssuesEngine.cs @@ -0,0 +1,59 @@ +using Microsoft.EntityFrameworkCore; +using Ombi.Store.Entities.Requests; +using Ombi.Store.Repository; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Ombi.Core.Engine.V2 +{ + + public interface IIssuesEngine + { + Task> GetIssues(int position, int take, IssueStatus status); + } + + public class IssuesEngine : IIssuesEngine + { + private readonly IRepository _categories; + private readonly IRepository _issues; + private readonly IRepository _comments; + + public IssuesEngine(IRepository categories, + IRepository issues, + IRepository comments) + { + _categories = categories; + _issues = issues; + _comments = comments; + } + + public async Task> GetIssues(int position, int take, IssueStatus status) + { + var issues = await _issues.GetAll().Where(x => x.Status == status).Skip(position).Take(take).ToListAsync(); + var grouped = issues.GroupBy(x => x.Title, (key, g) => new { Title = key, Issues = g }); + + var model = new List(); + + foreach(var group in grouped) + { + model.Add(new IssuesSummaryModel + { + Count = group.Issues.Count(), + Title = group.Title, + Issues = group.Issues + }); + } + + return model; + } + + } + + public class IssuesSummaryModel + { + public string Title { get; set; } + public int Count { get; set; } + public IEnumerable Issues { get; set; } + } +} diff --git a/src/Ombi.DependencyInjection/IocExtensions.cs b/src/Ombi.DependencyInjection/IocExtensions.cs index d5e577d84..ef9c9230c 100644 --- a/src/Ombi.DependencyInjection/IocExtensions.cs +++ b/src/Ombi.DependencyInjection/IocExtensions.cs @@ -114,6 +114,7 @@ namespace Ombi.DependencyInjection services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); } public static void RegisterHttp(this IServiceCollection services) diff --git a/src/Ombi/ClientApp/angular.json b/src/Ombi/ClientApp/angular.json index 2e3ff44e5..41030a25a 100644 --- a/src/Ombi/ClientApp/angular.json +++ b/src/Ombi/ClientApp/angular.json @@ -124,5 +124,8 @@ } } }, - "defaultProject": "ombi" + "defaultProject": "ombi", + "cli": { + "analytics": false + } } \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/interfaces/IIssues.ts b/src/Ombi/ClientApp/src/app/interfaces/IIssues.ts index dce9882ec..b01749057 100644 --- a/src/Ombi/ClientApp/src/app/interfaces/IIssues.ts +++ b/src/Ombi/ClientApp/src/app/interfaces/IIssues.ts @@ -62,3 +62,9 @@ export interface IUpdateStatus { issueId: number; status: IssueStatus; } + +export interface IIssuesSummary { + title: string; + count: number; + issues: IIssues[]; +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/issues/components/index.ts b/src/Ombi/ClientApp/src/app/issues/components/index.ts index 93bb4907d..932f1eeb4 100644 --- a/src/Ombi/ClientApp/src/app/issues/components/index.ts +++ b/src/Ombi/ClientApp/src/app/issues/components/index.ts @@ -1,6 +1,8 @@ import { AuthGuard } from "../../auth/auth.guard"; import { IssuesListComponent } from "./issues-list/issues-list.component"; import { Routes } from "@angular/router"; +import { IssuesV2Service } from "../../services/issuesv2.service"; +import { IdentityService, SearchService } from "../../services"; @@ -13,6 +15,9 @@ export const entryComponents: any[] = [ ]; export const providers: any[] = [ + IssuesV2Service, + IdentityService, + SearchService, ]; export const routes: Routes = [ diff --git a/src/Ombi/ClientApp/src/app/issues/issues.component.ts b/src/Ombi/ClientApp/src/app/issues/issues.component.ts index b8482f1ff..5dc02845e 100644 --- a/src/Ombi/ClientApp/src/app/issues/issues.component.ts +++ b/src/Ombi/ClientApp/src/app/issues/issues.component.ts @@ -2,9 +2,10 @@ import { Component, OnInit } from "@angular/core"; import { IssuesService } from "../services"; -import { IIssueCount, IIssues, IPagenator, IssueStatus } from "../interfaces"; +import { IIssueCount, IIssues, IIssuesSummary, IPagenator, IssueStatus } from "../interfaces"; import { PageEvent } from '@angular/material/paginator'; +import { IssuesV2Service } from "../services/issuesv2.service"; @Component({ templateUrl: "issues.component.html", @@ -12,9 +13,9 @@ import { PageEvent } from '@angular/material/paginator'; }) export class IssuesComponent implements OnInit { - public pendingIssues: IIssues[]; - public inProgressIssues: IIssues[]; - public resolvedIssues: IIssues[]; + public pendingIssues: IIssuesSummary[]; + public inProgressIssues: IIssuesSummary[]; + public resolvedIssues: IIssuesSummary[]; public count: IIssueCount; @@ -23,7 +24,7 @@ export class IssuesComponent implements OnInit { private inProgressSkip = 0; private resolvedSkip = 0; - constructor(private issueService: IssuesService) { } + constructor(private issuev2Service: IssuesV2Service, private issueService: IssuesService) { } public ngOnInit() { this.getPending(); @@ -48,19 +49,19 @@ export class IssuesComponent implements OnInit { } private getPending() { - this.issueService.getIssuesPage(this.takeAmount, this.pendingSkip, IssueStatus.Pending).subscribe(x => { + this.issuev2Service.getIssues(this.pendingSkip, this.takeAmount, IssueStatus.Pending).subscribe(x => { this.pendingIssues = x; }); } private getInProg() { - this.issueService.getIssuesPage(this.takeAmount, this.inProgressSkip, IssueStatus.InProgress).subscribe(x => { + this.issuev2Service.getIssues(this.inProgressSkip, this.takeAmount, IssueStatus.InProgress).subscribe(x => { this.inProgressIssues = x; }); } private getResolved() { - this.issueService.getIssuesPage(this.takeAmount, this.resolvedSkip, IssueStatus.Resolved).subscribe(x => { + this.issuev2Service.getIssues(this.resolvedSkip, this.takeAmount, IssueStatus.Resolved).subscribe(x => { this.resolvedIssues = x; }); } diff --git a/src/Ombi/ClientApp/src/app/issues/issues.module.ts b/src/Ombi/ClientApp/src/app/issues/issues.module.ts index 2607d336a..ab55f69cf 100644 --- a/src/Ombi/ClientApp/src/app/issues/issues.module.ts +++ b/src/Ombi/ClientApp/src/app/issues/issues.module.ts @@ -39,8 +39,7 @@ const routes: Routes = [ RouterModule, ], providers: [ - IdentityService, - SearchService, + ...fromComponents.providers ], }) diff --git a/src/Ombi/ClientApp/src/app/issues/issuestable.component.html b/src/Ombi/ClientApp/src/app/issues/issuestable.component.html index e266a718a..8244536ad 100644 --- a/src/Ombi/ClientApp/src/app/issues/issuestable.component.html +++ b/src/Ombi/ClientApp/src/app/issues/issuestable.component.html @@ -6,32 +6,15 @@ {{element.title}} - - {{ 'Issues.Category' | translate}} - {{element.issueCategory.value}} - - - - {{ 'Issues.Subject' | translate}} - {{element.subject}} - - - - {{ 'Issues.Status' | translate}} - {{IssueStatus[element.status] | humanize}} - - - - {{ 'Issues.ReportedBy' | translate}} - {{element.userReported.userAlias}} + + {{ 'Issues.Count' | translate}} + {{element.count}} - - - + diff --git a/src/Ombi/ClientApp/src/app/issues/issuestable.component.ts b/src/Ombi/ClientApp/src/app/issues/issuestable.component.ts index ff584a35e..1ad929741 100644 --- a/src/Ombi/ClientApp/src/app/issues/issuestable.component.ts +++ b/src/Ombi/ClientApp/src/app/issues/issuestable.component.ts @@ -1,6 +1,6 @@ import { Component, EventEmitter, Input, Output } from "@angular/core"; -import { IIssues, IPagenator, IssueStatus } from "../interfaces"; +import { IIssues, IIssuesSummary, IPagenator, IssueStatus } from "../interfaces"; @Component({ selector: "issues-table", @@ -8,12 +8,12 @@ import { IIssues, IPagenator, IssueStatus } from "../interfaces"; }) export class IssuesTableComponent { - @Input() public issues: IIssues[]; + @Input() public issues: IIssuesSummary[]; @Input() public totalRecords: number; @Output() public changePage = new EventEmitter(); - public displayedColumns = ["title", "category", "subject", "status", "reportedBy", "actions"] + public displayedColumns = ["title", "count", "actions"] public IssueStatus = IssueStatus; public resultsLength: number; public gridCount: string = "15"; @@ -49,4 +49,8 @@ export class IssuesTableComponent { this.changePage.emit(event); } + public openDetails(summary: IIssuesSummary) { + + } + } diff --git a/src/Ombi/ClientApp/src/app/services/issuesv2.service.ts b/src/Ombi/ClientApp/src/app/services/issuesv2.service.ts new file mode 100644 index 000000000..69b5c01c4 --- /dev/null +++ b/src/Ombi/ClientApp/src/app/services/issuesv2.service.ts @@ -0,0 +1,19 @@ +import { PlatformLocation, APP_BASE_HREF } from "@angular/common"; +import { Injectable, Inject } from "@angular/core"; + +import { HttpClient } from "@angular/common/http"; +import { Observable } from "rxjs"; + +import { IIssueCategory, IIssueComments, IIssueCount, IIssues, IIssuesChat, IIssuesSummary, INewIssueComments, IssueStatus, IUpdateStatus } from "../interfaces"; +import { ServiceHelpers } from "./service.helpers"; + +@Injectable() +export class IssuesV2Service extends ServiceHelpers { + constructor(http: HttpClient, @Inject(APP_BASE_HREF) href:string) { + super(http, "/api/v2/Issues/", href); + } + + public getIssues(position: number, take: number, status: IssueStatus): Observable { + return this.http.get(`${this.url}${position}/${take}/${status}`, {headers: this.headers}); + } +} diff --git a/src/Ombi/Controllers/V2/IssuesController.cs b/src/Ombi/Controllers/V2/IssuesController.cs new file mode 100644 index 000000000..c2b65cc99 --- /dev/null +++ b/src/Ombi/Controllers/V2/IssuesController.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Mvc; +using Ombi.Core.Engine.V2; +using Ombi.Store.Entities.Requests; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Ombi.Controllers.V2 +{ + public class IssuesController : V2Controller + { + private readonly IIssuesEngine _engine; + + public IssuesController(IIssuesEngine engine) + { + _engine = engine; + } + + [HttpGet("{position}/{take}/{status}")] + public Task> GetIssuesSummary(int position, int take, IssueStatus status) + { + return _engine.GetIssues(position, take, status); + } + } +}