]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Client: add requests stats page
authorChocobozzz <florian.bigard@gmail.com>
Fri, 23 Sep 2016 15:09:38 +0000 (17:09 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Fri, 23 Sep 2016 15:09:38 +0000 (17:09 +0200)
16 files changed:
.gitignore
client/src/app/admin/admin.routes.ts
client/src/app/admin/index.ts
client/src/app/admin/menu-admin.component.html
client/src/app/admin/requests/index.ts [new file with mode: 0644]
client/src/app/admin/requests/request-stats/index.ts [new file with mode: 0644]
client/src/app/admin/requests/request-stats/request-stats.component.html [new file with mode: 0644]
client/src/app/admin/requests/request-stats/request-stats.component.scss [new file with mode: 0644]
client/src/app/admin/requests/request-stats/request-stats.component.ts [new file with mode: 0644]
client/src/app/admin/requests/requests.component.ts [new file with mode: 0644]
client/src/app/admin/requests/requests.routes.ts [new file with mode: 0644]
client/src/app/admin/requests/shared/index.ts [new file with mode: 0644]
client/src/app/admin/requests/shared/request-stats.model.ts [new file with mode: 0644]
client/src/app/admin/requests/shared/request.service.ts [new file with mode: 0644]
client/src/app/app.module.ts
server/controllers/api/v1/requests.js

index 6f235df988ebb0fb889b7f09ead1f28c75f0dd10..d292a4338eb81b4336184d5a9337e318c7e83376 100644 (file)
@@ -15,3 +15,6 @@ thumbnails
 config/production.yaml
 ffmpeg
 .tags
+*.sublime-project
+*.sublime-workspace
+torrent/
index 1fcace99491087bcfd6fd67458d890fe675a188d..edb8ba49f8a9d1bdcb434accf773e044a8b2e412 100644 (file)
@@ -2,6 +2,7 @@ import { Routes } from '@angular/router';
 
 import { AdminComponent } from './admin.component';
 import { FriendsRoutes } from './friends';
+import { RequestsRoutes } from './requests';
 import { UsersRoutes } from './users';
 
 export const AdminRoutes: Routes = [
@@ -15,6 +16,7 @@ export const AdminRoutes: Routes = [
         pathMatch: 'full'
       },
       ...FriendsRoutes,
+      ...RequestsRoutes,
       ...UsersRoutes
     ]
   }
index 3d0e67b151d516814927939607b862f0ac2ec303..493caed1576635d2a7937ad85d4afc349985706a 100644 (file)
@@ -1,4 +1,5 @@
 export * from './friends';
+export * from './requests';
 export * from './users';
 export * from './admin.component';
 export * from './admin.routes';
index f821974bdde39b3a0205112445b7216d2a35b3c7..e250615aab24e2e2bc134a17ca8939abdd34ceeb 100644 (file)
       <span class="hidden-xs glyphicon glyphicon-cloud"></span>
       <a [routerLink]="['/admin/friends/list']">List friends</a>
     </div>
+
+    <div id="panel-request-stats" class="panel-button">
+      <span class="hidden-xs glyphicon glyphicon-stats"></span>
+      <a [routerLink]="['/admin/requests/stats']">Request stats</a>
+    </div>
   </div>
 
   <div class="panel-block">
