From b99290b1d5d736083513fb8f66e91f61bfe07e0b Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 23 Jan 2017 22:32:43 +0100 Subject: Client: lazy load admin area --- client/config/webpack.common.js | 25 +++++ client/package.json | 1 + client/src/app/+admin/admin-routing.module.ts | 32 ++++++ client/src/app/+admin/admin.component.ts | 8 ++ client/src/app/+admin/admin.module.ts | 45 +++++++++ .../friends/friend-add/friend-add.component.html | 30 ++++++ .../friends/friend-add/friend-add.component.scss | 7 ++ .../friends/friend-add/friend-add.component.ts | 107 +++++++++++++++++++++ client/src/app/+admin/friends/friend-add/index.ts | 1 + .../friends/friend-list/friend-list.component.html | 29 ++++++ .../friends/friend-list/friend-list.component.scss | 3 + .../friends/friend-list/friend-list.component.ts | 38 ++++++++ client/src/app/+admin/friends/friend-list/index.ts | 1 + client/src/app/+admin/friends/friends.component.ts | 8 ++ client/src/app/+admin/friends/friends.routes.ts | 37 +++++++ client/src/app/+admin/friends/index.ts | 5 + .../src/app/+admin/friends/shared/friend.model.ts | 6 ++ .../app/+admin/friends/shared/friend.service.ts | 47 +++++++++ client/src/app/+admin/friends/shared/index.ts | 2 + client/src/app/+admin/index.ts | 6 ++ client/src/app/+admin/requests/index.ts | 4 + .../src/app/+admin/requests/request-stats/index.ts | 1 + .../request-stats/request-stats.component.html | 33 +++++++ .../request-stats/request-stats.component.scss | 19 ++++ .../request-stats/request-stats.component.ts | 48 +++++++++ .../src/app/+admin/requests/requests.component.ts | 8 ++ client/src/app/+admin/requests/requests.routes.ts | 27 ++++++ client/src/app/+admin/requests/shared/index.ts | 2 + .../+admin/requests/shared/request-stats.model.ts | 35 +++++++ .../app/+admin/requests/shared/request.service.ts | 24 +++++ client/src/app/+admin/users/index.ts | 5 + client/src/app/+admin/users/shared/index.ts | 1 + client/src/app/+admin/users/shared/user.service.ts | 49 ++++++++++ client/src/app/+admin/users/user-add/index.ts | 1 + .../+admin/users/user-add/user-add.component.html | 29 ++++++ .../+admin/users/user-add/user-add.component.ts | 57 +++++++++++ client/src/app/+admin/users/user-list/index.ts | 1 + .../users/user-list/user-list.component.html | 28 ++++++ .../users/user-list/user-list.component.scss | 7 ++ .../+admin/users/user-list/user-list.component.ts | 42 ++++++++ client/src/app/+admin/users/users.component.ts | 8 ++ client/src/app/+admin/users/users.routes.ts | 37 +++++++ client/src/app/+admin/video-abuses/index.ts | 3 + .../+admin/video-abuses/video-abuse-list/index.ts | 1 + .../video-abuse-list.component.html | 27 ++++++ .../video-abuse-list.component.scss | 7 ++ .../video-abuse-list/video-abuse-list.component.ts | 31 ++++++ .../+admin/video-abuses/video-abuses.component.ts | 8 ++ .../app/+admin/video-abuses/video-abuses.routes.ts | 28 ++++++ client/src/app/admin/admin-routing.module.ts | 32 ------ client/src/app/admin/admin.component.ts | 8 -- client/src/app/admin/admin.module.ts | 49 ---------- .../friends/friend-add/friend-add.component.html | 30 ------ .../friends/friend-add/friend-add.component.scss | 7 -- .../friends/friend-add/friend-add.component.ts | 107 --------------------- client/src/app/admin/friends/friend-add/index.ts | 1 - .../friends/friend-list/friend-list.component.html | 29 ------ .../friends/friend-list/friend-list.component.scss | 3 - .../friends/friend-list/friend-list.component.ts | 38 -------- client/src/app/admin/friends/friend-list/index.ts | 1 - client/src/app/admin/friends/friends.component.ts | 8 -- client/src/app/admin/friends/friends.routes.ts | 37 ------- client/src/app/admin/friends/index.ts | 5 - .../src/app/admin/friends/shared/friend.model.ts | 6 -- .../src/app/admin/friends/shared/friend.service.ts | 47 --------- client/src/app/admin/friends/shared/index.ts | 2 - client/src/app/admin/index.ts | 7 -- client/src/app/admin/menu-admin.component.html | 31 ------ client/src/app/admin/menu-admin.component.ts | 7 -- client/src/app/admin/requests/index.ts | 4 - .../src/app/admin/requests/request-stats/index.ts | 1 - .../request-stats/request-stats.component.html | 33 ------- .../request-stats/request-stats.component.scss | 19 ---- .../request-stats/request-stats.component.ts | 48 --------- .../src/app/admin/requests/requests.component.ts | 8 -- client/src/app/admin/requests/requests.routes.ts | 27 ------ client/src/app/admin/requests/shared/index.ts | 2 - .../admin/requests/shared/request-stats.model.ts | 35 ------- .../app/admin/requests/shared/request.service.ts | 24 ----- client/src/app/admin/users/index.ts | 5 - client/src/app/admin/users/shared/index.ts | 1 - client/src/app/admin/users/shared/user.service.ts | 49 ---------- client/src/app/admin/users/user-add/index.ts | 1 - .../admin/users/user-add/user-add.component.html | 29 ------ .../app/admin/users/user-add/user-add.component.ts | 57 ----------- client/src/app/admin/users/user-list/index.ts | 1 - .../admin/users/user-list/user-list.component.html | 28 ------ .../admin/users/user-list/user-list.component.scss | 7 -- .../admin/users/user-list/user-list.component.ts | 42 -------- client/src/app/admin/users/users.component.ts | 8 -- client/src/app/admin/users/users.routes.ts | 37 ------- client/src/app/admin/video-abuses/index.ts | 3 - .../admin/video-abuses/video-abuse-list/index.ts | 1 - .../video-abuse-list.component.html | 27 ------ .../video-abuse-list.component.scss | 7 -- .../video-abuse-list/video-abuse-list.component.ts | 31 ------ .../admin/video-abuses/video-abuses.component.ts | 8 -- .../app/admin/video-abuses/video-abuses.routes.ts | 28 ------ client/src/app/app-routing.module.ts | 4 + client/src/app/app.module.ts | 2 - client/src/app/core/core.module.ts | 12 ++- client/src/app/core/menu/index.ts | 1 + client/src/app/core/menu/menu-admin.component.html | 31 ++++++ client/src/app/core/menu/menu-admin.component.ts | 7 ++ 104 files changed, 1061 insertions(+), 1031 deletions(-) create mode 100644 client/src/app/+admin/admin-routing.module.ts create mode 100644 client/src/app/+admin/admin.component.ts create mode 100644 client/src/app/+admin/admin.module.ts create mode 100644 client/src/app/+admin/friends/friend-add/friend-add.component.html create mode 100644 client/src/app/+admin/friends/friend-add/friend-add.component.scss create mode 100644 client/src/app/+admin/friends/friend-add/friend-add.component.ts create mode 100644 client/src/app/+admin/friends/friend-add/index.ts create mode 100644 client/src/app/+admin/friends/friend-list/friend-list.component.html create mode 100644 client/src/app/+admin/friends/friend-list/friend-list.component.scss create mode 100644 client/src/app/+admin/friends/friend-list/friend-list.component.ts create mode 100644 client/src/app/+admin/friends/friend-list/index.ts create mode 100644 client/src/app/+admin/friends/friends.component.ts create mode 100644 client/src/app/+admin/friends/friends.routes.ts create mode 100644 client/src/app/+admin/friends/index.ts create mode 100644 client/src/app/+admin/friends/shared/friend.model.ts create mode 100644 client/src/app/+admin/friends/shared/friend.service.ts create mode 100644 client/src/app/+admin/friends/shared/index.ts create mode 100644 client/src/app/+admin/index.ts create mode 100644 client/src/app/+admin/requests/index.ts create mode 100644 client/src/app/+admin/requests/request-stats/index.ts create mode 100644 client/src/app/+admin/requests/request-stats/request-stats.component.html create mode 100644 client/src/app/+admin/requests/request-stats/request-stats.component.scss create mode 100644 client/src/app/+admin/requests/request-stats/request-stats.component.ts create mode 100644 client/src/app/+admin/requests/requests.component.ts create mode 100644 client/src/app/+admin/requests/requests.routes.ts create mode 100644 client/src/app/+admin/requests/shared/index.ts create mode 100644 client/src/app/+admin/requests/shared/request-stats.model.ts create mode 100644 client/src/app/+admin/requests/shared/request.service.ts create mode 100644 client/src/app/+admin/users/index.ts create mode 100644 client/src/app/+admin/users/shared/index.ts create mode 100644 client/src/app/+admin/users/shared/user.service.ts create mode 100644 client/src/app/+admin/users/user-add/index.ts create mode 100644 client/src/app/+admin/users/user-add/user-add.component.html create mode 100644 client/src/app/+admin/users/user-add/user-add.component.ts create mode 100644 client/src/app/+admin/users/user-list/index.ts create mode 100644 client/src/app/+admin/users/user-list/user-list.component.html create mode 100644 client/src/app/+admin/users/user-list/user-list.component.scss create mode 100644 client/src/app/+admin/users/user-list/user-list.component.ts create mode 100644 client/src/app/+admin/users/users.component.ts create mode 100644 client/src/app/+admin/users/users.routes.ts create mode 100644 client/src/app/+admin/video-abuses/index.ts create mode 100644 client/src/app/+admin/video-abuses/video-abuse-list/index.ts create mode 100644 client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.html create mode 100644 client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.scss create mode 100644 client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts create mode 100644 client/src/app/+admin/video-abuses/video-abuses.component.ts create mode 100644 client/src/app/+admin/video-abuses/video-abuses.routes.ts delete mode 100644 client/src/app/admin/admin-routing.module.ts delete mode 100644 client/src/app/admin/admin.component.ts delete mode 100644 client/src/app/admin/admin.module.ts delete mode 100644 client/src/app/admin/friends/friend-add/friend-add.component.html delete mode 100644 client/src/app/admin/friends/friend-add/friend-add.component.scss delete mode 100644 client/src/app/admin/friends/friend-add/friend-add.component.ts delete mode 100644 client/src/app/admin/friends/friend-add/index.ts delete mode 100644 client/src/app/admin/friends/friend-list/friend-list.component.html delete mode 100644 client/src/app/admin/friends/friend-list/friend-list.component.scss delete mode 100644 client/src/app/admin/friends/friend-list/friend-list.component.ts delete mode 100644 client/src/app/admin/friends/friend-list/index.ts delete mode 100644 client/src/app/admin/friends/friends.component.ts delete mode 100644 client/src/app/admin/friends/friends.routes.ts delete mode 100644 client/src/app/admin/friends/index.ts delete mode 100644 client/src/app/admin/friends/shared/friend.model.ts delete mode 100644 client/src/app/admin/friends/shared/friend.service.ts delete mode 100644 client/src/app/admin/friends/shared/index.ts delete mode 100644 client/src/app/admin/index.ts delete mode 100644 client/src/app/admin/menu-admin.component.html delete mode 100644 client/src/app/admin/menu-admin.component.ts delete mode 100644 client/src/app/admin/requests/index.ts delete mode 100644 client/src/app/admin/requests/request-stats/index.ts delete mode 100644 client/src/app/admin/requests/request-stats/request-stats.component.html delete mode 100644 client/src/app/admin/requests/request-stats/request-stats.component.scss delete mode 100644 client/src/app/admin/requests/request-stats/request-stats.component.ts delete mode 100644 client/src/app/admin/requests/requests.component.ts delete mode 100644 client/src/app/admin/requests/requests.routes.ts delete mode 100644 client/src/app/admin/requests/shared/index.ts delete mode 100644 client/src/app/admin/requests/shared/request-stats.model.ts delete mode 100644 client/src/app/admin/requests/shared/request.service.ts delete mode 100644 client/src/app/admin/users/index.ts delete mode 100644 client/src/app/admin/users/shared/index.ts delete mode 100644 client/src/app/admin/users/shared/user.service.ts delete mode 100644 client/src/app/admin/users/user-add/index.ts delete mode 100644 client/src/app/admin/users/user-add/user-add.component.html delete mode 100644 client/src/app/admin/users/user-add/user-add.component.ts delete mode 100644 client/src/app/admin/users/user-list/index.ts delete mode 100644 client/src/app/admin/users/user-list/user-list.component.html delete mode 100644 client/src/app/admin/users/user-list/user-list.component.scss delete mode 100644 client/src/app/admin/users/user-list/user-list.component.ts delete mode 100644 client/src/app/admin/users/users.component.ts delete mode 100644 client/src/app/admin/users/users.routes.ts delete mode 100644 client/src/app/admin/video-abuses/index.ts delete mode 100644 client/src/app/admin/video-abuses/video-abuse-list/index.ts delete mode 100644 client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.html delete mode 100644 client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.scss delete mode 100644 client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.ts delete mode 100644 client/src/app/admin/video-abuses/video-abuses.component.ts delete mode 100644 client/src/app/admin/video-abuses/video-abuses.routes.ts create mode 100644 client/src/app/core/menu/menu-admin.component.html create mode 100644 client/src/app/core/menu/menu-admin.component.ts diff --git a/client/config/webpack.common.js b/client/config/webpack.common.js index 223f55c2e..08b8a4b09 100644 --- a/client/config/webpack.common.js +++ b/client/config/webpack.common.js @@ -5,6 +5,7 @@ const helpers = require('./helpers') */ const AssetsPlugin = require('assets-webpack-plugin') +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin const NormalModuleReplacementPlugin = require('webpack/lib/NormalModuleReplacementPlugin') const ContextReplacementPlugin = require('webpack/lib/ContextReplacementPlugin') const CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin') @@ -313,6 +314,30 @@ module.exports = function (options) { disabled: !AOT, tsConfig: helpers.root('tsconfig.webpack.json'), resourceOverride: helpers.root('config/resource-override.js') + }), + + new BundleAnalyzerPlugin({ + // Can be `server`, `static` or `disabled`. + // In `server` mode analyzer will start HTTP server to show bundle report. + // In `static` mode single HTML file with bundle report will be generated. + // In `disabled` mode you can use this plugin to just generate Webpack Stats JSON file by setting `generateStatsFile` to `true`. + analyzerMode: 'static', + // Path to bundle report file that will be generated in `static` mode. + // Relative to bundles output directory. + reportFilename: 'report.html', + // Automatically open report in default browser + openAnalyzer: false, + // If `true`, Webpack Stats JSON file will be generated in bundles output directory + generateStatsFile: true, + // Name of Webpack Stats JSON file that will be generated if `generateStatsFile` is `true`. + // Relative to bundles output directory. + statsFilename: 'stats.json', + // Options for `stats.toJson()` method. + // For example you can exclude sources of your modules from stats file with `source: false` option. + // See more options here: https://github.com/webpack/webpack/blob/webpack-1/lib/Stats.js#L21 + statsOptions: null, + // Log level. Can be 'info', 'warn', 'error' or 'silent'. + logLevel: 'info' }) ], diff --git a/client/package.json b/client/package.json index ea458f1d4..f4835590e 100644 --- a/client/package.json +++ b/client/package.json @@ -88,6 +88,7 @@ "add-asset-html-webpack-plugin": "^1.0.2", "codelyzer": "2.0.0-beta.4", "standard": "^8.0.0", + "webpack-bundle-analyzer": "^2.2.1", "webpack-dll-bundles-plugin": "^1.0.0-beta.5" } } diff --git a/client/src/app/+admin/admin-routing.module.ts b/client/src/app/+admin/admin-routing.module.ts new file mode 100644 index 000000000..d3adf3f3b --- /dev/null +++ b/client/src/app/+admin/admin-routing.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { AdminComponent } from './admin.component'; +import { FriendsRoutes } from './friends'; +import { RequestsRoutes } from './requests'; +import { UsersRoutes } from './users'; +import { VideoAbusesRoutes } from './video-abuses'; + +const adminRoutes: Routes = [ + { + path: '', + component: AdminComponent, + children: [ + { + path: '', + redirectTo: 'users', + pathMatch: 'full' + }, + ...FriendsRoutes, + ...RequestsRoutes, + ...UsersRoutes, + ...VideoAbusesRoutes + ] + } +]; + +@NgModule({ + imports: [ RouterModule.forChild(adminRoutes) ], + exports: [ RouterModule ] +}) +export class AdminRoutingModule {} diff --git a/client/src/app/+admin/admin.component.ts b/client/src/app/+admin/admin.component.ts new file mode 100644 index 000000000..64a7400e7 --- /dev/null +++ b/client/src/app/+admin/admin.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + template: '' +}) + +export class AdminComponent { +} diff --git a/client/src/app/+admin/admin.module.ts b/client/src/app/+admin/admin.module.ts new file mode 100644 index 000000000..db1ce2d7f --- /dev/null +++ b/client/src/app/+admin/admin.module.ts @@ -0,0 +1,45 @@ +import { NgModule } from '@angular/core'; + +import { AdminComponent } from './admin.component'; +import { AdminRoutingModule } from './admin-routing.module'; +import { FriendsComponent, FriendAddComponent, FriendListComponent, FriendService } from './friends'; +import { RequestsComponent, RequestStatsComponent, RequestService } from './requests'; +import { UsersComponent, UserAddComponent, UserListComponent, UserService } from './users'; +import { VideoAbusesComponent, VideoAbuseListComponent } from './video-abuses'; +import { SharedModule } from '../shared'; + +@NgModule({ + imports: [ + AdminRoutingModule, + SharedModule + ], + + declarations: [ + AdminComponent, + + FriendsComponent, + FriendAddComponent, + FriendListComponent, + + RequestsComponent, + RequestStatsComponent, + + UsersComponent, + UserAddComponent, + UserListComponent, + + VideoAbusesComponent, + VideoAbuseListComponent + ], + + exports: [ + AdminComponent + ], + + providers: [ + FriendService, + RequestService, + UserService + ] +}) +export class AdminModule { } diff --git a/client/src/app/+admin/friends/friend-add/friend-add.component.html b/client/src/app/+admin/friends/friend-add/friend-add.component.html new file mode 100644 index 000000000..eebe033f9 --- /dev/null +++ b/client/src/app/+admin/friends/friend-add/friend-add.component.html @@ -0,0 +1,30 @@ +

Make friends

+ +
{{ error }}
+ +
+
+ + +
+ + + + + +
+ +
+ It should be a valid host. +
+
+ +
+ It seems that you are not on a HTTPS pod. Your webserver need to have TLS activated in order to make friends. +
+ + +
diff --git a/client/src/app/+admin/friends/friend-add/friend-add.component.scss b/client/src/app/+admin/friends/friend-add/friend-add.component.scss new file mode 100644 index 000000000..5fde51636 --- /dev/null +++ b/client/src/app/+admin/friends/friend-add/friend-add.component.scss @@ -0,0 +1,7 @@ +table { + margin-bottom: 40px; +} + +.input-group-btn button { + width: 35px; +} diff --git a/client/src/app/+admin/friends/friend-add/friend-add.component.ts b/client/src/app/+admin/friends/friend-add/friend-add.component.ts new file mode 100644 index 000000000..014252011 --- /dev/null +++ b/client/src/app/+admin/friends/friend-add/friend-add.component.ts @@ -0,0 +1,107 @@ +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup } from '@angular/forms'; +import { Router } from '@angular/router'; + +import { validateHost } from '../../../shared'; +import { FriendService } from '../shared'; + +@Component({ + selector: 'my-friend-add', + templateUrl: './friend-add.component.html', + styleUrls: [ './friend-add.component.scss' ] +}) +export class FriendAddComponent implements OnInit { + form: FormGroup; + hosts = [ ]; + error: string = null; + + constructor(private router: Router, private friendService: FriendService) {} + + ngOnInit() { + this.form = new FormGroup({}); + this.addField(); + } + + addField() { + this.form.addControl(`host-${this.hosts.length}`, new FormControl('', [ validateHost ])); + this.hosts.push(''); + } + + canMakeFriends() { + return window.location.protocol === 'https:'; + } + + customTrackBy(index: number, obj: any): any { + return index; + } + + displayAddField(index: number) { + return index === (this.hosts.length - 1); + } + + displayRemoveField(index: number) { + return (index !== 0 || this.hosts.length > 1) && index !== (this.hosts.length - 1); + } + + isFormValid() { + // Do not check the last input + for (let i = 0; i < this.hosts.length - 1; i++) { + if (!this.form.controls[`host-${i}`].valid) return false; + } + + const lastIndex = this.hosts.length - 1; + // If the last input (which is not the first) is empty, it's ok + if (this.hosts[lastIndex] === '' && lastIndex !== 0) { + return true; + } else { + return this.form.controls[`host-${lastIndex}`].valid; + } + } + + removeField(index: number) { + // Remove the last control + this.form.removeControl(`host-${this.hosts.length - 1}`); + this.hosts.splice(index, 1); + } + + makeFriends() { + this.error = ''; + + const notEmptyHosts = this.getNotEmptyHosts(); + if (notEmptyHosts.length === 0) { + this.error = 'You need to specify at least 1 host.'; + return; + } + + if (!this.isHostsUnique(notEmptyHosts)) { + this.error = 'Hosts need to be unique.'; + return; + } + + const confirmMessage = 'Are you sure to make friends with:\n - ' + notEmptyHosts.join('\n - '); + if (!confirm(confirmMessage)) return; + + this.friendService.makeFriends(notEmptyHosts).subscribe( + status => { + alert('Make friends request sent!'); + this.router.navigate([ '/admin/friends/list' ]); + }, + error => alert(error.text) + ); + } + + private getNotEmptyHosts() { + const notEmptyHosts = []; + + Object.keys(this.form.value).forEach((hostKey) => { + const host = this.form.value[hostKey]; + if (host !== '') notEmptyHosts.push(host); + }); + + return notEmptyHosts; + } + + private isHostsUnique(hosts: string[]) { + return hosts.every(host => hosts.indexOf(host) === hosts.lastIndexOf(host)); + } +} diff --git a/client/src/app/+admin/friends/friend-add/index.ts b/client/src/app/+admin/friends/friend-add/index.ts new file mode 100644 index 000000000..a101b3be5 --- /dev/null +++ b/client/src/app/+admin/friends/friend-add/index.ts @@ -0,0 +1 @@ +export * from './friend-add.component'; diff --git a/client/src/app/+admin/friends/friend-list/friend-list.component.html b/client/src/app/+admin/friends/friend-list/friend-list.component.html new file mode 100644 index 000000000..06258f8c8 --- /dev/null +++ b/client/src/app/+admin/friends/friend-list/friend-list.component.html @@ -0,0 +1,29 @@ +

Friends list

+ + + + + + + + + + + + + + + + + + + +
IDHostScoreCreated Date
{{ friend.id }}{{ friend.host }}{{ friend.score }}{{ friend.createdAt | date: 'medium' }}
+ + + Quit friends + + + + Make friends + diff --git a/client/src/app/+admin/friends/friend-list/friend-list.component.scss b/client/src/app/+admin/friends/friend-list/friend-list.component.scss new file mode 100644 index 000000000..cb597e12b --- /dev/null +++ b/client/src/app/+admin/friends/friend-list/friend-list.component.scss @@ -0,0 +1,3 @@ +table { + margin-bottom: 40px; +} diff --git a/client/src/app/+admin/friends/friend-list/friend-list.component.ts b/client/src/app/+admin/friends/friend-list/friend-list.component.ts new file mode 100644 index 000000000..bec10162c --- /dev/null +++ b/client/src/app/+admin/friends/friend-list/friend-list.component.ts @@ -0,0 +1,38 @@ +import { Component, OnInit } from '@angular/core'; + +import { Friend, FriendService } from '../shared'; + +@Component({ + selector: 'my-friend-list', + templateUrl: './friend-list.component.html', + styleUrls: [ './friend-list.component.scss' ] +}) +export class FriendListComponent implements OnInit { + friends: Friend[]; + + constructor(private friendService: FriendService) { } + + ngOnInit() { + this.getFriends(); + } + + quitFriends() { + if (!confirm('Are you sure?')) return; + + this.friendService.quitFriends().subscribe( + status => { + alert('Quit friends!'); + this.getFriends(); + }, + error => alert(error.text) + ); + } + + private getFriends() { + this.friendService.getFriends().subscribe( + res => this.friends = res.friends, + + err => alert(err.text) + ); + } +} diff --git a/client/src/app/+admin/friends/friend-list/index.ts b/client/src/app/+admin/friends/friend-list/index.ts new file mode 100644 index 000000000..354c978a4 --- /dev/null +++ b/client/src/app/+admin/friends/friend-list/index.ts @@ -0,0 +1 @@ +export * from './friend-list.component'; diff --git a/client/src/app/+admin/friends/friends.component.ts b/client/src/app/+admin/friends/friends.component.ts new file mode 100644 index 000000000..bc3f54158 --- /dev/null +++ b/client/src/app/+admin/friends/friends.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + template: '' +}) + +export class FriendsComponent { +} diff --git a/client/src/app/+admin/friends/friends.routes.ts b/client/src/app/+admin/friends/friends.routes.ts new file mode 100644 index 000000000..a9a06539b --- /dev/null +++ b/client/src/app/+admin/friends/friends.routes.ts @@ -0,0 +1,37 @@ +import { Routes } from '@angular/router'; + +import { FriendsComponent } from './friends.component'; +import { FriendAddComponent } from './friend-add'; +import { FriendListComponent } from './friend-list'; + +export const FriendsRoutes: Routes = [ + { + path: 'friends', + component: FriendsComponent, + children: [ + { + path: '', + redirectTo: 'list', + pathMatch: 'full' + }, + { + path: 'list', + component: FriendListComponent, + data: { + meta: { + titleSuffix: ' - Friends list' + } + } + }, + { + path: 'add', + component: FriendAddComponent, + data: { + meta: { + titleSuffix: ' - Add friends' + } + } + } + ] + } +]; diff --git a/client/src/app/+admin/friends/index.ts b/client/src/app/+admin/friends/index.ts new file mode 100644 index 000000000..dd4df2538 --- /dev/null +++ b/client/src/app/+admin/friends/index.ts @@ -0,0 +1,5 @@ +export * from './friend-add'; +export * from './friend-list'; +export * from './shared'; +export * from './friends.component'; +export * from './friends.routes'; diff --git a/client/src/app/+admin/friends/shared/friend.model.ts b/client/src/app/+admin/friends/shared/friend.model.ts new file mode 100644 index 000000000..462cc82ed --- /dev/null +++ b/client/src/app/+admin/friends/shared/friend.model.ts @@ -0,0 +1,6 @@ +export interface Friend { + id: string; + host: string; + score: number; + createdAt: Date; +} diff --git a/client/src/app/+admin/friends/shared/friend.service.ts b/client/src/app/+admin/friends/shared/friend.service.ts new file mode 100644 index 000000000..e97459385 --- /dev/null +++ b/client/src/app/+admin/friends/shared/friend.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/map'; + +import { Friend } from './friend.model'; +import { AuthHttp, RestExtractor, ResultList } from '../../../shared'; + +@Injectable() +export class FriendService { + private static BASE_FRIEND_URL: string = '/api/v1/pods/'; + + constructor ( + private authHttp: AuthHttp, + private restExtractor: RestExtractor + ) {} + + getFriends() { + return this.authHttp.get(FriendService.BASE_FRIEND_URL) + .map(this.restExtractor.extractDataList) + .map(this.extractFriends) + .catch((res) => this.restExtractor.handleError(res)); + } + + makeFriends(notEmptyHosts) { + const body = { + hosts: notEmptyHosts + }; + + return this.authHttp.post(FriendService.BASE_FRIEND_URL + 'makefriends', body) + .map(this.restExtractor.extractDataBool) + .catch((res) => this.restExtractor.handleError(res)); + } + + quitFriends() { + return this.authHttp.get(FriendService.BASE_FRIEND_URL + 'quitfriends') + .map(res => res.status) + .catch((res) => this.restExtractor.handleError(res)); + } + + private extractFriends(result: ResultList) { + const friends: Friend[] = result.data; + const totalFriends = result.total; + + return { friends, totalFriends }; + } +} diff --git a/client/src/app/+admin/friends/shared/index.ts b/client/src/app/+admin/friends/shared/index.ts new file mode 100644 index 000000000..0d671637d --- /dev/null +++ b/client/src/app/+admin/friends/shared/index.ts @@ -0,0 +1,2 @@ +export * from './friend.model'; +export * from './friend.service'; diff --git a/client/src/app/+admin/index.ts b/client/src/app/+admin/index.ts new file mode 100644 index 000000000..2f47a3cc3 --- /dev/null +++ b/client/src/app/+admin/index.ts @@ -0,0 +1,6 @@ +export * from './friends'; +export * from './requests'; +export * from './users'; +export * from './admin-routing.module'; +export * from './admin.module'; +export * from './admin.component'; diff --git a/client/src/app/+admin/requests/index.ts b/client/src/app/+admin/requests/index.ts new file mode 100644 index 000000000..236a9ee8f --- /dev/null +++ b/client/src/app/+admin/requests/index.ts @@ -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 index 000000000..be3a66f77 --- /dev/null +++ b/client/src/app/+admin/requests/request-stats/index.ts @@ -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 index 000000000..9dbed1739 --- /dev/null +++ b/client/src/app/+admin/requests/request-stats/request-stats.component.html @@ -0,0 +1,33 @@ +