diff --git a/client/src/app/admin/requests/index.ts b/client/src/app/admin/requests/index.ts
new file mode 100644 (file)
index 0000000..236a9ee
--- /dev/null
@@ -0,0 +1,4 @@
+export * from './request-stats';
+export * from './shared';
+export * from './requests.component';
+export * from './requests.routes';
diff --git a/client/src/app/admin/requests/request-stats/index.ts b/client/src/app/admin/requests/request-stats/index.ts
new file mode 100644 (file)
index 0000000..be3a66f
--- /dev/null
@@ -0,0 +1 @@
+export * from './request-stats.component';
diff --git a/client/src/app/admin/requests/request-stats/request-stats.component.html b/client/src/app/admin/requests/request-stats/request-stats.component.html
new file mode 100644 (file)
index 0000000..114fd37
--- /dev/null
@@ -0,0 +1,18 @@
+<h3>Requests stats</h3>
+
+<div *ngIf="stats !== null">
+  <div>
+    <span class="label-description">Interval seconds between requests:</span>
+    {{ secondsInterval }}
+  </div>
+
+  <div>
+    <span class="label-description">Remaining time before the scheduled request:</span>
+    {{ remainingSeconds }}
+  </div>
+
+  <div>
+    <span class="label-description">Total requests:</span>
+    {{ stats.requests.length }}
+  </div>
+</div>
diff --git a/client/src/app/admin/requests/request-stats/request-stats.component.scss b/client/src/app/admin/requests/request-stats/request-stats.component.scss
new file mode 100644 (file)
index 0000000..92c28dc
--- /dev/null
@@ -0,0 +1,6 @@
+.label-description {
+  display: inline-block;
+  width: 350px;
+  font-weight: bold;
+  color: black;
+}
diff --git a/client/src/app/admin/requests/request-stats/request-stats.component.ts b/client/src/app/admin/requests/request-stats/request-stats.component.ts
new file mode 100644 (file)
index 0000000..8ff4eb5
--- /dev/null
@@ -0,0 +1,59 @@
+import { Component, OnInit, OnDestroy } from '@angular/core';
+
+import { RequestService, RequestStats } from '../shared';
+
+@Component({
+       selector: 'my-request-stats',
+       templateUrl: './request-stats.component.html',
+  styleUrls: [ './request-stats.component.scss' ]
+})
+export class RequestStatsComponent implements OnInit, OnDestroy {
+  stats: RequestStats = null;
+
+  private interval: NodeJS.Timer = null;
+
+  constructor(private requestService: RequestService) {  }
+
+  ngOnInit() {
+    this.getStats();
+  }
+
+  ngOnDestroy() {
+    if (this.secondsInterval !== null) {
+      clearInterval(this.interval);
+    }
+  }
+
+  get remainingSeconds() {
+    return Math.floor(this.stats.remainingMilliSeconds / 1000);
+  }
+
+  get secondsInterval() {
+    return Math.floor(this.stats.milliSecondsInterval / 1000);
+  }
+
+  getStats() {
+    this.requestService.getStats().subscribe(
+      stats => {
+        console.log(stats);
+        this.stats = stats;
+        this.runInterval();
+      },
+
+      err => alert(err)
+    );
+  }
+
+  private runInterval() {
+    this.interval = setInterval(() => {
+      this.stats.remainingMilliSeconds -= 1000;
+
+      if (this.stats.remainingMilliSeconds <= 0) {
+        setTimeout(() => this.getStats(), this.stats.remainingMilliSeconds + 100);
+        clearInterval(this.interval);
+      }
+    }, 1000);
+  }
+
+
+}
diff --git a/client/src/app/admin/requests/requests.component.ts b/client/src/app/admin/requests/requests.component.ts
new file mode 100644 (file)
index 0000000..471112b
--- /dev/null
@@ -0,0 +1,8 @@
+import { Component } from '@angular/core';
+
+@Component({
+    template: '<router-outlet></router-outlet>'
+})
+
+export class RequestsComponent {
+}
diff --git a/client/src/app/admin/requests/requests.routes.ts b/client/src/app/admin/requests/requests.routes.ts
new file mode 100644 (file)
index 0000000..78221a9
--- /dev/null
@@ -0,0 +1,22 @@
+import { Routes } from '@angular/router';
+
+import { RequestsComponent } from './requests.component';
+import { RequestStatsComponent } from './request-stats';
+
+export const RequestsRoutes: Routes = [
+  {
+      path: 'requests',
+      component: RequestsComponent,
+      children: [
+        {
+          path: '',
+          redirectTo: 'stats',
+          pathMatch: 'full'
+        },
+        {
+          path: 'stats',
+          component: RequestStatsComponent
+        }
+      ]
+    }
+];
diff --git a/client/src/app/admin/requests/shared/index.ts b/client/src/app/admin/requests/shared/index.ts
new file mode 100644 (file)
index 0000000..32ab576
--- /dev/null
@@ -0,0 +1,2 @@
+export * from './request-stats.model';
+export * from './request.service';
diff --git a/client/src/app/admin/requests/shared/request-stats.model.ts b/client/src/app/admin/requests/shared/request-stats.model.ts
new file mode 100644 (file)
index 0000000..7e4b26b
--- /dev/null
@@ -0,0 +1,8 @@
+export interface RequestStats {
+  milliSecondsInterval: number;
+       remainingMilliSeconds: number;
+  requests: {
+    request: any,
+    to: any
+  }[];
+}
diff --git a/client/src/app/admin/requests/shared/request.service.ts b/client/src/app/admin/requests/shared/request.service.ts
new file mode 100644 (file)
index 0000000..59d1380
--- /dev/null
@@ -0,0 +1,21 @@
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+
+import { RequestStats } from './request-stats.model';
+import { AuthHttp, RestExtractor } from '../../../shared';
+
+@Injectable()
+export class RequestService {
+  private static BASE_REQUEST_URL: string = '/api/v1/requests/';
+
+  constructor (
+    private authHttp: AuthHttp,
+    private restExtractor: RestExtractor
+  ) {}
+
+  getStats(): Observable<RequestStats> {
+    return this.authHttp.get(RequestService.BASE_REQUEST_URL + 'stats')
+                        .map(this.restExtractor.extractDataGet)
+                        .catch((res) => this.restExtractor.handleError(res));
+  }
+}
index 3b7750a763757755c98b7b7315c7f9ffe582b2d8..f9a9ae7603174a7f0b70777a65a277c6993cb94d 100644 (file)
@@ -26,6 +26,9 @@ import {
   FriendListComponent,
   FriendService,
   MenuAdminComponent,
+  RequestsComponent,
+  RequestStatsComponent,
+  RequestService,
   UsersComponent,
   UserAddComponent,
   UserListComponent,
@@ -66,6 +69,7 @@ const APP_PROVIDERS = [
   VideoService,
   SearchService,
   FriendService,
+  RequestService,
   UserService,
   AccountService,
   WebTorrentService
@@ -88,6 +92,8 @@ const APP_PROVIDERS = [
     LoginComponent,
     MenuAdminComponent,
     MenuComponent,
+    RequestsComponent,
+    RequestStatsComponent,
     SearchComponent,
     UserAddComponent,
     UserListComponent,
index 6018bb40c40e756f4ed6b37616a7c45c0654829e..17aca8af0e0b641446e7846b5b1f31f67ace021a 100644 (file)
@@ -32,7 +32,8 @@ function getStatsRequests (req, res, next) {
 
     return res.json({
       requests: requests,
-      remainingMilliSeconds: remainingMilliSeconds
+      remainingMilliSeconds: remainingMilliSeconds,
+      milliSecondsInterval: constants.REQUESTS_INTERVAL
     })
   })
 }