Requests stats

+ +
+
+
+ Remaining requests: + {{ stats.totalRequests }} +
+ +
+ Interval seconds between requests: + {{ stats.secondsInterval }} +
+ +
+ Remaining time before the scheduled request: + {{ stats.remainingSeconds }} +
+
+ +
+
+ Maximum number of different pods for a scheduled request: + {{ stats.requestsLimitPods }} +
+ +
+ Maximum number of requests per pod for a scheduled request: + {{ stats.requestsLimitPerPod }} +
+
+ +
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 index 000000000..9c68fba99 --- /dev/null +++ b/client/src/app/+admin/requests/request-stats/request-stats.component.scss @@ -0,0 +1,19 @@ +.label-description { + display: inline-block; + font-weight: bold; + color: black; +} + +.requests-general { + .label-description { + width: 320px; + } +} + +.requests-limit { + margin-top: 20px; + + .label-description { + width: 430px; + } +} 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 index 000000000..23b836779 --- /dev/null +++ b/client/src/app/+admin/requests/request-stats/request-stats.component.ts @@ -0,0 +1,48 @@ +import { setInterval } from 'timers' +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(); + this.runInterval(); + } + + ngOnDestroy() { + if (this.stats !== null && this.stats.secondsInterval !== null) { + clearInterval(this.interval); + } + } + + getStats() { + this.requestService.getStats().subscribe( + stats => this.stats = stats, + + err => alert(err.text) + ); + } + + private runInterval() { + this.interval = setInterval(() => { + this.stats.remainingMilliSeconds -= 1000; + + if (this.stats.remainingMilliSeconds <= 0) { + setTimeout(() => this.getStats(), this.stats.remainingMilliSeconds + 100); + } + }, 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 index 000000000..471112b45 --- /dev/null +++ b/client/src/app/+admin/requests/requests.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + template: '' +}) + +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 index 000000000..70fbf41c3 --- /dev/null +++ b/client/src/app/+admin/requests/requests.routes.ts @@ -0,0 +1,27 @@ +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, + data: { + meta: { + titleSuffix: ' - Request stats' + } + } + } + ] + } +]; diff --git a/client/src/app/+admin/requests/shared/index.ts b/client/src/app/+admin/requests/shared/index.ts new file mode 100644 index 000000000..32ab5767b --- /dev/null +++ b/client/src/app/+admin/requests/shared/index.ts @@ -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 index 000000000..f658c4682 --- /dev/null +++ b/client/src/app/+admin/requests/shared/request-stats.model.ts @@ -0,0 +1,35 @@ +export interface Request { + request: any; + to: any; +} + +export class RequestStats { + requestsLimitPods: number; + requestsLimitPerPod: number; + milliSecondsInterval: number; + remainingMilliSeconds: number; + totalRequests: number; + + constructor(hash: { + requestsLimitPods: number, + requestsLimitPerPod: number, + milliSecondsInterval: number, + remainingMilliSeconds: number, + totalRequests: number; + }) { + this.requestsLimitPods = hash.requestsLimitPods; + this.requestsLimitPerPod = hash.requestsLimitPerPod; + this.milliSecondsInterval = hash.milliSecondsInterval; + this.remainingMilliSeconds = hash.remainingMilliSeconds; + this.totalRequests = hash.totalRequests; + } + + get remainingSeconds() { + return Math.floor(this.remainingMilliSeconds / 1000); + } + + get secondsInterval() { + return Math.floor(this.milliSecondsInterval / 1000); + } + +} 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 index 000000000..55b28bcfc --- /dev/null +++ b/client/src/app/+admin/requests/shared/request.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/map'; + +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 { + return this.authHttp.get(RequestService.BASE_REQUEST_URL + 'stats') + .map(this.restExtractor.extractDataGet) + .map((data) => new RequestStats(data)) + .catch((res) => this.restExtractor.handleError(res)); + } +} diff --git a/client/src/app/+admin/users/index.ts b/client/src/app/+admin/users/index.ts new file mode 100644 index 000000000..e98a81f62 --- /dev/null +++ b/client/src/app/+admin/users/index.ts @@ -0,0 +1,5 @@ +export * from './shared'; +export * from './user-add'; +export * from './user-list'; +export * from './users.component'; +export * from './users.routes'; diff --git a/client/src/app/+admin/users/shared/index.ts b/client/src/app/+admin/users/shared/index.ts new file mode 100644 index 000000000..e17ee5c7a --- /dev/null +++ b/client/src/app/+admin/users/shared/index.ts @@ -0,0 +1 @@ +export * from './user.service'; diff --git a/client/src/app/+admin/users/shared/user.service.ts b/client/src/app/+admin/users/shared/user.service.ts new file mode 100644 index 000000000..d9005b213 --- /dev/null +++ b/client/src/app/+admin/users/shared/user.service.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@angular/core'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/map'; + +import { AuthHttp, RestExtractor, ResultList, User } from '../../../shared'; + +@Injectable() +export class UserService { + // TODO: merge this constant with account + private static BASE_USERS_URL = '/api/v1/users/'; + + constructor( + private authHttp: AuthHttp, + private restExtractor: RestExtractor + ) {} + + addUser(username: string, password: string) { + const body = { + username, + password + }; + + return this.authHttp.post(UserService.BASE_USERS_URL, body) + .map(this.restExtractor.extractDataBool) + .catch(this.restExtractor.handleError); + } + + getUsers() { + return this.authHttp.get(UserService.BASE_USERS_URL) + .map(this.restExtractor.extractDataList) + .map(this.extractUsers) + .catch((res) => this.restExtractor.handleError(res)); + } + + removeUser(user: User) { + return this.authHttp.delete(UserService.BASE_USERS_URL + user.id); + } + + private extractUsers(result: ResultList) { + const usersJson = result.data; + const totalUsers = result.total; + const users = []; + for (const userJson of usersJson) { + users.push(new User(userJson)); + } + + return { users, totalUsers }; + } +} diff --git a/client/src/app/+admin/users/user-add/index.ts b/client/src/app/+admin/users/user-add/index.ts new file mode 100644 index 000000000..66d5ca04f --- /dev/null +++ b/client/src/app/+admin/users/user-add/index.ts @@ -0,0 +1 @@ +export * from './user-add.component'; diff --git a/client/src/app/+admin/users/user-add/user-add.component.html b/client/src/app/+admin/users/user-add/user-add.component.html new file mode 100644 index 000000000..9b76c7c1b --- /dev/null +++ b/client/src/app/+admin/users/user-add/user-add.component.html @@ -0,0 +1,29 @@ +

Add user

+ +
{{ error }}
+ +
+
+ + +
+ {{ formErrors.username }} +
+
+ +
+ + +
+ {{ formErrors.password }} +
+
+ + +
diff --git a/client/src/app/+admin/users/user-add/user-add.component.ts b/client/src/app/+admin/users/user-add/user-add.component.ts new file mode 100644 index 000000000..ab96fb01d --- /dev/null +++ b/client/src/app/+admin/users/user-add/user-add.component.ts @@ -0,0 +1,57 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { Router } from '@angular/router'; + +import { UserService } from '../shared'; +import { FormReactive, USER_USERNAME, USER_PASSWORD } from '../../../shared'; + +@Component({ + selector: 'my-user-add', + templateUrl: './user-add.component.html' +}) +export class UserAddComponent extends FormReactive implements OnInit { + error: string = null; + + form: FormGroup; + formErrors = { + 'username': '', + 'password': '' + }; + validationMessages = { + 'username': USER_USERNAME.MESSAGES, + 'password': USER_PASSWORD.MESSAGES, + }; + + constructor( + private formBuilder: FormBuilder, + private router: Router, + private userService: UserService + ) { + super(); + } + + buildForm() { + this.form = this.formBuilder.group({ + username: [ '', USER_USERNAME.VALIDATORS ], + password: [ '', USER_PASSWORD.VALIDATORS ], + }); + + this.form.valueChanges.subscribe(data => this.onValueChanged(data)); + } + + ngOnInit() { + this.buildForm(); + } + + addUser() { + this.error = null; + + const { username, password } = this.form.value; + + this.userService.addUser(username, password).subscribe( + ok => this.router.navigate([ '/admin/users/list' ]), + + err => this.error = err.text + ); + } +} diff --git a/client/src/app/+admin/users/user-list/index.ts b/client/src/app/+admin/users/user-list/index.ts new file mode 100644 index 000000000..51fbefa80 --- /dev/null +++ b/client/src/app/+admin/users/user-list/index.ts @@ -0,0 +1 @@ +export * from './user-list.component'; diff --git a/client/src/app/+admin/users/user-list/user-list.component.html b/client/src/app/+admin/users/user-list/user-list.component.html new file mode 100644 index 000000000..36193d119 --- /dev/null +++ b/client/src/app/+admin/users/user-list/user-list.component.html @@ -0,0 +1,28 @@ +

Users list

+ + + + + + + + + + + + + + + + + + + +
IDUsernameCreated DateRemove
{{ user.id }}{{ user.username }}{{ user.createdAt | date: 'medium' }} + +
+ + + + Add user + diff --git a/client/src/app/+admin/users/user-list/user-list.component.scss b/client/src/app/+admin/users/user-list/user-list.component.scss new file mode 100644 index 000000000..e9f61e900 --- /dev/null +++ b/client/src/app/+admin/users/user-list/user-list.component.scss @@ -0,0 +1,7 @@ +.glyphicon-remove { + cursor: pointer; +} + +.add-user { + margin-top: 10px; +} diff --git a/client/src/app/+admin/users/user-list/user-list.component.ts b/client/src/app/+admin/users/user-list/user-list.component.ts new file mode 100644 index 000000000..03f4e5c0a --- /dev/null +++ b/client/src/app/+admin/users/user-list/user-list.component.ts @@ -0,0 +1,42 @@ +import { Component, OnInit } from '@angular/core'; + +import { User } from '../../../shared'; +import { UserService } from '../shared'; + +@Component({ + selector: 'my-user-list', + templateUrl: './user-list.component.html', + styleUrls: [ './user-list.component.scss' ] +}) +export class UserListComponent implements OnInit { + totalUsers: number; + users: User[]; + + constructor(private userService: UserService) {} + + ngOnInit() { + this.getUsers(); + } + + getUsers() { + this.userService.getUsers().subscribe( + ({ users, totalUsers }) => { + this.users = users; + this.totalUsers = totalUsers; + }, + + err => alert(err.text) + ); + } + + + removeUser(user: User) { + if (confirm('Are you sure?')) { + this.userService.removeUser(user).subscribe( + () => this.getUsers(), + + err => alert(err.text) + ); + } + } +} diff --git a/client/src/app/+admin/users/users.component.ts b/client/src/app/+admin/users/users.component.ts new file mode 100644 index 000000000..37e3b158d --- /dev/null +++ b/client/src/app/+admin/users/users.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + template: '' +}) + +export class UsersComponent { +} diff --git a/client/src/app/+admin/users/users.routes.ts b/client/src/app/+admin/users/users.routes.ts new file mode 100644 index 000000000..92e3e43e3 --- /dev/null +++ b/client/src/app/+admin/users/users.routes.ts @@ -0,0 +1,37 @@ +import { Routes } from '@angular/router'; + +import { UsersComponent } from './users.component'; +import { UserAddComponent } from './user-add'; +import { UserListComponent } from './user-list'; + +export const UsersRoutes: Routes = [ + { + path: 'users', + component: UsersComponent, + children: [ + { + path: '', + redirectTo: 'list', + pathMatch: 'full' + }, + { + path: 'list', + component: UserListComponent, + data: { + meta: { + titleSuffix: ' - Users list' + } + } + }, + { + path: 'add', + component: UserAddComponent, + data: { + meta: { + titleSuffix: ' - Add a user' + } + } + } + ] + } +]; diff --git a/client/src/app/+admin/video-abuses/index.ts b/client/src/app/+admin/video-abuses/index.ts new file mode 100644 index 000000000..7f5e65f91 --- /dev/null +++ b/client/src/app/+admin/video-abuses/index.ts @@ -0,0 +1,3 @@ +export * from './video-abuse-list'; +export * from './video-abuses.component'; +export * from './video-abuses.routes'; diff --git a/client/src/app/+admin/video-abuses/video-abuse-list/index.ts b/client/src/app/+admin/video-abuses/video-abuse-list/index.ts new file mode 100644 index 000000000..3f2ed1714 --- /dev/null +++ b/client/src/app/+admin/video-abuses/video-abuse-list/index.ts @@ -0,0 +1 @@ +export * from './video-abuse-list.component'; diff --git a/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.html b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.html new file mode 100644 index 000000000..46043577c --- /dev/null +++ b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.html @@ -0,0 +1,27 @@ +

Video abuses list

+ + + + + + + + + + + + + + + + + + + + + + + +
IDReasonReporter pod hostReporter usernameVideoCreated at
{{ videoAbuse.id }}{{ videoAbuse.reason }}{{ videoAbuse.reporterPodHost }}{{ videoAbuse.reporterUsername }} + {{ videoAbuse.videoId }} + {{ videoAbuse.createdAt | date: 'medium' }}
diff --git a/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.scss b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.scss new file mode 100644 index 000000000..a094f74b8 --- /dev/null +++ b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.scss @@ -0,0 +1,7 @@ +.cell-id { + width: 40px; +} + +.cell-reason { + width: 200px; +} diff --git a/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts new file mode 100644 index 000000000..de58bba3d --- /dev/null +++ b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts @@ -0,0 +1,31 @@ +import { setInterval } from 'timers' +import { Component, OnInit } from '@angular/core'; + +import { VideoAbuseService, VideoAbuse} from '../../../shared'; + +@Component({ + selector: 'my-video-abuse-list', + templateUrl: './video-abuse-list.component.html', + styleUrls: [ './video-abuse-list.component.scss' ] +}) +export class VideoAbuseListComponent implements OnInit { + videoAbuses: VideoAbuse[]; + + constructor(private videoAbuseService: VideoAbuseService) { } + + ngOnInit() { + this.getVideoAbuses(); + } + + buildVideoLink(videoAbuse: VideoAbuse) { + return `/videos/${videoAbuse.videoId}`; + } + + private getVideoAbuses() { + this.videoAbuseService.getVideoAbuses().subscribe( + res => this.videoAbuses = res.videoAbuses, + + err => alert(err.text) + ); + } +} diff --git a/client/src/app/+admin/video-abuses/video-abuses.component.ts b/client/src/app/+admin/video-abuses/video-abuses.component.ts new file mode 100644 index 000000000..001f27e87 --- /dev/null +++ b/client/src/app/+admin/video-abuses/video-abuses.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + template: '' +}) + +export class VideoAbusesComponent { +} diff --git a/client/src/app/+admin/video-abuses/video-abuses.routes.ts b/client/src/app/+admin/video-abuses/video-abuses.routes.ts new file mode 100644 index 000000000..26a761887 --- /dev/null +++ b/client/src/app/+admin/video-abuses/video-abuses.routes.ts @@ -0,0 +1,28 @@ +import { Routes } from '@angular/router'; + +import { VideoAbusesComponent } from './video-abuses.component'; +import { VideoAbuseListComponent } from './video-abuse-list'; + +export const VideoAbusesRoutes: Routes = [ + { + path: 'video-abuses', + component: VideoAbusesComponent + , + children: [ + { + path: '', + redirectTo: 'list', + pathMatch: 'full' + }, + { + path: 'list', + component: VideoAbuseListComponent, + data: { + meta: { + titleSuffix: ' - Video abuses list' + } + } + } + ] + } +]; diff --git a/client/src/app/admin/admin-routing.module.ts b/client/src/app/admin/admin-routing.module.ts deleted file mode 100644 index cabc6df15..000000000 --- a/client/src/app/admin/admin-routing.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { AdminComponent } from './admin.component'; -import { FriendsRoutes } from './friends'; -import { RequestsRoutes } from './requests'; -import { UsersRoutes } from './users'; -import { VideoAbusesRoutes } from './video-abuses'; - -const adminRoutes: Routes = [ - { - path: 'admin', - component: AdminComponent, - children: [ - { - path: '', - redirectTo: 'users', - pathMatch: 'full' - }, - ...FriendsRoutes, - ...RequestsRoutes, - ...UsersRoutes, - ...VideoAbusesRoutes - ] - } -]; - -@NgModule({ - imports: [ RouterModule.forChild(adminRoutes) ], - exports: [ RouterModule ] -}) -export class AdminRoutingModule {} diff --git a/client/src/app/admin/admin.component.ts b/client/src/app/admin/admin.component.ts deleted file mode 100644 index 64a7400e7..000000000 --- a/client/src/app/admin/admin.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - template: '' -}) - -export class AdminComponent { -} diff --git a/client/src/app/admin/admin.module.ts b/client/src/app/admin/admin.module.ts deleted file mode 100644 index d3ada8ce8..000000000 --- a/client/src/app/admin/admin.module.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { NgModule } from '@angular/core'; - -import { AdminComponent } from './admin.component'; -import { AdminRoutingModule } from './admin-routing.module'; -import { FriendsComponent, FriendAddComponent, FriendListComponent, FriendService } from './friends'; -import { RequestsComponent, RequestStatsComponent, RequestService } from './requests'; -import { UsersComponent, UserAddComponent, UserListComponent, UserService } from './users'; -import { VideoAbusesComponent, VideoAbuseListComponent } from './video-abuses'; -import { MenuAdminComponent } from './menu-admin.component'; -import { SharedModule } from '../shared'; - -@NgModule({ - imports: [ - AdminRoutingModule, - SharedModule - ], - - declarations: [ - AdminComponent, - - FriendsComponent, - FriendAddComponent, - FriendListComponent, - - RequestsComponent, - RequestStatsComponent, - - UsersComponent, - UserAddComponent, - UserListComponent, - - VideoAbusesComponent, - VideoAbuseListComponent, - - MenuAdminComponent - ], - - exports: [ - AdminComponent, - MenuAdminComponent - ], - - providers: [ - FriendService, - RequestService, - UserService - ] -}) -export class AdminModule { } diff --git a/client/src/app/admin/friends/friend-add/friend-add.component.html b/client/src/app/admin/friends/friend-add/friend-add.component.html deleted file mode 100644 index eebe033f9..000000000 --- a/client/src/app/admin/friends/friend-add/friend-add.component.html +++ /dev/null @@ -1,30 +0,0 @@ -

Make friends

- -
{{ error }}
- -
-
- - -
- - - - - -
- -
- It should be a valid host. -
-
- -
- It seems that you are not on a HTTPS pod. Your webserver need to have TLS activated in order to make friends. -
- - -
diff --git a/client/src/app/admin/friends/friend-add/friend-add.component.scss b/client/src/app/admin/friends/friend-add/friend-add.component.scss deleted file mode 100644 index 5fde51636..000000000 --- a/client/src/app/admin/friends/friend-add/friend-add.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -table { - margin-bottom: 40px; -} - -.input-group-btn button { - width: 35px; -} diff --git a/client/src/app/admin/friends/friend-add/friend-add.component.ts b/client/src/app/admin/friends/friend-add/friend-add.component.ts deleted file mode 100644 index 014252011..000000000 --- a/client/src/app/admin/friends/friend-add/friend-add.component.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { Router } from '@angular/router'; - -import { validateHost } from '../../../shared'; -import { FriendService } from '../shared'; - -@Component({ - selector: 'my-friend-add', - templateUrl: './friend-add.component.html', - styleUrls: [ './friend-add.component.scss' ] -}) -export class FriendAddComponent implements OnInit { - form: FormGroup; - hosts = [ ]; - error: string = null; - - constructor(private router: Router, private friendService: FriendService) {} - - ngOnInit() { - this.form = new FormGroup({}); - this.addField(); - } - - addField() { - this.form.addControl(`host-${this.hosts.length}`, new FormControl('', [ validateHost ])); - this.hosts.push(''); - } - - canMakeFriends() { - return window.location.protocol === 'https:'; - } - - customTrackBy(index: number, obj: any): any { - return index; - } - - displayAddField(index: number) { - return index === (this.hosts.length - 1); - } - - displayRemoveField(index: number) { - return (index !== 0 || this.hosts.length > 1) && index !== (this.hosts.length - 1); - } - - isFormValid() { - // Do not check the last input - for (let i = 0; i < this.hosts.length - 1; i++) { - if (!this.form.controls[`host-${i}`].valid) return false; - } - - const lastIndex = this.hosts.length - 1; - // If the last input (which is not the first) is empty, it's ok - if (this.hosts[lastIndex] === '' && lastIndex !== 0) { - return true; - } else { - return this.form.controls[`host-${lastIndex}`].valid; - } - } - - removeField(index: number) { - // Remove the last control - this.form.removeControl(`host-${this.hosts.length - 1}`); - this.hosts.splice(index, 1); - } - - makeFriends() { - this.error = ''; - - const notEmptyHosts = this.getNotEmptyHosts(); - if (notEmptyHosts.length === 0) { - this.error = 'You need to specify at least 1 host.'; - return; - } - - if (!this.isHostsUnique(notEmptyHosts)) { - this.error = 'Hosts need to be unique.'; - return; - } - - const confirmMessage = 'Are you sure to make friends with:\n - ' + notEmptyHosts.join('\n - '); - if (!confirm(confirmMessage)) return; - - this.friendService.makeFriends(notEmptyHosts).subscribe( - status => { - alert('Make friends request sent!'); - this.router.navigate([ '/admin/friends/list' ]); - }, - error => alert(error.text) - ); - } - - private getNotEmptyHosts() { - const notEmptyHosts = []; - - Object.keys(this.form.value).forEach((hostKey) => { - const host = this.form.value[hostKey]; - if (host !== '') notEmptyHosts.push(host); - }); - - return notEmptyHosts; - } - - private isHostsUnique(hosts: string[]) { - return hosts.every(host => hosts.indexOf(host) === hosts.lastIndexOf(host)); - } -} diff --git a/client/src/app/admin/friends/friend-add/index.ts b/client/src/app/admin/friends/friend-add/index.ts deleted file mode 100644 index a101b3be5..000000000 --- a/client/src/app/admin/friends/friend-add/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './friend-add.component'; diff --git a/client/src/app/admin/friends/friend-list/friend-list.component.html b/client/src/app/admin/friends/friend-list/friend-list.component.html deleted file mode 100644 index 06258f8c8..000000000 --- a/client/src/app/admin/friends/friend-list/friend-list.component.html +++ /dev/null @@ -1,29 +0,0 @@ -

Friends list

- - - - - - - - - - - - - - - - - - - -
IDHostScoreCreated Date
{{ friend.id }}{{ friend.host }}{{ friend.score }}{{ friend.createdAt | date: 'medium' }}
- - - Quit friends - - - - Make friends - diff --git a/client/src/app/admin/friends/friend-list/friend-list.component.scss b/client/src/app/admin/friends/friend-list/friend-list.component.scss deleted file mode 100644 index cb597e12b..000000000 --- a/client/src/app/admin/friends/friend-list/friend-list.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -table { - margin-bottom: 40px; -} diff --git a/client/src/app/admin/friends/friend-list/friend-list.component.ts b/client/src/app/admin/friends/friend-list/friend-list.component.ts deleted file mode 100644 index bec10162c..000000000 --- a/client/src/app/admin/friends/friend-list/friend-list.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -import { Friend, FriendService } from '../shared'; - -@Component({ - selector: 'my-friend-list', - templateUrl: './friend-list.component.html', - styleUrls: [ './friend-list.component.scss' ] -}) -export class FriendListComponent implements OnInit { - friends: Friend[]; - - constructor(private friendService: FriendService) { } - - ngOnInit() { - this.getFriends(); - } - - quitFriends() { - if (!confirm('Are you sure?')) return; - - this.friendService.quitFriends().subscribe( - status => { - alert('Quit friends!'); - this.getFriends(); - }, - error => alert(error.text) - ); - } - - private getFriends() { - this.friendService.getFriends().subscribe( - res => this.friends = res.friends, - - err => alert(err.text) - ); - } -} diff --git a/client/src/app/admin/friends/friend-list/index.ts b/client/src/app/admin/friends/friend-list/index.ts deleted file mode 100644 index 354c978a4..000000000 --- a/client/src/app/admin/friends/friend-list/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './friend-list.component'; diff --git a/client/src/app/admin/friends/friends.component.ts b/client/src/app/admin/friends/friends.component.ts deleted file mode 100644 index bc3f54158..000000000 --- a/client/src/app/admin/friends/friends.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - template: '' -}) - -export class FriendsComponent { -} diff --git a/client/src/app/admin/friends/friends.routes.ts b/client/src/app/admin/friends/friends.routes.ts deleted file mode 100644 index a9a06539b..000000000 --- a/client/src/app/admin/friends/friends.routes.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Routes } from '@angular/router'; - -import { FriendsComponent } from './friends.component'; -import { FriendAddComponent } from './friend-add'; -import { FriendListComponent } from './friend-list'; - -export const FriendsRoutes: Routes = [ - { - path: 'friends', - component: FriendsComponent, - children: [ - { - path: '', - redirectTo: 'list', - pathMatch: 'full' - }, - { - path: 'list', - component: FriendListComponent, - data: { - meta: { - titleSuffix: ' - Friends list' - } - } - }, - { - path: 'add', - component: FriendAddComponent, - data: { - meta: { - titleSuffix: ' - Add friends' - } - } - } - ] - } -]; diff --git a/client/src/app/admin/friends/index.ts b/client/src/app/admin/friends/index.ts deleted file mode 100644 index dd4df2538..000000000 --- a/client/src/app/admin/friends/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './friend-add'; -export * from './friend-list'; -export * from './shared'; -export * from './friends.component'; -export * from './friends.routes'; diff --git a/client/src/app/admin/friends/shared/friend.model.ts b/client/src/app/admin/friends/shared/friend.model.ts deleted file mode 100644 index 462cc82ed..000000000 --- a/client/src/app/admin/friends/shared/friend.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface Friend { - id: string; - host: string; - score: number; - createdAt: Date; -} diff --git a/client/src/app/admin/friends/shared/friend.service.ts b/client/src/app/admin/friends/shared/friend.service.ts deleted file mode 100644 index e97459385..000000000 --- a/client/src/app/admin/friends/shared/friend.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/map'; - -import { Friend } from './friend.model'; -import { AuthHttp, RestExtractor, ResultList } from '../../../shared'; - -@Injectable() -export class FriendService { - private static BASE_FRIEND_URL: string = '/api/v1/pods/'; - - constructor ( - private authHttp: AuthHttp, - private restExtractor: RestExtractor - ) {} - - getFriends() { - return this.authHttp.get(FriendService.BASE_FRIEND_URL) - .map(this.restExtractor.extractDataList) - .map(this.extractFriends) - .catch((res) => this.restExtractor.handleError(res)); - } - - makeFriends(notEmptyHosts) { - const body = { - hosts: notEmptyHosts - }; - - return this.authHttp.post(FriendService.BASE_FRIEND_URL + 'makefriends', body) - .map(this.restExtractor.extractDataBool) - .catch((res) => this.restExtractor.handleError(res)); - } - - quitFriends() { - return this.authHttp.get(FriendService.BASE_FRIEND_URL + 'quitfriends') - .map(res => res.status) - .catch((res) => this.restExtractor.handleError(res)); - } - - private extractFriends(result: ResultList) { - const friends: Friend[] = result.data; - const totalFriends = result.total; - - return { friends, totalFriends }; - } -} diff --git a/client/src/app/admin/friends/shared/index.ts b/client/src/app/admin/friends/shared/index.ts deleted file mode 100644 index 0d671637d..000000000 --- a/client/src/app/admin/friends/shared/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './friend.model'; -export * from './friend.service'; diff --git a/client/src/app/admin/index.ts b/client/src/app/admin/index.ts deleted file mode 100644 index b75ff9b51..000000000 --- a/client/src/app/admin/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './friends'; -export * from './requests'; -export * from './users'; -export * from './admin-routing.module'; -export * from './admin.module'; -export * from './admin.component'; -export * from './menu-admin.component'; diff --git a/client/src/app/admin/menu-admin.component.html b/client/src/app/admin/menu-admin.component.html deleted file mode 100644 index ad7a7a1b4..000000000 --- a/client/src/app/admin/menu-admin.component.html +++ /dev/null @@ -1,31 +0,0 @@ - - -
-
- - List users -
- -
- - List friends -
- - - -
- - Video abuses -
-
- -
-
- - Quit admin. -
-
-
diff --git a/client/src/app/admin/menu-admin.component.ts b/client/src/app/admin/menu-admin.component.ts deleted file mode 100644 index 59ffccf9f..000000000 --- a/client/src/app/admin/menu-admin.component.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'my-menu-admin', - templateUrl: './menu-admin.component.html' -}) -export class MenuAdminComponent { } diff --git a/client/src/app/admin/requests/index.ts b/client/src/app/admin/requests/index.ts deleted file mode 100644 index 236a9ee8f..000000000 --- a/client/src/app/admin/requests/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index be3a66f77..000000000 --- a/client/src/app/admin/requests/request-stats/index.ts +++ /dev/null @@ -1 +0,0 @@ -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 deleted file mode 100644 index 9dbed1739..000000000 --- a/client/src/app/admin/requests/request-stats/request-stats.component.html +++ /dev/null @@ -1,33 +0,0 @@ -

Requests stats

- -
-
-
- Remaining requests: - {{ stats.totalRequests }} -
- -
- Interval seconds between requests: - {{ stats.secondsInterval }} -
- -
- Remaining time before the scheduled request: - {{ stats.remainingSeconds }} -
-
- -
-
- Maximum number of different pods for a scheduled request: - {{ stats.requestsLimitPods }} -
- -
- Maximum number of requests per pod for a scheduled request: - {{ stats.requestsLimitPerPod }} -
-
- -
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 deleted file mode 100644 index 9c68fba99..000000000 --- a/client/src/app/admin/requests/request-stats/request-stats.component.scss +++ /dev/null @@ -1,19 +0,0 @@ -.label-description { - display: inline-block; - font-weight: bold; - color: black; -} - -.requests-general { - .label-description { - width: 320px; - } -} - -.requests-limit { - margin-top: 20px; - - .label-description { - width: 430px; - } -} 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 deleted file mode 100644 index 23b836779..000000000 --- a/client/src/app/admin/requests/request-stats/request-stats.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { setInterval } from 'timers' -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(); - this.runInterval(); - } - - ngOnDestroy() { - if (this.stats !== null && this.stats.secondsInterval !== null) { - clearInterval(this.interval); - } - } - - getStats() { - this.requestService.getStats().subscribe( - stats => this.stats = stats, - - err => alert(err.text) - ); - } - - private runInterval() { - this.interval = setInterval(() => { - this.stats.remainingMilliSeconds -= 1000; - - if (this.stats.remainingMilliSeconds <= 0) { - setTimeout(() => this.getStats(), this.stats.remainingMilliSeconds + 100); - } - }, 1000); - } - - -} diff --git a/client/src/app/admin/requests/requests.component.ts b/client/src/app/admin/requests/requests.component.ts deleted file mode 100644 index 471112b45..000000000 --- a/client/src/app/admin/requests/requests.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - template: '' -}) - -export class RequestsComponent { -} diff --git a/client/src/app/admin/requests/requests.routes.ts b/client/src/app/admin/requests/requests.routes.ts deleted file mode 100644 index 70fbf41c3..000000000 --- a/client/src/app/admin/requests/requests.routes.ts +++ /dev/null @@ -1,27 +0,0 @@ -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, - data: { - meta: { - titleSuffix: ' - Request stats' - } - } - } - ] - } -]; diff --git a/client/src/app/admin/requests/shared/index.ts b/client/src/app/admin/requests/shared/index.ts deleted file mode 100644 index 32ab5767b..000000000 --- a/client/src/app/admin/requests/shared/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -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 deleted file mode 100644 index f658c4682..000000000 --- a/client/src/app/admin/requests/shared/request-stats.model.ts +++ /dev/null @@ -1,35 +0,0 @@ -export interface Request { - request: any; - to: any; -} - -export class RequestStats { - requestsLimitPods: number; - requestsLimitPerPod: number; - milliSecondsInterval: number; - remainingMilliSeconds: number; - totalRequests: number; - - constructor(hash: { - requestsLimitPods: number, - requestsLimitPerPod: number, - milliSecondsInterval: number, - remainingMilliSeconds: number, - totalRequests: number; - }) { - this.requestsLimitPods = hash.requestsLimitPods; - this.requestsLimitPerPod = hash.requestsLimitPerPod; - this.milliSecondsInterval = hash.milliSecondsInterval; - this.remainingMilliSeconds = hash.remainingMilliSeconds; - this.totalRequests = hash.totalRequests; - } - - get remainingSeconds() { - return Math.floor(this.remainingMilliSeconds / 1000); - } - - get secondsInterval() { - return Math.floor(this.milliSecondsInterval / 1000); - } - -} diff --git a/client/src/app/admin/requests/shared/request.service.ts b/client/src/app/admin/requests/shared/request.service.ts deleted file mode 100644 index 55b28bcfc..000000000 --- a/client/src/app/admin/requests/shared/request.service.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/map'; - -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 { - return this.authHttp.get(RequestService.BASE_REQUEST_URL + 'stats') - .map(this.restExtractor.extractDataGet) - .map((data) => new RequestStats(data)) - .catch((res) => this.restExtractor.handleError(res)); - } -} diff --git a/client/src/app/admin/users/index.ts b/client/src/app/admin/users/index.ts deleted file mode 100644 index e98a81f62..000000000 --- a/client/src/app/admin/users/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './shared'; -export * from './user-add'; -export * from './user-list'; -export * from './users.component'; -export * from './users.routes'; diff --git a/client/src/app/admin/users/shared/index.ts b/client/src/app/admin/users/shared/index.ts deleted file mode 100644 index e17ee5c7a..000000000 --- a/client/src/app/admin/users/shared/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './user.service'; diff --git a/client/src/app/admin/users/shared/user.service.ts b/client/src/app/admin/users/shared/user.service.ts deleted file mode 100644 index d9005b213..000000000 --- a/client/src/app/admin/users/shared/user.service.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Injectable } from '@angular/core'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/map'; - -import { AuthHttp, RestExtractor, ResultList, User } from '../../../shared'; - -@Injectable() -export class UserService { - // TODO: merge this constant with account - private static BASE_USERS_URL = '/api/v1/users/'; - - constructor( - private authHttp: AuthHttp, - private restExtractor: RestExtractor - ) {} - - addUser(username: string, password: string) { - const body = { - username, - password - }; - - return this.authHttp.post(UserService.BASE_USERS_URL, body) - .map(this.restExtractor.extractDataBool) - .catch(this.restExtractor.handleError); - } - - getUsers() { - return this.authHttp.get(UserService.BASE_USERS_URL) - .map(this.restExtractor.extractDataList) - .map(this.extractUsers) - .catch((res) => this.restExtractor.handleError(res)); - } - - removeUser(user: User) { - return this.authHttp.delete(UserService.BASE_USERS_URL + user.id); - } - - private extractUsers(result: ResultList) { - const usersJson = result.data; - const totalUsers = result.total; - const users = []; - for (const userJson of usersJson) { - users.push(new User(userJson)); - } - - return { users, totalUsers }; - } -} diff --git a/client/src/app/admin/users/user-add/index.ts b/client/src/app/admin/users/user-add/index.ts deleted file mode 100644 index 66d5ca04f..000000000 --- a/client/src/app/admin/users/user-add/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './user-add.component'; diff --git a/client/src/app/admin/users/user-add/user-add.component.html b/client/src/app/admin/users/user-add/user-add.component.html deleted file mode 100644 index 9b76c7c1b..000000000 --- a/client/src/app/admin/users/user-add/user-add.component.html +++ /dev/null @@ -1,29 +0,0 @@ -

Add user

- -
{{ error }}
- -
-
- - -
- {{ formErrors.username }} -
-
- -
- - -
- {{ formErrors.password }} -
-
- - -
diff --git a/client/src/app/admin/users/user-add/user-add.component.ts b/client/src/app/admin/users/user-add/user-add.component.ts deleted file mode 100644 index ab96fb01d..000000000 --- a/client/src/app/admin/users/user-add/user-add.component.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; -import { Router } from '@angular/router'; - -import { UserService } from '../shared'; -import { FormReactive, USER_USERNAME, USER_PASSWORD } from '../../../shared'; - -@Component({ - selector: 'my-user-add', - templateUrl: './user-add.component.html' -}) -export class UserAddComponent extends FormReactive implements OnInit { - error: string = null; - - form: FormGroup; - formErrors = { - 'username': '', - 'password': '' - }; - validationMessages = { - 'username': USER_USERNAME.MESSAGES, - 'password': USER_PASSWORD.MESSAGES, - }; - - constructor( - private formBuilder: FormBuilder, - private router: Router, - private userService: UserService - ) { - super(); - } - - buildForm() { - this.form = this.formBuilder.group({ - username: [ '', USER_USERNAME.VALIDATORS ], - password: [ '', USER_PASSWORD.VALIDATORS ], - }); - - this.form.valueChanges.subscribe(data => this.onValueChanged(data)); - } - - ngOnInit() { - this.buildForm(); - } - - addUser() { - this.error = null; - - const { username, password } = this.form.value; - - this.userService.addUser(username, password).subscribe( - ok => this.router.navigate([ '/admin/users/list' ]), - - err => this.error = err.text - ); - } -} diff --git a/client/src/app/admin/users/user-list/index.ts b/client/src/app/admin/users/user-list/index.ts deleted file mode 100644 index 51fbefa80..000000000 --- a/client/src/app/admin/users/user-list/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './user-list.component'; diff --git a/client/src/app/admin/users/user-list/user-list.component.html b/client/src/app/admin/users/user-list/user-list.component.html deleted file mode 100644 index 36193d119..000000000 --- a/client/src/app/admin/users/user-list/user-list.component.html +++ /dev/null @@ -1,28 +0,0 @@ -

Users list

- - - - - - - - - - - - - - - - - - - -
IDUsernameCreated DateRemove
{{ user.id }}{{ user.username }}{{ user.createdAt | date: 'medium' }} - -
- - - - Add user - diff --git a/client/src/app/admin/users/user-list/user-list.component.scss b/client/src/app/admin/users/user-list/user-list.component.scss deleted file mode 100644 index e9f61e900..000000000 --- a/client/src/app/admin/users/user-list/user-list.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -.glyphicon-remove { - cursor: pointer; -} - -.add-user { - margin-top: 10px; -} diff --git a/client/src/app/admin/users/user-list/user-list.component.ts b/client/src/app/admin/users/user-list/user-list.component.ts deleted file mode 100644 index 03f4e5c0a..000000000 --- a/client/src/app/admin/users/user-list/user-list.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -import { User } from '../../../shared'; -import { UserService } from '../shared'; - -@Component({ - selector: 'my-user-list', - templateUrl: './user-list.component.html', - styleUrls: [ './user-list.component.scss' ] -}) -export class UserListComponent implements OnInit { - totalUsers: number; - users: User[]; - - constructor(private userService: UserService) {} - - ngOnInit() { - this.getUsers(); - } - - getUsers() { - this.userService.getUsers().subscribe( - ({ users, totalUsers }) => { - this.users = users; - this.totalUsers = totalUsers; - }, - - err => alert(err.text) - ); - } - - - removeUser(user: User) { - if (confirm('Are you sure?')) { - this.userService.removeUser(user).subscribe( - () => this.getUsers(), - - err => alert(err.text) - ); - } - } -} diff --git a/client/src/app/admin/users/users.component.ts b/client/src/app/admin/users/users.component.ts deleted file mode 100644 index 37e3b158d..000000000 --- a/client/src/app/admin/users/users.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - template: '' -}) - -export class UsersComponent { -} diff --git a/client/src/app/admin/users/users.routes.ts b/client/src/app/admin/users/users.routes.ts deleted file mode 100644 index 92e3e43e3..000000000 --- a/client/src/app/admin/users/users.routes.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Routes } from '@angular/router'; - -import { UsersComponent } from './users.component'; -import { UserAddComponent } from './user-add'; -import { UserListComponent } from './user-list'; - -export const UsersRoutes: Routes = [ - { - path: 'users', - component: UsersComponent, - children: [ - { - path: '', - redirectTo: 'list', - pathMatch: 'full' - }, - { - path: 'list', - component: UserListComponent, - data: { - meta: { - titleSuffix: ' - Users list' - } - } - }, - { - path: 'add', - component: UserAddComponent, - data: { - meta: { - titleSuffix: ' - Add a user' - } - } - } - ] - } -]; diff --git a/client/src/app/admin/video-abuses/index.ts b/client/src/app/admin/video-abuses/index.ts deleted file mode 100644 index 7f5e65f91..000000000 --- a/client/src/app/admin/video-abuses/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './video-abuse-list'; -export * from './video-abuses.component'; -export * from './video-abuses.routes'; diff --git a/client/src/app/admin/video-abuses/video-abuse-list/index.ts b/client/src/app/admin/video-abuses/video-abuse-list/index.ts deleted file mode 100644 index 3f2ed1714..000000000 --- a/client/src/app/admin/video-abuses/video-abuse-list/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './video-abuse-list.component'; diff --git a/client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.html b/client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.html deleted file mode 100644 index 46043577c..000000000 --- a/client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.html +++ /dev/null @@ -1,27 +0,0 @@ -

Video abuses list

- - - - - - - - - - - - - - - - - - - - - - - -
IDReasonReporter pod hostReporter usernameVideoCreated at
{{ videoAbuse.id }}{{ videoAbuse.reason }}{{ videoAbuse.reporterPodHost }}{{ videoAbuse.reporterUsername }} - {{ videoAbuse.videoId }} - {{ videoAbuse.createdAt | date: 'medium' }}
diff --git a/client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.scss b/client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.scss deleted file mode 100644 index a094f74b8..000000000 --- a/client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -.cell-id { - width: 40px; -} - -.cell-reason { - width: 200px; -} diff --git a/client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.ts b/client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.ts deleted file mode 100644 index de58bba3d..000000000 --- a/client/src/app/admin/video-abuses/video-abuse-list/video-abuse-list.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { setInterval } from 'timers' -import { Component, OnInit } from '@angular/core'; - -import { VideoAbuseService, VideoAbuse} from '../../../shared'; - -@Component({ - selector: 'my-video-abuse-list', - templateUrl: './video-abuse-list.component.html', - styleUrls: [ './video-abuse-list.component.scss' ] -}) -export class VideoAbuseListComponent implements OnInit { - videoAbuses: VideoAbuse[]; - - constructor(private videoAbuseService: VideoAbuseService) { } - - ngOnInit() { - this.getVideoAbuses(); - } - - buildVideoLink(videoAbuse: VideoAbuse) { - return `/videos/${videoAbuse.videoId}`; - } - - private getVideoAbuses() { - this.videoAbuseService.getVideoAbuses().subscribe( - res => this.videoAbuses = res.videoAbuses, - - err => alert(err.text) - ); - } -} diff --git a/client/src/app/admin/video-abuses/video-abuses.component.ts b/client/src/app/admin/video-abuses/video-abuses.component.ts deleted file mode 100644 index 001f27e87..000000000 --- a/client/src/app/admin/video-abuses/video-abuses.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - template: '' -}) - -export class VideoAbusesComponent { -} diff --git a/client/src/app/admin/video-abuses/video-abuses.routes.ts b/client/src/app/admin/video-abuses/video-abuses.routes.ts deleted file mode 100644 index 26a761887..000000000 --- a/client/src/app/admin/video-abuses/video-abuses.routes.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Routes } from '@angular/router'; - -import { VideoAbusesComponent } from './video-abuses.component'; -import { VideoAbuseListComponent } from './video-abuse-list'; - -export const VideoAbusesRoutes: Routes = [ - { - path: 'video-abuses', - component: VideoAbusesComponent - , - children: [ - { - path: '', - redirectTo: 'list', - pathMatch: 'full' - }, - { - path: 'list', - component: VideoAbuseListComponent, - data: { - meta: { - titleSuffix: ' - Video abuses list' - } - } - } - ] - } -]; diff --git a/client/src/app/app-routing.module.ts b/client/src/app/app-routing.module.ts index 900a4c5b6..f9465dc9c 100644 --- a/client/src/app/app-routing.module.ts +++ b/client/src/app/app-routing.module.ts @@ -6,6 +6,10 @@ const routes: Routes = [ path: '', redirectTo: '/videos/list', pathMatch: 'full' + }, + { + path: 'admin', + loadChildren: './+admin#AdminModule' } ]; diff --git a/client/src/app/app.module.ts b/client/src/app/app.module.ts index 10526e813..482a9b5b7 100644 --- a/client/src/app/app.module.ts +++ b/client/src/app/app.module.ts @@ -11,7 +11,6 @@ import { AppComponent } from './app.component'; import { AppState } from './app.service'; import { AccountModule } from './account'; -import { AdminModule } from './admin'; import { CoreModule } from './core'; import { LoginModule } from './login'; import { SharedModule } from './shared'; @@ -47,7 +46,6 @@ const APP_PROVIDERS = [ MetaModule.forRoot(metaConfig), AccountModule, - AdminModule, CoreModule, LoginModule, SharedModule, diff --git a/client/src/app/core/core.module.ts b/client/src/app/core/core.module.ts index 27e6ee1fb..09a6f92f5 100644 --- a/client/src/app/core/core.module.ts +++ b/client/src/app/core/core.module.ts @@ -4,7 +4,7 @@ import { HttpModule } from '@angular/http'; import { RouterModule } from '@angular/router'; import { AuthService } from './auth'; -import { MenuComponent } from './menu'; +import { MenuComponent, MenuAdminComponent } from './menu'; import { throwIfAlreadyLoaded } from './module-import-guard'; @NgModule({ @@ -13,8 +13,14 @@ import { throwIfAlreadyLoaded } from './module-import-guard'; HttpModule, RouterModule ], - declarations: [ MenuComponent ], - exports: [ MenuComponent ], + declarations: [ + MenuComponent, + MenuAdminComponent + ], + exports: [ + MenuComponent, + MenuAdminComponent + ], providers: [ AuthService ] }) export class CoreModule { diff --git a/client/src/app/core/menu/index.ts b/client/src/app/core/menu/index.ts index d07a1144c..ff40f26e1 100644 --- a/client/src/app/core/menu/index.ts +++ b/client/src/app/core/menu/index.ts @@ -1 +1,2 @@ export * from './menu.component'; +export * from './menu-admin.component'; diff --git a/client/src/app/core/menu/menu-admin.component.html b/client/src/app/core/menu/menu-admin.component.html new file mode 100644 index 000000000..ad7a7a1b4 --- /dev/null +++ b/client/src/app/core/menu/menu-admin.component.html @@ -0,0 +1,31 @@ + + +
+
+ + List users +
+ +
+ + List friends +
+ + + +
+ + Video abuses +
+
+ +
+
+ + Quit admin. +
+
+
diff --git a/client/src/app/core/menu/menu-admin.component.ts b/client/src/app/core/menu/menu-admin.component.ts new file mode 100644 index 000000000..59ffccf9f --- /dev/null +++ b/client/src/app/core/menu/menu-admin.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'my-menu-admin', + templateUrl: './menu-admin.component.html' +}) +export class MenuAdminComponent { } -- cgit v1.2.3