From df98563e2104b82b119c00a3cd83cd0dc1242d25 Mon Sep 17 00:00:00 2001 From: Chocobozzz <florian.bigard@gmail.com> Date: Fri, 16 Jun 2017 14:32:15 +0200 Subject: [PATCH] Use typescript standard and lint all files --- client/package.json | 5 +- client/src/app/+admin/admin-routing.module.ts | 16 +- client/src/app/+admin/admin.component.ts | 2 +- client/src/app/+admin/admin.module.ts | 18 +- .../friend-add/friend-add.component.ts | 108 +++--- .../app/+admin/friends/friend-add/index.ts | 2 +- .../friend-list/friend-list.component.ts | 38 +-- .../app/+admin/friends/friend-list/index.ts | 2 +- .../app/+admin/friends/friends.component.ts | 5 +- .../src/app/+admin/friends/friends.routes.ts | 60 ++-- client/src/app/+admin/friends/index.ts | 10 +- .../app/+admin/friends/shared/friend.model.ts | 10 +- .../+admin/friends/shared/friend.service.ts | 30 +- client/src/app/+admin/friends/shared/index.ts | 4 +- client/src/app/+admin/index.ts | 12 +- client/src/app/+admin/requests/index.ts | 8 +- .../+admin/requests/request-stats/index.ts | 2 +- .../request-stats/request-stats.component.ts | 55 ++- .../app/+admin/requests/requests.component.ts | 5 +- .../app/+admin/requests/requests.routes.ts | 42 +-- .../src/app/+admin/requests/shared/index.ts | 4 +- .../requests/shared/request-stats.model.ts | 36 +- .../+admin/requests/shared/request.service.ts | 28 +- client/src/app/+admin/users/index.ts | 10 +- client/src/app/+admin/users/shared/index.ts | 2 +- .../app/+admin/users/shared/user.service.ts | 26 +- client/src/app/+admin/users/user-add/index.ts | 2 +- .../users/user-add/user-add.component.ts | 50 +-- .../src/app/+admin/users/user-list/index.ts | 2 +- .../users/user-list/user-list.component.ts | 36 +- .../src/app/+admin/users/users.component.ts | 5 +- client/src/app/+admin/users/users.routes.ts | 10 +- client/src/app/+admin/video-abuses/index.ts | 6 +- .../video-abuses/video-abuse-list/index.ts | 2 +- .../video-abuse-list.component.ts | 24 +- .../video-abuses/video-abuses.component.ts | 2 +- .../video-abuses/video-abuses.routes.ts | 8 +- .../account-change-password.component.ts | 48 +-- .../account/account-change-password/index.ts | 2 +- .../account-details.component.ts | 52 +-- .../src/app/account/account-details/index.ts | 2 +- .../src/app/account/account-routing.module.ts | 8 +- client/src/app/account/account.component.ts | 20 +- client/src/app/account/account.module.ts | 14 +- client/src/app/account/index.ts | 6 +- client/src/app/app-routing.module.ts | 7 +- client/src/app/app.component.ts | 50 +-- client/src/app/app.module.ts | 80 ++--- client/src/app/app.resolver.ts | 14 +- client/src/app/app.service.ts | 20 +- client/src/app/core/auth/auth-user.model.ts | 180 +++++----- client/src/app/core/auth/auth.service.ts | 236 ++++++------- client/src/app/core/auth/index.ts | 4 +- client/src/app/core/config/config.service.ts | 24 +- client/src/app/core/config/index.ts | 2 +- .../src/app/core/confirm/confirm.component.ts | 48 +-- .../src/app/core/confirm/confirm.service.ts | 16 +- client/src/app/core/confirm/index.ts | 4 +- client/src/app/core/core.module.ts | 26 +- client/src/app/core/index.ts | 8 +- client/src/app/core/menu/index.ts | 4 +- .../src/app/core/menu/menu-admin.component.ts | 2 +- client/src/app/core/menu/menu.component.ts | 40 +-- client/src/app/core/module-import-guard.ts | 4 +- client/src/app/environment.ts | 2 + client/src/app/index.ts | 2 +- client/src/app/login/index.ts | 6 +- client/src/app/login/login-routing.module.ts | 8 +- client/src/app/login/login.component.ts | 50 +-- client/src/app/login/login.module.ts | 8 +- .../src/app/shared/auth/auth-http.service.ts | 82 ++--- client/src/app/shared/auth/index.ts | 2 +- client/src/app/shared/forms/form-reactive.ts | 30 +- .../forms/form-validators/host.validator.ts | 8 +- .../app/shared/forms/form-validators/index.ts | 8 +- .../app/shared/forms/form-validators/user.ts | 12 +- .../forms/form-validators/video-abuse.ts | 4 +- .../app/shared/forms/form-validators/video.ts | 14 +- client/src/app/shared/forms/index.ts | 4 +- client/src/app/shared/index.ts | 16 +- client/src/app/shared/rest/index.ts | 8 +- .../src/app/shared/rest/rest-data-source.ts | 60 ++-- .../app/shared/rest/rest-extractor.service.ts | 48 +-- client/src/app/shared/rest/rest-pagination.ts | 8 +- client/src/app/shared/rest/rest.service.ts | 22 +- client/src/app/shared/search/index.ts | 8 +- .../app/shared/search/search-field.type.ts | 2 +- .../src/app/shared/search/search.component.ts | 48 +-- client/src/app/shared/search/search.model.ts | 6 +- .../src/app/shared/search/search.service.ts | 18 +- client/src/app/shared/shared.module.ts | 36 +- client/src/app/shared/users/index.ts | 4 +- client/src/app/shared/users/user.model.ts | 34 +- client/src/app/shared/users/user.service.ts | 44 +-- client/src/app/shared/utils.ts | 10 +- client/src/app/shared/video-abuse/index.ts | 4 +- .../shared/video-abuse/video-abuse.model.ts | 12 +- .../shared/video-abuse/video-abuse.service.ts | 42 +-- client/src/app/signup/index.ts | 6 +- .../src/app/signup/signup-routing.module.ts | 8 +- client/src/app/signup/signup.component.ts | 50 +-- client/src/app/signup/signup.module.ts | 8 +- client/src/app/videos/index.ts | 14 +- client/src/app/videos/shared/index.ts | 8 +- .../src/app/videos/shared/rate-type.type.ts | 2 +- .../src/app/videos/shared/sort-field.type.ts | 3 +- client/src/app/videos/shared/video.model.ts | 150 ++++---- client/src/app/videos/shared/video.service.ts | 146 ++++---- client/src/app/videos/video-edit/index.ts | 4 +- .../videos/video-edit/video-add.component.ts | 159 ++++----- .../video-edit/video-update.component.ts | 99 +++--- client/src/app/videos/video-list/index.ts | 8 +- .../app/videos/video-list/loader.component.ts | 4 +- .../video-list/video-list.component.html | 2 +- .../videos/video-list/video-list.component.ts | 126 +++---- .../video-list/video-miniature.component.ts | 31 +- .../videos/video-list/video-sort.component.ts | 22 +- client/src/app/videos/video-watch/index.ts | 10 +- .../video-watch/video-magnet.component.ts | 20 +- .../video-watch/video-report.component.ts | 56 +-- .../video-watch/video-share.component.ts | 32 +- .../video-watch/video-watch.component.ts | 323 +++++++++--------- .../videos/video-watch/webtorrent.service.ts | 34 +- .../src/app/videos/videos-routing.module.ts | 14 +- client/src/app/videos/videos.component.ts | 2 +- client/src/app/videos/videos.module.ts | 18 +- client/src/custom-typings.d.ts | 2 + client/src/main.browser.aot.ts | 2 + client/src/main.browser.ts | 2 + client/src/polyfills.browser.ts | 2 + client/tslint.json | 43 +-- client/yarn.lock | 137 +++++--- package.json | 9 +- scripts/check.ts | 4 +- scripts/test.sh | 2 +- server/controllers/index.ts | 6 +- server/helpers/utils.ts | 1 - server/initializers/database.ts | 2 +- server/initializers/migrator.ts | 1 - server/lib/friends.ts | 6 +- server/lib/jobs/handlers/video-transcoder.ts | 4 +- tslint.json | 9 +- yarn.lock | 108 ++++-- 143 files changed, 2022 insertions(+), 1955 deletions(-) diff --git a/client/package.json b/client/package.json index aee548c3f5..794121ffbd 100644 --- a/client/package.json +++ b/client/package.json @@ -13,7 +13,7 @@ "url": "git://github.com/Chocobozzz/PeerTube.git" }, "scripts": { - "test": "standard && tslint -c ./tslint.json src/**/*.ts", + "test": "standard && tslint --type-check --project ./tsconfig.json -c ./tslint.json 'src/app/**/*.ts'", "webpack": "webpack", "webpack-dev-server": "webpack-dev-server" }, @@ -78,7 +78,7 @@ "tslib": "^1.5.0", "tslint": "~5.4.3", "tslint-loader": "^3.3.0", - "typescript": "~2.3.0", + "typescript": "~2.4.0", "url-loader": "^0.5.7", "video.js": "^5.19.2", "videojs-dock": "^2.0.2", @@ -93,6 +93,7 @@ "codelyzer": "^3.0.0-beta.4", "ng2-completer": "1.2.2", "standard": "^10.0.0", + "tslint-config-standard": "^6.0.1", "webpack-bundle-analyzer": "^2.8.2", "webpack-dev-server": "^2.4.5", "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 index d3adf3f3b9..839913135f 100644 --- a/client/src/app/+admin/admin-routing.module.ts +++ b/client/src/app/+admin/admin-routing.module.ts @@ -1,11 +1,11 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +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'; +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 = [ { @@ -23,7 +23,7 @@ const adminRoutes: Routes = [ ...VideoAbusesRoutes ] } -]; +] @NgModule({ imports: [ RouterModule.forChild(adminRoutes) ], diff --git a/client/src/app/+admin/admin.component.ts b/client/src/app/+admin/admin.component.ts index 64a7400e7e..93ec216bfd 100644 --- a/client/src/app/+admin/admin.component.ts +++ b/client/src/app/+admin/admin.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' @Component({ template: '<router-outlet></router-outlet>' diff --git a/client/src/app/+admin/admin.module.ts b/client/src/app/+admin/admin.module.ts index db1ce2d7f9..9ecce5dc3a 100644 --- a/client/src/app/+admin/admin.module.ts +++ b/client/src/app/+admin/admin.module.ts @@ -1,12 +1,12 @@ -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'; +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: [ 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 index 12c46e5cd6..35cf4a1f76 100644 --- a/client/src/app/+admin/friends/friend-add/friend-add.component.ts +++ b/client/src/app/+admin/friends/friend-add/friend-add.component.ts @@ -1,12 +1,12 @@ -import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { Router } from '@angular/router'; +import { Component, OnInit } from '@angular/core' +import { FormControl, FormGroup } from '@angular/forms' +import { Router } from '@angular/router' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' -import { ConfirmService } from '../../../core'; -import { validateHost } from '../../../shared'; -import { FriendService } from '../shared'; +import { ConfirmService } from '../../../core' +import { validateHost } from '../../../shared' +import { FriendService } from '../shared' @Component({ selector: 'my-friend-add', @@ -14,107 +14,107 @@ import { FriendService } from '../shared'; styleUrls: [ './friend-add.component.scss' ] }) export class FriendAddComponent implements OnInit { - form: FormGroup; - hosts = [ ]; - error: string = null; + form: FormGroup + hosts = [ ] + error: string = null - constructor( + constructor ( private router: Router, private notificationsService: NotificationsService, private confirmService: ConfirmService, private friendService: FriendService ) {} - ngOnInit() { - this.form = new FormGroup({}); - this.addField(); + ngOnInit () { + this.form = new FormGroup({}) + this.addField() } - addField() { - this.form.addControl(`host-${this.hosts.length}`, new FormControl('', [ validateHost ])); - this.hosts.push(''); + addField () { + this.form.addControl(`host-${this.hosts.length}`, new FormControl('', [ validateHost ])) + this.hosts.push('') } - canMakeFriends() { - return window.location.protocol === 'https:'; + canMakeFriends () { + return window.location.protocol === 'https:' } - customTrackBy(index: number, obj: any): any { - return index; + customTrackBy (index: number, obj: any): any { + return index } - displayAddField(index: number) { - return index === (this.hosts.length - 1); + displayAddField (index: number) { + return index === (this.hosts.length - 1) } - displayRemoveField(index: number) { - return (index !== 0 || this.hosts.length > 1) && index !== (this.hosts.length - 1); + displayRemoveField (index: number) { + return (index !== 0 || this.hosts.length > 1) && index !== (this.hosts.length - 1) } - isFormValid() { + 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; + if (!this.form.controls[`host-${i}`].valid) return false } - const lastIndex = this.hosts.length - 1; + 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; + return true } else { - return this.form.controls[`host-${lastIndex}`].valid; + return this.form.controls[`host-${lastIndex}`].valid } } - removeField(index: number) { + removeField (index: number) { // Remove the last control - this.form.removeControl(`host-${this.hosts.length - 1}`); - this.hosts.splice(index, 1); + this.form.removeControl(`host-${this.hosts.length - 1}`) + this.hosts.splice(index, 1) } - makeFriends() { - this.error = ''; + makeFriends () { + this.error = '' - const notEmptyHosts = this.getNotEmptyHosts(); + const notEmptyHosts = this.getNotEmptyHosts() if (notEmptyHosts.length === 0) { - this.error = 'You need to specify at least 1 host.'; - return; + this.error = 'You need to specify at least 1 host.' + return } if (!this.isHostsUnique(notEmptyHosts)) { - this.error = 'Hosts need to be unique.'; - return; + this.error = 'Hosts need to be unique.' + return } - const confirmMessage = 'Are you sure to make friends with:<br /> - ' + notEmptyHosts.join('<br /> - '); + const confirmMessage = 'Are you sure to make friends with:<br /> - ' + notEmptyHosts.join('<br /> - ') this.confirmService.confirm(confirmMessage, 'Make friends').subscribe( res => { - if (res === false) return; + if (res === false) return this.friendService.makeFriends(notEmptyHosts).subscribe( status => { - this.notificationsService.success('Sucess', 'Make friends request sent!'); - this.router.navigate([ '/admin/friends/list' ]); + this.notificationsService.success('Sucess', 'Make friends request sent!') + this.router.navigate([ '/admin/friends/list' ]) }, err => this.notificationsService.error('Error', err.text) - ); + ) } - ); + ) } - private getNotEmptyHosts() { - const notEmptyHosts = []; + private getNotEmptyHosts () { + const notEmptyHosts = [] Object.keys(this.form.value).forEach((hostKey) => { - const host = this.form.value[hostKey]; - if (host !== '') notEmptyHosts.push(host); - }); + const host = this.form.value[hostKey] + if (host !== '') notEmptyHosts.push(host) + }) - return notEmptyHosts; + return notEmptyHosts } - private isHostsUnique(hosts: string[]) { - return hosts.every(host => hosts.indexOf(host) === hosts.lastIndexOf(host)); + 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 index a101b3be5c..978ab3d463 100644 --- a/client/src/app/+admin/friends/friend-add/index.ts +++ b/client/src/app/+admin/friends/friend-add/index.ts @@ -1 +1 @@ -export * from './friend-add.component'; +export * from './friend-add.component' 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 index 525a9fbc38..7bf9d2c6b5 100644 --- a/client/src/app/+admin/friends/friend-list/friend-list.component.ts +++ b/client/src/app/+admin/friends/friend-list/friend-list.component.ts @@ -1,11 +1,11 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' -import { NotificationsService } from 'angular2-notifications'; -import { ServerDataSource } from 'ng2-smart-table'; +import { NotificationsService } from 'angular2-notifications' +import { ServerDataSource } from 'ng2-smart-table' -import { ConfirmService } from '../../../core'; -import { Utils } from '../../../shared'; -import { Friend, FriendService } from '../shared'; +import { ConfirmService } from '../../../core' +import { Utils } from '../../../shared' +import { Friend, FriendService } from '../shared' @Component({ selector: 'my-friend-list', @@ -13,7 +13,7 @@ import { Friend, FriendService } from '../shared'; styleUrls: [ './friend-list.component.scss' ] }) export class FriendListComponent { - friendsSource = null; + friendsSource = null tableSettings = { attr: { class: 'table-hover' @@ -49,36 +49,36 @@ export class FriendListComponent { valuePrepareFunction: Utils.dateToHuman } } - }; + } - constructor( + constructor ( private notificationsService: NotificationsService, private confirmService: ConfirmService, private friendService: FriendService ) { - this.friendsSource = this.friendService.getDataSource(); + this.friendsSource = this.friendService.getDataSource() } - hasFriends() { - return this.friendsSource.count() !== 0; + hasFriends () { + return this.friendsSource.count() !== 0 } - quitFriends() { - const confirmMessage = 'Do you really want to quit your friends? All their videos will be deleted.'; + quitFriends () { + const confirmMessage = 'Do you really want to quit your friends? All their videos will be deleted.' this.confirmService.confirm(confirmMessage, 'Quit friends').subscribe( res => { - if (res === false) return; + if (res === false) return this.friendService.quitFriends().subscribe( status => { - this.notificationsService.success('Sucess', 'Friends left!'); + this.notificationsService.success('Sucess', 'Friends left!') - this.friendsSource.refresh(); + this.friendsSource.refresh() }, err => this.notificationsService.error('Error', err.text) - ); + ) } - ); + ) } } diff --git a/client/src/app/+admin/friends/friend-list/index.ts b/client/src/app/+admin/friends/friend-list/index.ts index 354c978a44..c9cbd2800d 100644 --- a/client/src/app/+admin/friends/friend-list/index.ts +++ b/client/src/app/+admin/friends/friend-list/index.ts @@ -1 +1 @@ -export * from './friend-list.component'; +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 index 5ca29111cb..5ef0aaa030 100644 --- a/client/src/app/+admin/friends/friends.component.ts +++ b/client/src/app/+admin/friends/friends.component.ts @@ -1,8 +1,7 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' @Component({ - template: '<router-outlet></router-outlet>' + template: '<router-outlet></router-outlet>' }) - export class FriendsComponent { } diff --git a/client/src/app/+admin/friends/friends.routes.ts b/client/src/app/+admin/friends/friends.routes.ts index 747066d1fd..615b6f4f7c 100644 --- a/client/src/app/+admin/friends/friends.routes.ts +++ b/client/src/app/+admin/friends/friends.routes.ts @@ -1,37 +1,37 @@ -import { Routes } from '@angular/router'; +import { Routes } from '@angular/router' -import { FriendsComponent } from './friends.component'; -import { FriendAddComponent } from './friend-add'; -import { FriendListComponent } from './friend-list'; +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: { - title: 'Friends list' - } + path: 'friends', + component: FriendsComponent, + children: [ + { + path: '', + redirectTo: 'list', + pathMatch: 'full' + }, + { + path: 'list', + component: FriendListComponent, + data: { + meta: { + title: 'Friends list' } - }, - { - path: 'add', - component: FriendAddComponent, - data: { - meta: { - title: 'Add friends' - } + } + }, + { + path: 'add', + component: FriendAddComponent, + data: { + meta: { + title: 'Add friends' } } - ] - } -]; + } + ] + } +] diff --git a/client/src/app/+admin/friends/index.ts b/client/src/app/+admin/friends/index.ts index dd4df2538e..356dee8e99 100644 --- a/client/src/app/+admin/friends/index.ts +++ b/client/src/app/+admin/friends/index.ts @@ -1,5 +1,5 @@ -export * from './friend-add'; -export * from './friend-list'; -export * from './shared'; -export * from './friends.component'; -export * from './friends.routes'; +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 index f72156d05b..6950405b92 100644 --- a/client/src/app/+admin/friends/shared/friend.model.ts +++ b/client/src/app/+admin/friends/shared/friend.model.ts @@ -1,7 +1,7 @@ export interface Friend { - id: string; - host: string; - score: number; - email: string; - createdAt: Date; + id: string + host: string + score: number + email: string + createdAt: Date } diff --git a/client/src/app/+admin/friends/shared/friend.service.ts b/client/src/app/+admin/friends/shared/friend.service.ts index 6e51c954ff..f4ecd36ad3 100644 --- a/client/src/app/+admin/friends/shared/friend.service.ts +++ b/client/src/app/+admin/friends/shared/friend.service.ts @@ -1,39 +1,39 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/map'; +import { Injectable } from '@angular/core' +import { Observable } from 'rxjs/Observable' +import 'rxjs/add/operator/catch' +import 'rxjs/add/operator/map' -import { ServerDataSource } from 'ng2-smart-table'; +import { ServerDataSource } from 'ng2-smart-table' -import { Friend } from './friend.model'; -import { AuthHttp, RestExtractor, RestDataSource, ResultList } from '../../../shared'; +import { Friend } from './friend.model' +import { AuthHttp, RestExtractor, RestDataSource, ResultList } from '../../../shared' @Injectable() export class FriendService { - private static BASE_FRIEND_URL = API_URL + '/api/v1/pods/'; + private static BASE_FRIEND_URL = API_URL + '/api/v1/pods/' constructor ( private authHttp: AuthHttp, private restExtractor: RestExtractor ) {} - getDataSource() { - return new RestDataSource(this.authHttp, FriendService.BASE_FRIEND_URL); + getDataSource () { + return new RestDataSource(this.authHttp, FriendService.BASE_FRIEND_URL) } - makeFriends(notEmptyHosts) { + 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)); + .catch((res) => this.restExtractor.handleError(res)) } - quitFriends() { + quitFriends () { return this.authHttp.get(FriendService.BASE_FRIEND_URL + 'quitfriends') .map(res => res.status) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } } diff --git a/client/src/app/+admin/friends/shared/index.ts b/client/src/app/+admin/friends/shared/index.ts index 0d671637d1..41aa6edd64 100644 --- a/client/src/app/+admin/friends/shared/index.ts +++ b/client/src/app/+admin/friends/shared/index.ts @@ -1,2 +1,2 @@ -export * from './friend.model'; -export * from './friend.service'; +export * from './friend.model' +export * from './friend.service' diff --git a/client/src/app/+admin/index.ts b/client/src/app/+admin/index.ts index 2f47a3cc30..11e2587c08 100644 --- a/client/src/app/+admin/index.ts +++ b/client/src/app/+admin/index.ts @@ -1,6 +1,6 @@ -export * from './friends'; -export * from './requests'; -export * from './users'; -export * from './admin-routing.module'; -export * from './admin.module'; -export * from './admin.component'; +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 index 236a9ee8fc..d96a893c34 100644 --- a/client/src/app/+admin/requests/index.ts +++ b/client/src/app/+admin/requests/index.ts @@ -1,4 +1,4 @@ -export * from './request-stats'; -export * from './shared'; -export * from './requests.component'; -export * from './requests.routes'; +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 index be3a66f77d..740c401bbf 100644 --- a/client/src/app/+admin/requests/request-stats/index.ts +++ b/client/src/app/+admin/requests/request-stats/index.ts @@ -1 +1 @@ -export * from './request-stats.component'; +export * from './request-stats.component' 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 index 85dd7e4929..cca4926cf2 100644 --- a/client/src/app/+admin/requests/request-stats/request-stats.component.ts +++ b/client/src/app/+admin/requests/request-stats/request-stats.component.ts @@ -1,12 +1,12 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Component, OnInit, OnDestroy } from '@angular/core' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' -import { RequestService, RequestStats } from '../shared'; +import { RequestService, RequestStats } from '../shared' @Component({ - selector: 'my-request-stats', - templateUrl: './request-stats.component.html', + selector: 'my-request-stats', + templateUrl: './request-stats.component.html', styleUrls: [ './request-stats.component.scss' ] }) export class RequestStatsComponent implements OnInit, OnDestroy { @@ -14,70 +14,67 @@ export class RequestStatsComponent implements OnInit, OnDestroy { requestScheduler: 'Basic request scheduler', requestVideoEventScheduler: 'Video events request scheduler', requestVideoQaduScheduler: 'Quick and dirty video updates request scheduler' - }; + } stats: { [ id: string ]: RequestStats } = { requestScheduler: null, requestVideoEventScheduler: null, requestVideoQaduScheduler: null - }; + } private intervals: { [ id: string ]: number } = { requestScheduler: null, requestVideoEventScheduler: null, requestVideoQaduScheduler: null - }; + } private timeouts: { [ id: string ]: number } = { requestScheduler: null, requestVideoEventScheduler: null, requestVideoQaduScheduler: null - }; - + } - constructor( + constructor ( private notificationsService: NotificationsService, private requestService: RequestService - ) { } + ) { } - ngOnInit() { - this.getStats(); - this.runIntervals(); + ngOnInit () { + this.getStats() + this.runIntervals() } - ngOnDestroy() { + ngOnDestroy () { Object.keys(this.stats).forEach(requestSchedulerName => { if (this.intervals[requestSchedulerName] !== null) { - window.clearInterval(this.intervals[requestSchedulerName]); + window.clearInterval(this.intervals[requestSchedulerName]) } if (this.timeouts[requestSchedulerName] !== null) { - window.clearTimeout(this.timeouts[requestSchedulerName]); + window.clearTimeout(this.timeouts[requestSchedulerName]) } - }); + }) } - getStats() { + getStats () { this.requestService.getStats().subscribe( stats => this.stats = stats, err => this.notificationsService.error('Error', err.text) - ); + ) } - private runIntervals() { + private runIntervals () { Object.keys(this.intervals).forEach(requestSchedulerName => { this.intervals[requestSchedulerName] = window.setInterval(() => { - const stats = this.stats[requestSchedulerName]; + const stats = this.stats[requestSchedulerName] - stats.remainingMilliSeconds -= 1000; + stats.remainingMilliSeconds -= 1000 if (stats.remainingMilliSeconds <= 0) { - this.timeouts[requestSchedulerName] = window.setTimeout(() => this.getStats(), stats.remainingMilliSeconds + 100); + this.timeouts[requestSchedulerName] = window.setTimeout(() => this.getStats(), stats.remainingMilliSeconds + 100) } - }, 1000); - }); + }, 1000) + }) } - - } diff --git a/client/src/app/+admin/requests/requests.component.ts b/client/src/app/+admin/requests/requests.component.ts index 471112b45b..88a90fa4e7 100644 --- a/client/src/app/+admin/requests/requests.component.ts +++ b/client/src/app/+admin/requests/requests.component.ts @@ -1,8 +1,7 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' @Component({ - template: '<router-outlet></router-outlet>' + 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 index 251dd0da81..84db3fea88 100644 --- a/client/src/app/+admin/requests/requests.routes.ts +++ b/client/src/app/+admin/requests/requests.routes.ts @@ -1,27 +1,27 @@ -import { Routes } from '@angular/router'; +import { Routes } from '@angular/router' -import { RequestsComponent } from './requests.component'; -import { RequestStatsComponent } from './request-stats'; +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: { - title: 'Request stats' - } + path: 'requests', + component: RequestsComponent, + children: [ + { + path: '', + redirectTo: 'stats', + pathMatch: 'full' + }, + { + path: 'stats', + component: RequestStatsComponent, + data: { + meta: { + title: 'Request stats' } } - ] - } -]; + } + ] + } +] diff --git a/client/src/app/+admin/requests/shared/index.ts b/client/src/app/+admin/requests/shared/index.ts index 32ab5767be..2442e810ad 100644 --- a/client/src/app/+admin/requests/shared/index.ts +++ b/client/src/app/+admin/requests/shared/index.ts @@ -1,2 +1,2 @@ -export * from './request-stats.model'; -export * from './request.service'; +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 index f658c46826..31550b5c08 100644 --- a/client/src/app/+admin/requests/shared/request-stats.model.ts +++ b/client/src/app/+admin/requests/shared/request-stats.model.ts @@ -1,35 +1,35 @@ export interface Request { - request: any; - to: any; + request: any + to: any } export class RequestStats { - requestsLimitPods: number; - requestsLimitPerPod: number; - milliSecondsInterval: number; - remainingMilliSeconds: number; - totalRequests: number; + requestsLimitPods: number + requestsLimitPerPod: number + milliSecondsInterval: number + remainingMilliSeconds: number + totalRequests: number - constructor(hash: { + constructor (hash: { requestsLimitPods: number, requestsLimitPerPod: number, milliSecondsInterval: number, remainingMilliSeconds: number, - totalRequests: number; + totalRequests: number }) { - this.requestsLimitPods = hash.requestsLimitPods; - this.requestsLimitPerPod = hash.requestsLimitPerPod; - this.milliSecondsInterval = hash.milliSecondsInterval; - this.remainingMilliSeconds = hash.remainingMilliSeconds; - this.totalRequests = hash.totalRequests; + 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 remainingSeconds () { + return Math.floor(this.remainingMilliSeconds / 1000) } - get secondsInterval() { - return Math.floor(this.milliSecondsInterval / 1000); + get secondsInterva () { + 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 index 0872ba0b85..faa6b93832 100644 --- a/client/src/app/+admin/requests/shared/request.service.ts +++ b/client/src/app/+admin/requests/shared/request.service.ts @@ -1,34 +1,34 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/map'; +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'; +import { RequestStats } from './request-stats.model' +import { AuthHttp, RestExtractor } from '../../../shared' @Injectable() export class RequestService { - private static BASE_REQUEST_URL = API_URL + '/api/v1/requests/'; + private static BASE_REQUEST_URL = API_URL + '/api/v1/requests/' constructor ( private authHttp: AuthHttp, private restExtractor: RestExtractor ) {} - getStats(): Observable<{ [ id: string ]: RequestStats }> { + getStats (): Observable<{ [ id: string ]: RequestStats }> { return this.authHttp.get(RequestService.BASE_REQUEST_URL + 'stats') .map(this.restExtractor.extractDataGet) .map(this.buildRequestObjects) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - private buildRequestObjects(data: any) { - const requestSchedulers = {}; + private buildRequestObjects (data: any) { + const requestSchedulers = {} Object.keys(data).forEach(requestSchedulerName => { - requestSchedulers[requestSchedulerName] = new RequestStats(data[requestSchedulerName]); - }); + requestSchedulers[requestSchedulerName] = new RequestStats(data[requestSchedulerName]) + }) - return requestSchedulers; + return requestSchedulers } } diff --git a/client/src/app/+admin/users/index.ts b/client/src/app/+admin/users/index.ts index e98a81f620..cef2c282cb 100644 --- a/client/src/app/+admin/users/index.ts +++ b/client/src/app/+admin/users/index.ts @@ -1,5 +1,5 @@ -export * from './shared'; -export * from './user-add'; -export * from './user-list'; -export * from './users.component'; -export * from './users.routes'; +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 index e17ee5c7ac..1f1302dc5e 100644 --- a/client/src/app/+admin/users/shared/index.ts +++ b/client/src/app/+admin/users/shared/index.ts @@ -1 +1 @@ -export * from './user.service'; +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 index 9c7176d39f..d52993a29e 100644 --- a/client/src/app/+admin/users/shared/user.service.ts +++ b/client/src/app/+admin/users/shared/user.service.ts @@ -1,35 +1,35 @@ -import { Injectable } from '@angular/core'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/map'; +import { Injectable } from '@angular/core' +import 'rxjs/add/operator/catch' +import 'rxjs/add/operator/map' -import { AuthHttp, RestExtractor, RestDataSource, User } from '../../../shared'; +import { AuthHttp, RestExtractor, RestDataSource, User } from '../../../shared' @Injectable() export class UserService { - private static BASE_USERS_URL = API_URL + '/api/v1/users/'; + private static BASE_USERS_URL = API_URL + '/api/v1/users/' - constructor( + constructor ( private authHttp: AuthHttp, private restExtractor: RestExtractor ) {} - addUser(username: string, password: string, email: string) { + addUser (username: string, password: string, email: string) { const body = { username, email, password - }; + } return this.authHttp.post(UserService.BASE_USERS_URL, body) .map(this.restExtractor.extractDataBool) - .catch(this.restExtractor.handleError); + .catch(this.restExtractor.handleError) } - getDataSource() { - return new RestDataSource(this.authHttp, UserService.BASE_USERS_URL); + getDataSource () { + return new RestDataSource(this.authHttp, UserService.BASE_USERS_URL) } - removeUser(user: User) { - return this.authHttp.delete(UserService.BASE_USERS_URL + user.id); + removeUser (user: User) { + return this.authHttp.delete(UserService.BASE_USERS_URL + user.id) } } diff --git a/client/src/app/+admin/users/user-add/index.ts b/client/src/app/+admin/users/user-add/index.ts index 66d5ca04f1..3a46541016 100644 --- a/client/src/app/+admin/users/user-add/index.ts +++ b/client/src/app/+admin/users/user-add/index.ts @@ -1 +1 @@ -export * from './user-add.component'; +export * from './user-add.component' 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 index f1d2fde80f..2d25ab4692 100644 --- a/client/src/app/+admin/users/user-add/user-add.component.ts +++ b/client/src/app/+admin/users/user-add/user-add.component.ts @@ -1,71 +1,71 @@ -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; -import { Router } from '@angular/router'; +import { Component, OnInit } from '@angular/core' +import { FormBuilder, FormGroup } from '@angular/forms' +import { Router } from '@angular/router' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' -import { UserService } from '../shared'; +import { UserService } from '../shared' import { FormReactive, USER_USERNAME, USER_EMAIL, USER_PASSWORD -} from '../../../shared'; +} from '../../../shared' @Component({ selector: 'my-user-add', templateUrl: './user-add.component.html' }) export class UserAddComponent extends FormReactive implements OnInit { - error: string = null; + error: string = null - form: FormGroup; + form: FormGroup formErrors = { 'username': '', 'email': '', 'password': '' - }; + } validationMessages = { 'username': USER_USERNAME.MESSAGES, 'email': USER_EMAIL.MESSAGES, - 'password': USER_PASSWORD.MESSAGES, - }; + 'password': USER_PASSWORD.MESSAGES + } - constructor( + constructor ( private formBuilder: FormBuilder, private router: Router, private notificationsService: NotificationsService, private userService: UserService ) { - super(); + super() } - buildForm() { + buildForm () { this.form = this.formBuilder.group({ username: [ '', USER_USERNAME.VALIDATORS ], email: [ '', USER_EMAIL.VALIDATORS ], - password: [ '', USER_PASSWORD.VALIDATORS ], - }); + password: [ '', USER_PASSWORD.VALIDATORS ] + }) - this.form.valueChanges.subscribe(data => this.onValueChanged(data)); + this.form.valueChanges.subscribe(data => this.onValueChanged(data)) } - ngOnInit() { - this.buildForm(); + ngOnInit () { + this.buildForm() } - addUser() { - this.error = null; + addUser () { + this.error = null - const { username, password, email } = this.form.value; + const { username, password, email } = this.form.value this.userService.addUser(username, password, email).subscribe( () => { - this.notificationsService.success('Success', `User ${username} created.`); - this.router.navigate([ '/admin/users/list' ]); + this.notificationsService.success('Success', `User ${username} created.`) + 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 index 51fbefa808..1826a4abee 100644 --- a/client/src/app/+admin/users/user-list/index.ts +++ b/client/src/app/+admin/users/user-list/index.ts @@ -1 +1 @@ -export * from './user-list.component'; +export * from './user-list.component' 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 index 69ae4353d9..b6fb0ed99f 100644 --- a/client/src/app/+admin/users/user-list/user-list.component.ts +++ b/client/src/app/+admin/users/user-list/user-list.component.ts @@ -1,10 +1,10 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' -import { ConfirmService } from '../../../core'; -import { User, Utils } from '../../../shared'; -import { UserService } from '../shared'; +import { ConfirmService } from '../../../core' +import { User, Utils } from '../../../shared' +import { UserService } from '../shared' @Component({ selector: 'my-user-list', @@ -12,7 +12,7 @@ import { UserService } from '../shared'; styleUrls: [ './user-list.component.scss' ] }) export class UserListComponent { - usersSource = null; + usersSource = null tableSettings = { mode: 'external', attr: { @@ -52,37 +52,37 @@ export class UserListComponent { valuePrepareFunction: Utils.dateToHuman } } - }; + } - constructor( + constructor ( private notificationsService: NotificationsService, private confirmService: ConfirmService, private userService: UserService ) { - this.usersSource = this.userService.getDataSource(); + this.usersSource = this.userService.getDataSource() } - removeUser({ data }) { - const user: User = data; + removeUser ({ data }) { + const user: User = data if (user.username === 'root') { - this.notificationsService.error('Error', 'You cannot delete root.'); - return; + this.notificationsService.error('Error', 'You cannot delete root.') + return } this.confirmService.confirm('Do you really want to delete this user?', 'Delete').subscribe( res => { - if (res === false) return; + if (res === false) return this.userService.removeUser(user).subscribe( () => { - this.notificationsService.success('Success', `User ${user.username} deleted.`); - this.usersSource.refresh(); + this.notificationsService.success('Success', `User ${user.username} deleted.`) + this.usersSource.refresh() }, err => this.notificationsService.error('Error', err.text) - ); + ) } - ); + ) } } diff --git a/client/src/app/+admin/users/users.component.ts b/client/src/app/+admin/users/users.component.ts index 91af6c3207..e9c8f6b0d0 100644 --- a/client/src/app/+admin/users/users.component.ts +++ b/client/src/app/+admin/users/users.component.ts @@ -1,8 +1,7 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' @Component({ - template: '<router-outlet></router-outlet>' + template: '<router-outlet></router-outlet>' }) - export class UsersComponent { } diff --git a/client/src/app/+admin/users/users.routes.ts b/client/src/app/+admin/users/users.routes.ts index 21fb192e00..723c5715d9 100644 --- a/client/src/app/+admin/users/users.routes.ts +++ b/client/src/app/+admin/users/users.routes.ts @@ -1,8 +1,8 @@ -import { Routes } from '@angular/router'; +import { Routes } from '@angular/router' -import { UsersComponent } from './users.component'; -import { UserAddComponent } from './user-add'; -import { UserListComponent } from './user-list'; +import { UsersComponent } from './users.component' +import { UserAddComponent } from './user-add' +import { UserListComponent } from './user-list' export const UsersRoutes: Routes = [ { @@ -34,4 +34,4 @@ export const UsersRoutes: Routes = [ } ] } -]; +] diff --git a/client/src/app/+admin/video-abuses/index.ts b/client/src/app/+admin/video-abuses/index.ts index 7f5e65f91f..395fac2e7f 100644 --- a/client/src/app/+admin/video-abuses/index.ts +++ b/client/src/app/+admin/video-abuses/index.ts @@ -1,3 +1,3 @@ -export * from './video-abuse-list'; -export * from './video-abuses.component'; -export * from './video-abuses.routes'; +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 index 3f2ed17141..01c24d860a 100644 --- a/client/src/app/+admin/video-abuses/video-abuse-list/index.ts +++ b/client/src/app/+admin/video-abuses/video-abuse-list/index.ts @@ -1 +1 @@ -export * from './video-abuse-list.component'; +export * from './video-abuse-list.component' 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 index 55d82f7904..60eaebb44d 100644 --- 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 @@ -1,15 +1,15 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' -import { Utils, VideoAbuseService, VideoAbuse } from '../../../shared'; +import { Utils, VideoAbuseService, VideoAbuse } from '../../../shared' @Component({ - selector: 'my-video-abuse-list', - templateUrl: './video-abuse-list.component.html' + selector: 'my-video-abuse-list', + templateUrl: './video-abuse-list.component.html' }) export class VideoAbuseListComponent { - videoAbusesSource = null; + videoAbusesSource = null tableSettings = { mode: 'external', attr: { @@ -54,18 +54,18 @@ export class VideoAbuseListComponent { valuePrepareFunction: Utils.dateToHuman } } - }; + } - constructor( + constructor ( private notificationsService: NotificationsService, private videoAbuseService: VideoAbuseService ) { - this.videoAbusesSource = this.videoAbuseService.getDataSource(); - } + this.videoAbusesSource = this.videoAbuseService.getDataSource() + } - buildVideoLink(videoId: string) { + buildVideoLink (videoId: string) { // TODO: transform to routerLink // https://github.com/akveo/ng2-smart-table/issues/57 - return `<a href="/videos/${videoId}" title="Go to the video">${videoId}</a>`; + return `<a href="/videos/${videoId}" title="Go to the video">${videoId}</a>` } } diff --git a/client/src/app/+admin/video-abuses/video-abuses.component.ts b/client/src/app/+admin/video-abuses/video-abuses.component.ts index 001f27e87f..9dae5c0b64 100644 --- a/client/src/app/+admin/video-abuses/video-abuses.component.ts +++ b/client/src/app/+admin/video-abuses/video-abuses.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' @Component({ template: '<router-outlet></router-outlet>' diff --git a/client/src/app/+admin/video-abuses/video-abuses.routes.ts b/client/src/app/+admin/video-abuses/video-abuses.routes.ts index 1f19d78850..a8c1561cd1 100644 --- a/client/src/app/+admin/video-abuses/video-abuses.routes.ts +++ b/client/src/app/+admin/video-abuses/video-abuses.routes.ts @@ -1,7 +1,7 @@ -import { Routes } from '@angular/router'; +import { Routes } from '@angular/router' -import { VideoAbusesComponent } from './video-abuses.component'; -import { VideoAbuseListComponent } from './video-abuse-list'; +import { VideoAbusesComponent } from './video-abuses.component' +import { VideoAbuseListComponent } from './video-abuse-list' export const VideoAbusesRoutes: Routes = [ { @@ -25,4 +25,4 @@ export const VideoAbusesRoutes: Routes = [ } ] } -]; +] diff --git a/client/src/app/account/account-change-password/account-change-password.component.ts b/client/src/app/account/account-change-password/account-change-password.component.ts index 15dc42d229..ce786cfa3d 100644 --- a/client/src/app/account/account-change-password/account-change-password.component.ts +++ b/client/src/app/account/account-change-password/account-change-password.component.ts @@ -1,10 +1,10 @@ -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; -import { Router } from '@angular/router'; +import { Component, OnInit } from '@angular/core' +import { FormBuilder, FormGroup } from '@angular/forms' +import { Router } from '@angular/router' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' -import { FormReactive, UserService, USER_PASSWORD } from '../../shared'; +import { FormReactive, UserService, USER_PASSWORD } from '../../shared' @Component({ selector: 'my-account-change-password', @@ -12,55 +12,55 @@ import { FormReactive, UserService, USER_PASSWORD } from '../../shared'; }) export class AccountChangePasswordComponent extends FormReactive implements OnInit { - error: string = null; + error: string = null - form: FormGroup; + form: FormGroup formErrors = { 'new-password': '', 'new-confirmed-password': '' - }; + } validationMessages = { 'new-password': USER_PASSWORD.MESSAGES, 'new-confirmed-password': USER_PASSWORD.MESSAGES - }; + } - constructor( + constructor ( private formBuilder: FormBuilder, private router: Router, private notificationsService: NotificationsService, private userService: UserService ) { - super(); + super() } - buildForm() { + buildForm () { this.form = this.formBuilder.group({ 'new-password': [ '', USER_PASSWORD.VALIDATORS ], - 'new-confirmed-password': [ '', USER_PASSWORD.VALIDATORS ], - }); + 'new-confirmed-password': [ '', USER_PASSWORD.VALIDATORS ] + }) - this.form.valueChanges.subscribe(data => this.onValueChanged(data)); + this.form.valueChanges.subscribe(data => this.onValueChanged(data)) } - ngOnInit() { - this.buildForm(); + ngOnInit () { + this.buildForm() } - changePassword() { - const newPassword = this.form.value['new-password']; - const newConfirmedPassword = this.form.value['new-confirmed-password']; + changePassword () { + const newPassword = this.form.value['new-password'] + const newConfirmedPassword = this.form.value['new-confirmed-password'] - this.error = null; + this.error = null if (newPassword !== newConfirmedPassword) { - this.error = 'The new password and the confirmed password do not correspond.'; - return; + this.error = 'The new password and the confirmed password do not correspond.' + return } this.userService.changePassword(newPassword).subscribe( () => this.notificationsService.success('Success', 'Password updated.'), err => this.error = err - ); + ) } } diff --git a/client/src/app/account/account-change-password/index.ts b/client/src/app/account/account-change-password/index.ts index 72a63e48d1..44c330b668 100644 --- a/client/src/app/account/account-change-password/index.ts +++ b/client/src/app/account/account-change-password/index.ts @@ -1 +1 @@ -export * from './account-change-password.component'; +export * from './account-change-password.component' diff --git a/client/src/app/account/account-details/account-details.component.ts b/client/src/app/account/account-details/account-details.component.ts index 30e5b14ee9..d7531cb559 100644 --- a/client/src/app/account/account-details/account-details.component.ts +++ b/client/src/app/account/account-details/account-details.component.ts @@ -1,16 +1,16 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; -import { Router } from '@angular/router'; +import { Component, OnInit, Input } from '@angular/core' +import { FormBuilder, FormGroup } from '@angular/forms' +import { Router } from '@angular/router' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' -import { AuthService } from '../../core'; +import { AuthService } from '../../core' import { FormReactive, User, UserService, USER_PASSWORD -} from '../../shared'; +} from '../../shared' @Component({ selector: 'my-account-details', @@ -18,51 +18,51 @@ import { }) export class AccountDetailsComponent extends FormReactive implements OnInit { - @Input() user: User = null; + @Input() user: User = null - error: string = null; + error: string = null - form: FormGroup; - formErrors = {}; - validationMessages = {}; + form: FormGroup + formErrors = {} + validationMessages = {} - constructor( + constructor ( private authService: AuthService, private formBuilder: FormBuilder, private router: Router, private notificationsService: NotificationsService, private userService: UserService ) { - super(); + super() } - buildForm() { + buildForm () { this.form = this.formBuilder.group({ - displayNSFW: [ this.user.displayNSFW ], - }); + displayNSFW: [ this.user.displayNSFW ] + }) - this.form.valueChanges.subscribe(data => this.onValueChanged(data)); + this.form.valueChanges.subscribe(data => this.onValueChanged(data)) } - ngOnInit() { - this.buildForm(); + ngOnInit () { + this.buildForm() } - updateDetails() { - const displayNSFW = this.form.value['displayNSFW']; + updateDetails () { + const displayNSFW = this.form.value['displayNSFW'] const details = { displayNSFW - }; + } - this.error = null; + this.error = null this.userService.updateDetails(details).subscribe( () => { - this.notificationsService.success('Success', 'Informations updated.'); + this.notificationsService.success('Success', 'Informations updated.') - this.authService.refreshUserInformations(); + this.authService.refreshUserInformations() }, err => this.error = err - ); + ) } } diff --git a/client/src/app/account/account-details/index.ts b/client/src/app/account/account-details/index.ts index 28f644738e..4829f608a9 100644 --- a/client/src/app/account/account-details/index.ts +++ b/client/src/app/account/account-details/index.ts @@ -1 +1 @@ -export * from './account-details.component'; +export * from './account-details.component' diff --git a/client/src/app/account/account-routing.module.ts b/client/src/app/account/account-routing.module.ts index 9004605f35..e9b8f70314 100644 --- a/client/src/app/account/account-routing.module.ts +++ b/client/src/app/account/account-routing.module.ts @@ -1,7 +1,7 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' -import { AccountComponent } from './account.component'; +import { AccountComponent } from './account.component' const accountRoutes: Routes = [ { @@ -13,7 +13,7 @@ const accountRoutes: Routes = [ } } } -]; +] @NgModule({ imports: [ RouterModule.forChild(accountRoutes) ], diff --git a/client/src/app/account/account.component.ts b/client/src/app/account/account.component.ts index 57b3d4ccd4..929934f67a 100644 --- a/client/src/app/account/account.component.ts +++ b/client/src/app/account/account.component.ts @@ -1,16 +1,16 @@ -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; -import { Router } from '@angular/router'; +import { Component, OnInit } from '@angular/core' +import { FormBuilder, FormGroup } from '@angular/forms' +import { Router } from '@angular/router' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' -import { AuthService } from '../core'; +import { AuthService } from '../core' import { FormReactive, User, UserService, USER_PASSWORD -} from '../shared'; +} from '../shared' @Component({ selector: 'my-account', @@ -18,11 +18,11 @@ import { styleUrls: [ './account.component.scss' ] }) export class AccountComponent implements OnInit { - user: User = null; + user: User = null - constructor(private authService: AuthService) {} + constructor (private authService: AuthService) {} - ngOnInit() { - this.user = this.authService.getUser(); + ngOnInit () { + this.user = this.authService.getUser() } } diff --git a/client/src/app/account/account.module.ts b/client/src/app/account/account.module.ts index f6c141ae6a..380e9d2354 100644 --- a/client/src/app/account/account.module.ts +++ b/client/src/app/account/account.module.ts @@ -1,11 +1,11 @@ -import { NgModule } from '@angular/core'; +import { NgModule } from '@angular/core' -import { AccountRoutingModule } from './account-routing.module'; -import { AccountComponent } from './account.component'; -import { AccountChangePasswordComponent } from './account-change-password'; -import { AccountDetailsComponent } from './account-details'; -import { AccountService } from './account.service'; -import { SharedModule } from '../shared'; +import { AccountRoutingModule } from './account-routing.module' +import { AccountComponent } from './account.component' +import { AccountChangePasswordComponent } from './account-change-password' +import { AccountDetailsComponent } from './account-details' +import { AccountService } from './account.service' +import { SharedModule } from '../shared' @NgModule({ imports: [ diff --git a/client/src/app/account/index.ts b/client/src/app/account/index.ts index 9265fa10ad..dc56ffdbdd 100644 --- a/client/src/app/account/index.ts +++ b/client/src/app/account/index.ts @@ -1,3 +1,3 @@ -export * from './account-routing.module'; -export * from './account.component'; -export * from './account.module'; +export * from './account-routing.module' +export * from './account.component' +export * from './account.module' diff --git a/client/src/app/app-routing.module.ts b/client/src/app/app-routing.module.ts index f9465dc9c4..8036c52e6a 100644 --- a/client/src/app/app-routing.module.ts +++ b/client/src/app/app-routing.module.ts @@ -1,5 +1,5 @@ -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; +import { NgModule } from '@angular/core' +import { Routes, RouterModule } from '@angular/router' const routes: Routes = [ { @@ -11,11 +11,10 @@ const routes: Routes = [ path: 'admin', loadChildren: './+admin#AdminModule' } -]; +] @NgModule({ imports: [ RouterModule.forRoot(routes) ], exports: [ RouterModule ] }) export class AppRoutingModule {} - diff --git a/client/src/app/app.component.ts b/client/src/app/app.component.ts index b8b7321695..a90654e269 100644 --- a/client/src/app/app.component.ts +++ b/client/src/app/app.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit, ViewContainerRef } from '@angular/core'; -import { Router } from '@angular/router'; +import { Component, OnInit, ViewContainerRef } from '@angular/core' +import { Router } from '@angular/router' -import { AuthService, ConfigService } from './core'; -import { VideoService } from './videos'; -import { UserService } from './shared'; +import { AuthService, ConfigService } from './core' +import { VideoService } from './videos' +import { UserService } from './shared' @Component({ selector: 'my-app', @@ -22,11 +22,11 @@ export class AppComponent implements OnInit { preventDuplicates: false, preventLastDuplicates: 'visible', rtl: false - }; + } - isMenuDisplayed = true; + isMenuDisplayed = true - constructor( + constructor ( private router: Router, private authService: AuthService, private configService: ConfigService, @@ -35,46 +35,46 @@ export class AppComponent implements OnInit { viewContainerRef: ViewContainerRef ) {} - ngOnInit() { + ngOnInit () { if (this.authService.isLoggedIn()) { // The service will automatically redirect to the login page if the token is not valid anymore - this.userService.checkTokenValidity(); + this.userService.checkTokenValidity() } - this.configService.loadConfig(); - this.videoService.loadVideoCategories(); - this.videoService.loadVideoLicences(); - this.videoService.loadVideoLanguages(); + this.configService.loadConfig() + this.videoService.loadVideoCategories() + this.videoService.loadVideoLicences() + this.videoService.loadVideoLanguages() // Do not display menu on small screens if (window.innerWidth < 600) { - this.isMenuDisplayed = false; + this.isMenuDisplayed = false } } - isInAdmin() { - return this.router.url.indexOf('/admin/') !== -1; + isInAdmin () { + return this.router.url.indexOf('/admin/') !== -1 } - toggleMenu() { - this.isMenuDisplayed = !this.isMenuDisplayed; + toggleMenu () { + this.isMenuDisplayed = !this.isMenuDisplayed } - getMainColClasses() { + getMainColClasses () { const colSizes = { md: 10, sm: 9, xs: 9 - }; + } // Take all width is the menu is not displayed if (this.isMenuDisplayed === false) { - Object.keys(colSizes).forEach(col => colSizes[col] = 12); + Object.keys(colSizes).forEach(col => colSizes[col] = 12) } - const classes = [ 'main-col' ]; - Object.keys(colSizes).forEach(col => classes.push(`col-${col}-${colSizes[col]}`)); + const classes = [ 'main-col' ] + Object.keys(colSizes).forEach(col => classes.push(`col-${col}-${colSizes[col]}`)) - return classes; + return classes } } diff --git a/client/src/app/app.module.ts b/client/src/app/app.module.ts index 8a072eaac2..d7c9f65481 100644 --- a/client/src/app/app.module.ts +++ b/client/src/app/app.module.ts @@ -1,29 +1,29 @@ -import { ApplicationRef, NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; +import { ApplicationRef, NgModule } from '@angular/core' +import { BrowserModule } from '@angular/platform-browser' import { removeNgStyles, createNewHosts, createInputTransfer -} from '@angularclass/hmr'; +} from '@angularclass/hmr' -import { MetaModule, MetaLoader, MetaStaticLoader, PageTitlePositioning } from '@nglibs/meta'; +import { MetaModule, MetaLoader, MetaStaticLoader, PageTitlePositioning } from '@nglibs/meta' // TODO: remove, we need this to avoid error in ng2-smart-table -import 'rxjs/add/operator/toPromise'; -import 'bootstrap-loader'; +import 'rxjs/add/operator/toPromise' +import 'bootstrap-loader' -import { ENV_PROVIDERS } from './environment'; -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { AppState, InternalStateType } from './app.service'; +import { ENV_PROVIDERS } from './environment' +import { AppRoutingModule } from './app-routing.module' +import { AppComponent } from './app.component' +import { AppState, InternalStateType } from './app.service' -import { AccountModule } from './account'; -import { CoreModule } from './core'; -import { LoginModule } from './login'; -import { SignupModule } from './signup'; -import { SharedModule } from './shared'; -import { VideosModule } from './videos'; +import { AccountModule } from './account' +import { CoreModule } from './core' +import { LoginModule } from './login' +import { SignupModule } from './signup' +import { SharedModule } from './shared' +import { VideosModule } from './videos' -export function metaFactory(): MetaLoader { +export function metaFactory (): MetaLoader { return new MetaStaticLoader({ pageTitlePositioning: PageTitlePositioning.PrependPageTitle, pageTitleSeparator: ' - ', @@ -32,19 +32,19 @@ export function metaFactory(): MetaLoader { title: 'PeerTube', description: 'PeerTube, a decentralized video streaming platform using P2P (BitTorrent) directly in the web browser' } - }); + }) } type StoreType = { state: InternalStateType, restoreInputValues: () => void, disposeOldHosts: () => void -}; +} // Application wide providers const APP_PROVIDERS = [ AppState -]; +] @NgModule({ bootstrap: [ AppComponent ], @@ -77,59 +77,59 @@ const APP_PROVIDERS = [ ] }) export class AppModule { - constructor( + constructor ( public appRef: ApplicationRef, public appState: AppState ) {} - public hmrOnInit(store: StoreType) { + public hmrOnInit (store: StoreType) { if (!store || !store.state) { - return; + return } - console.log('HMR store', JSON.stringify(store, null, 2)); + console.log('HMR store', JSON.stringify(store, null, 2)) /** * Set state */ - this.appState._state = store.state; + this.appState._state = store.state /** * Set input values */ if ('restoreInputValues' in store) { - let restoreInputValues = store.restoreInputValues; - setTimeout(restoreInputValues); + let restoreInputValues = store.restoreInputValues + setTimeout(restoreInputValues) } - this.appRef.tick(); - delete store.state; - delete store.restoreInputValues; + this.appRef.tick() + delete store.state + delete store.restoreInputValues } - public hmrOnDestroy(store: StoreType) { - const cmpLocation = this.appRef.components.map((cmp) => cmp.location.nativeElement); + public hmrOnDestroy (store: StoreType) { + const cmpLocation = this.appRef.components.map((cmp) => cmp.location.nativeElement) /** * Save state */ - const state = this.appState._state; - store.state = state; + const state = this.appState._state + store.state = state /** * Recreate root elements */ - store.disposeOldHosts = createNewHosts(cmpLocation); + store.disposeOldHosts = createNewHosts(cmpLocation) /** * Save input values */ - store.restoreInputValues = createInputTransfer(); + store.restoreInputValues = createInputTransfer() /** * Remove styles */ - removeNgStyles(); + removeNgStyles() } - public hmrAfterDestroy(store: StoreType) { + public hmrAfterDestroy (store: StoreType) { /** * Display new elements */ - store.disposeOldHosts(); - delete store.disposeOldHosts; + store.disposeOldHosts () + delete store.disposeOldHosts } } diff --git a/client/src/app/app.resolver.ts b/client/src/app/app.resolver.ts index 45774b8d19..bc054e90b8 100644 --- a/client/src/app/app.resolver.ts +++ b/client/src/app/app.resolver.ts @@ -1,12 +1,14 @@ -import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/observable/of'; +/* tslint:disable */ + +import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router' +import { Injectable } from '@angular/core' +import { Observable } from 'rxjs/Observable' +import 'rxjs/add/observable/of' @Injectable() export class DataResolver implements Resolve<any> { public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { - return Observable.of({ res: 'I am data'}); + return Observable.of({ res: 'I am data'}) } } @@ -15,4 +17,4 @@ export class DataResolver implements Resolve<any> { */ export const APP_RESOLVER_PROVIDERS = [ DataResolver -]; +] diff --git a/client/src/app/app.service.ts b/client/src/app/app.service.ts index a7eb880a49..abffc87f19 100644 --- a/client/src/app/app.service.ts +++ b/client/src/app/app.service.ts @@ -1,46 +1,48 @@ -import { Injectable } from '@angular/core'; +/* tslint:disable */ + +import { Injectable } from '@angular/core' export type InternalStateType = { [key: string]: any -}; +} @Injectable() export class AppState { - public _state: InternalStateType = { }; + public _state: InternalStateType = { } /** * Already return a clone of the current state. */ public get state() { - return this._state = this._clone(this._state); + return this._state = this._clone(this._state) } /** * Never allow mutation */ public set state(value) { - throw new Error('do not mutate the `.state` directly'); + throw new Error('do not mutate the `.state` directly') } public get(prop?: any) { /** * Use our state getter for the clone. */ - const state = this.state; - return state.hasOwnProperty(prop) ? state[prop] : state; + const state = this.state + return state.hasOwnProperty(prop) ? state[prop] : state } public set(prop: string, value: any) { /** * Internally mutate our state. */ - return this._state[prop] = value; + return this._state[prop] = value } private _clone(object: InternalStateType) { /** * Simple object clone. */ - return JSON.parse(JSON.stringify( object )); + return JSON.parse(JSON.stringify( object )) } } diff --git a/client/src/app/core/auth/auth-user.model.ts b/client/src/app/core/auth/auth-user.model.ts index 1a31a78342..65c37bcfa6 100644 --- a/client/src/app/core/auth/auth-user.model.ts +++ b/client/src/app/core/auth/auth-user.model.ts @@ -1,6 +1,66 @@ // Do not use the barrel (dependency loop) import { UserRole } from '../../../../../shared/models/user.model' -import { User } from '../../shared/users/user.model'; +import { User } from '../../shared/users/user.model' + +export type TokenOptions = { + accessToken: string + refreshToken: string + tokenType: string +} + +// Private class only used by User +class Tokens { + private static KEYS = { + ACCESS_TOKEN: 'access_token', + REFRESH_TOKEN: 'refresh_token', + TOKEN_TYPE: 'token_type' + } + + accessToken: string + refreshToken: string + tokenType: string + + static load () { + const accessTokenLocalStorage = localStorage.getItem(this.KEYS.ACCESS_TOKEN) + const refreshTokenLocalStorage = localStorage.getItem(this.KEYS.REFRESH_TOKEN) + const tokenTypeLocalStorage = localStorage.getItem(this.KEYS.TOKEN_TYPE) + + if (accessTokenLocalStorage && refreshTokenLocalStorage && tokenTypeLocalStorage) { + return new Tokens({ + accessToken: accessTokenLocalStorage, + refreshToken: refreshTokenLocalStorage, + tokenType: tokenTypeLocalStorage + }) + } + + return null + } + + static flush () { + localStorage.removeItem(this.KEYS.ACCESS_TOKEN) + localStorage.removeItem(this.KEYS.REFRESH_TOKEN) + localStorage.removeItem(this.KEYS.TOKEN_TYPE) + } + + constructor (hash?: TokenOptions) { + if (hash) { + this.accessToken = hash.accessToken + this.refreshToken = hash.refreshToken + + if (hash.tokenType === 'bearer') { + this.tokenType = 'Bearer' + } else { + this.tokenType = hash.tokenType + } + } + } + + save () { + localStorage.setItem(Tokens.KEYS.ACCESS_TOKEN, this.accessToken) + localStorage.setItem(Tokens.KEYS.REFRESH_TOKEN, this.refreshToken) + localStorage.setItem(Tokens.KEYS.TOKEN_TYPE, this.tokenType) + } +} export class AuthUser extends User { private static KEYS = { @@ -9,123 +69,69 @@ export class AuthUser extends User { EMAIL: 'email', USERNAME: 'username', DISPLAY_NSFW: 'display_nsfw' - }; + } - tokens: Tokens; + tokens: Tokens - static load() { - const usernameLocalStorage = localStorage.getItem(this.KEYS.USERNAME); + static load () { + const usernameLocalStorage = localStorage.getItem(this.KEYS.USERNAME) if (usernameLocalStorage) { return new AuthUser( { - id: parseInt(localStorage.getItem(this.KEYS.ID)), + id: parseInt(localStorage.getItem(this.KEYS.ID), 10), username: localStorage.getItem(this.KEYS.USERNAME), email: localStorage.getItem(this.KEYS.EMAIL), role: localStorage.getItem(this.KEYS.ROLE) as UserRole, displayNSFW: localStorage.getItem(this.KEYS.DISPLAY_NSFW) === 'true' }, Tokens.load() - ); + ) } - return null; + return null } - static flush() { - localStorage.removeItem(this.KEYS.USERNAME); - localStorage.removeItem(this.KEYS.ID); - localStorage.removeItem(this.KEYS.ROLE); - localStorage.removeItem(this.KEYS.DISPLAY_NSFW); - Tokens.flush(); + static flush () { + localStorage.removeItem(this.KEYS.USERNAME) + localStorage.removeItem(this.KEYS.ID) + localStorage.removeItem(this.KEYS.ROLE) + localStorage.removeItem(this.KEYS.DISPLAY_NSFW) + Tokens.flush() } - constructor(userHash: { + constructor (userHash: { id: number, username: string, role: UserRole, email: string, displayNSFW: boolean - }, hashTokens: any) { - super(userHash); - this.tokens = new Tokens(hashTokens); - } - - getAccessToken() { - return this.tokens.access_token; - } - - getRefreshToken() { - return this.tokens.refresh_token; - } - - getTokenType() { - return this.tokens.token_type; - } - - refreshTokens(access_token: string, refresh_token: string) { - this.tokens.access_token = access_token; - this.tokens.refresh_token = refresh_token; + }, hashTokens: TokenOptions) { + super(userHash) + this.tokens = new Tokens(hashTokens) } - save() { - localStorage.setItem(AuthUser.KEYS.ID, this.id.toString()); - localStorage.setItem(AuthUser.KEYS.USERNAME, this.username); - localStorage.setItem(AuthUser.KEYS.ROLE, this.role); - localStorage.setItem(AuthUser.KEYS.DISPLAY_NSFW, JSON.stringify(this.displayNSFW)); - this.tokens.save(); + getAccessToken () { + return this.tokens.accessToken } -} - -// Private class only used by User -class Tokens { - private static KEYS = { - ACCESS_TOKEN: 'access_token', - REFRESH_TOKEN: 'refresh_token', - TOKEN_TYPE: 'token_type', - }; - - access_token: string; - refresh_token: string; - token_type: string; - - static load() { - const accessTokenLocalStorage = localStorage.getItem(this.KEYS.ACCESS_TOKEN); - const refreshTokenLocalStorage = localStorage.getItem(this.KEYS.REFRESH_TOKEN); - const tokenTypeLocalStorage = localStorage.getItem(this.KEYS.TOKEN_TYPE); - - if (accessTokenLocalStorage && refreshTokenLocalStorage && tokenTypeLocalStorage) { - return new Tokens({ - access_token: accessTokenLocalStorage, - refresh_token: refreshTokenLocalStorage, - token_type: tokenTypeLocalStorage - }); - } - return null; + getRefreshToken () { + return this.tokens.refreshToken } - static flush() { - localStorage.removeItem(this.KEYS.ACCESS_TOKEN); - localStorage.removeItem(this.KEYS.REFRESH_TOKEN); - localStorage.removeItem(this.KEYS.TOKEN_TYPE); + getTokenType () { + return this.tokens.tokenType } - constructor(hash?: any) { - if (hash) { - this.access_token = hash.access_token; - this.refresh_token = hash.refresh_token; - - if (hash.token_type === 'bearer') { - this.token_type = 'Bearer'; - } else { - this.token_type = hash.token_type; - } - } + refreshTokens (accessToken: string, refreshToken: string) { + this.tokens.accessToken = accessToken + this.tokens.refreshToken = refreshToken } - save() { - localStorage.setItem('access_token', this.access_token); - localStorage.setItem('refresh_token', this.refresh_token); - localStorage.setItem('token_type', this.token_type); + save () { + localStorage.setItem(AuthUser.KEYS.ID, this.id.toString()) + localStorage.setItem(AuthUser.KEYS.USERNAME, this.username) + localStorage.setItem(AuthUser.KEYS.ROLE, this.role) + localStorage.setItem(AuthUser.KEYS.DISPLAY_NSFW, JSON.stringify(this.displayNSFW)) + this.tokens.save() } } diff --git a/client/src/app/core/auth/auth.service.ts b/client/src/app/core/auth/auth.service.ts index 4c75df1ca4..32f7a5503d 100644 --- a/client/src/app/core/auth/auth.service.ts +++ b/client/src/app/core/auth/auth.service.ts @@ -1,40 +1,40 @@ -import { Injectable } from '@angular/core'; -import { Headers, Http, Response, URLSearchParams } from '@angular/http'; -import { Router } from '@angular/router'; -import { Observable } from 'rxjs/Observable'; -import { Subject } from 'rxjs/Subject'; -import 'rxjs/add/operator/map'; -import 'rxjs/add/operator/mergeMap'; -import 'rxjs/add/observable/throw'; - -import { NotificationsService } from 'angular2-notifications'; - -import { AuthStatus } from './auth-status.model'; -import { AuthUser } from './auth-user.model'; +import { Injectable } from '@angular/core' +import { Headers, Http, Response, URLSearchParams } from '@angular/http' +import { Router } from '@angular/router' +import { Observable } from 'rxjs/Observable' +import { Subject } from 'rxjs/Subject' +import 'rxjs/add/operator/map' +import 'rxjs/add/operator/mergeMap' +import 'rxjs/add/observable/throw' + +import { NotificationsService } from 'angular2-notifications' + +import { AuthStatus } from './auth-status.model' +import { AuthUser } from './auth-user.model' // Do not use the barrel (dependency loop) -import { RestExtractor } from '../../shared/rest'; +import { RestExtractor } from '../../shared/rest' @Injectable() export class AuthService { - private static BASE_CLIENT_URL = API_URL + '/api/v1/clients/local'; - private static BASE_TOKEN_URL = API_URL + '/api/v1/users/token'; - private static BASE_USER_INFORMATIONS_URL = API_URL + '/api/v1/users/me'; + private static BASE_CLIENT_URL = API_URL + '/api/v1/clients/local' + private static BASE_TOKEN_URL = API_URL + '/api/v1/users/token' + private static BASE_USER_INFORMATIONS_URL = API_URL + '/api/v1/users/me' - loginChangedSource: Observable<AuthStatus>; + loginChangedSource: Observable<AuthStatus> - private clientId: string; - private clientSecret: string; - private loginChanged: Subject<AuthStatus>; - private user: AuthUser = null; + private clientId: string + private clientSecret: string + private loginChanged: Subject<AuthStatus> + private user: AuthUser = null - constructor( + constructor ( private http: Http, private notificationsService: NotificationsService, private restExtractor: RestExtractor, private router: Router ) { - this.loginChanged = new Subject<AuthStatus>(); - this.loginChangedSource = this.loginChanged.asObservable(); + this.loginChanged = new Subject<AuthStatus>() + this.loginChangedSource = this.loginChanged.asObservable() // Fetch the client_id/client_secret // FIXME: save in local storage? @@ -43,120 +43,120 @@ export class AuthService { .catch((res) => this.restExtractor.handleError(res)) .subscribe( result => { - this.clientId = result.client_id; - this.clientSecret = result.client_secret; - console.log('Client credentials loaded.'); + this.clientId = result.client_id + this.clientSecret = result.client_secret + console.log('Client credentials loaded.') }, error => { - let errorMessage = `Cannot retrieve OAuth Client credentials: ${error.text}. \n`; - errorMessage += 'Ensure you have correctly configured PeerTube (config/ directory), in particular the "webserver" section.'; + let errorMessage = `Cannot retrieve OAuth Client credentials: ${error.text}. \n` + errorMessage += 'Ensure you have correctly configured PeerTube (config/ directory), in particular the "webserver" section.' // We put a bigger timeout // This is an important message - this.notificationsService.error('Error', errorMessage, { timeOut: 7000 }); + this.notificationsService.error('Error', errorMessage, { timeOut: 7000 }) } - ); + ) // Return null if there is nothing to load - this.user = AuthUser.load(); + this.user = AuthUser.load() } - getRefreshToken() { - if (this.user === null) return null; + getRefreshToken () { + if (this.user === null) return null - return this.user.getRefreshToken(); + return this.user.getRefreshToken() } - getRequestHeaderValue() { - return `${this.getTokenType()} ${this.getAccessToken()}`; + getRequestHeaderValue () { + return `${this.getTokenType()} ${this.getAccessToken()}` } - getAccessToken() { - if (this.user === null) return null; + getAccessToken () { + if (this.user === null) return null - return this.user.getAccessToken(); + return this.user.getAccessToken() } - getTokenType() { - if (this.user === null) return null; + getTokenType () { + if (this.user === null) return null - return this.user.getTokenType(); + return this.user.getTokenType() } - getUser(): AuthUser { - return this.user; + getUser () { + return this.user } - isAdmin() { - if (this.user === null) return false; + isAdmin () { + if (this.user === null) return false - return this.user.isAdmin(); + return this.user.isAdmin() } - isLoggedIn() { + isLoggedIn () { if (this.getAccessToken()) { - return true; + return true } else { - return false; + return false } } - login(username: string, password: string) { - let body = new URLSearchParams(); - body.set('client_id', this.clientId); - body.set('client_secret', this.clientSecret); - body.set('response_type', 'code'); - body.set('grant_type', 'password'); - body.set('scope', 'upload'); - body.set('username', username); - body.set('password', password); + login (username: string, password: string) { + let body = new URLSearchParams() + body.set('client_id', this.clientId) + body.set('client_secret', this.clientSecret) + body.set('response_type', 'code') + body.set('grant_type', 'password') + body.set('scope', 'upload') + body.set('username', username) + body.set('password', password) - let headers = new Headers(); - headers.append('Content-Type', 'application/x-www-form-urlencoded'); + let headers = new Headers() + headers.append('Content-Type', 'application/x-www-form-urlencoded') let options = { headers: headers - }; + } return this.http.post(AuthService.BASE_TOKEN_URL, body.toString(), options) .map(this.restExtractor.extractDataGet) .map(res => { - res.username = username; - return res; + res.username = username + return res }) .flatMap(res => this.mergeUserInformations(res)) .map(res => this.handleLogin(res)) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - logout() { + logout () { // TODO: make an HTTP request to revoke the tokens - this.user = null; + this.user = null - AuthUser.flush(); + AuthUser.flush() - this.setStatus(AuthStatus.LoggedOut); + this.setStatus(AuthStatus.LoggedOut) } - refreshAccessToken() { - console.log('Refreshing token...'); + refreshAccessToken () { + console.log('Refreshing token...') - const refreshToken = this.getRefreshToken(); + const refreshToken = this.getRefreshToken() - let body = new URLSearchParams(); - body.set('refresh_token', refreshToken); - body.set('client_id', this.clientId); - body.set('client_secret', this.clientSecret); - body.set('response_type', 'code'); - body.set('grant_type', 'refresh_token'); + let body = new URLSearchParams() + body.set('refresh_token', refreshToken) + body.set('client_id', this.clientId) + body.set('client_secret', this.clientSecret) + body.set('response_type', 'code') + body.set('grant_type', 'refresh_token') - let headers = new Headers(); - headers.append('Content-Type', 'application/x-www-form-urlencoded'); + let headers = new Headers() + headers.append('Content-Type', 'application/x-www-form-urlencoded') let options = { headers: headers - }; + } return this.http.post(AuthService.BASE_TOKEN_URL, body.toString(), options) .map(this.restExtractor.extractDataGet) @@ -164,41 +164,41 @@ export class AuthService { .catch((res: Response) => { // The refresh token is invalid? if (res.status === 400 && res.json() && res.json().error === 'invalid_grant') { - console.error('Cannot refresh token -> logout...'); - this.logout(); - this.router.navigate(['/login']); + console.error('Cannot refresh token -> logout...') + this.logout() + this.router.navigate(['/login']) return Observable.throw({ json: () => '', text: () => 'You need to reconnect.' - }); + }) } - return this.restExtractor.handleError(res); - }); + return this.restExtractor.handleError(res) + }) } - refreshUserInformations() { + refreshUserInformations () { const obj = { access_token: this.user.getAccessToken() - }; + } - this.mergeUserInformations(obj) + this.mergeUserInformations (obj) .subscribe( res => { - this.user.displayNSFW = res.displayNSFW; - this.user.role = res.role; + this.user.displayNSFW = res.displayNSFW + this.user.role = res.role - this.user.save(); + this.user.save() } - ); + ) } - private mergeUserInformations(obj: { access_token: string }) { + private mergeUserInformations (obj: { access_token: string }) { // Do not call authHttp here to avoid circular dependencies headaches - const headers = new Headers(); - headers.set('Authorization', `Bearer ${obj.access_token}`); + const headers = new Headers() + headers.set('Authorization', `Bearer ${obj.access_token}`) return this.http.get(AuthService.BASE_USER_INFORMATIONS_URL, { headers }) .map(res => res.json()) @@ -207,38 +207,38 @@ export class AuthService { id: res.id, role: res.role, displayNSFW: res.displayNSFW - }; + } - return Object.assign(obj, newProperties); + return Object.assign(obj, newProperties) } - ); + ) } private handleLogin (obj: any) { - const id = obj.id; - const username = obj.username; - const role = obj.role; - const email = obj.email; - const displayNSFW = obj.displayNSFW; + const id = obj.id + const username = obj.username + const role = obj.role + const email = obj.email + const displayNSFW = obj.displayNSFW const hashTokens = { - access_token: obj.access_token, - token_type: obj.token_type, - refresh_token: obj.refresh_token - }; + accessToken: obj.access_token, + tokenType: obj.token_type, + refreshToken: obj.refresh_token + } - this.user = new AuthUser({ id, username, role, displayNSFW, email }, hashTokens); - this.user.save(); + this.user = new AuthUser({ id, username, role, displayNSFW, email }, hashTokens) + this.user.save() - this.setStatus(AuthStatus.LoggedIn); + this.setStatus(AuthStatus.LoggedIn) } private handleRefreshToken (obj: any) { - this.user.refreshTokens(obj.access_token, obj.refresh_token); - this.user.save(); + this.user.refreshTokens(obj.access_token, obj.refresh_token) + this.user.save() } - private setStatus(status: AuthStatus) { - this.loginChanged.next(status); + private setStatus (status: AuthStatus) { + this.loginChanged.next(status) } } diff --git a/client/src/app/core/auth/index.ts b/client/src/app/core/auth/index.ts index 67a18cfbbd..8e5caa7ed2 100644 --- a/client/src/app/core/auth/index.ts +++ b/client/src/app/core/auth/index.ts @@ -1,3 +1,3 @@ -export * from './auth-status.model'; -export * from './auth-user.model'; +export * from './auth-status.model' +export * from './auth-user.model' export * from './auth.service' diff --git a/client/src/app/core/config/config.service.ts b/client/src/app/core/config/config.service.ts index 407dca0835..a83ec61d2a 100644 --- a/client/src/app/core/config/config.service.ts +++ b/client/src/app/core/config/config.service.ts @@ -1,11 +1,11 @@ -import { Injectable } from '@angular/core'; -import { Http } from '@angular/http'; +import { Injectable } from '@angular/core' +import { Http } from '@angular/http' -import { RestExtractor } from '../../shared/rest'; +import { RestExtractor } from '../../shared/rest' @Injectable() export class ConfigService { - private static BASE_CONFIG_URL = API_URL + '/api/v1/config/'; + private static BASE_CONFIG_URL = API_URL + '/api/v1/config/' private config: { signup: { @@ -15,22 +15,22 @@ export class ConfigService { signup: { enabled: false } - }; + } - constructor( + constructor ( private http: Http, - private restExtractor: RestExtractor, + private restExtractor: RestExtractor ) {} - loadConfig() { + loadConfig () { this.http.get(ConfigService.BASE_CONFIG_URL) .map(this.restExtractor.extractDataGet) .subscribe(data => { - this.config = data; - }); + this.config = data + }) } - getConfig() { - return this.config; + getConfig () { + return this.config } } diff --git a/client/src/app/core/config/index.ts b/client/src/app/core/config/index.ts index 90392254a8..3724e12f21 100644 --- a/client/src/app/core/config/index.ts +++ b/client/src/app/core/config/index.ts @@ -1 +1 @@ -export * from './config.service'; +export * from './config.service' diff --git a/client/src/app/core/confirm/confirm.component.ts b/client/src/app/core/confirm/confirm.component.ts index ae42ff68ad..066e3fc5fc 100644 --- a/client/src/app/core/confirm/confirm.component.ts +++ b/client/src/app/core/confirm/confirm.component.ts @@ -1,12 +1,12 @@ -import { Component, HostListener, OnInit, ViewChild } from '@angular/core'; +import { Component, HostListener, OnInit, ViewChild } from '@angular/core' -import { ModalDirective } from 'ngx-bootstrap/modal'; +import { ModalDirective } from 'ngx-bootstrap/modal' -import { ConfirmService } from './confirm.service'; +import { ConfirmService } from './confirm.service' export interface ConfigChangedEvent { - columns: { [id: string]: { isDisplayed: boolean }; }; - config: { resultsPerPage: number }; + columns: { [id: string]: { isDisplayed: boolean } } + config: { resultsPerPage: number } } @Component({ @@ -14,48 +14,48 @@ export interface ConfigChangedEvent { templateUrl: './confirm.component.html' }) export class ConfirmComponent implements OnInit { - @ViewChild('confirmModal') confirmModal: ModalDirective; + @ViewChild('confirmModal') confirmModal: ModalDirective - title = ''; - message = ''; + title = '' + message = '' constructor (private confirmService: ConfirmService) { // Empty } - ngOnInit() { + ngOnInit () { this.confirmModal.config = { backdrop: 'static', keyboard: false - }; + } this.confirmService.showConfirm.subscribe( ({ title, message }) => { - this.title = title; - this.message = message; + this.title = title + this.message = message - this.showModal(); + this.showModal() } - ); + ) } @HostListener('keydown.enter') - confirm() { - this.confirmService.confirmResponse.next(true); - this.hideModal(); + confirm () { + this.confirmService.confirmResponse.next(true) + this.hideModal() } @HostListener('keydown.esc') - abort() { - this.confirmService.confirmResponse.next(false); - this.hideModal(); + abort () { + this.confirmService.confirmResponse.next(false) + this.hideModal() } - showModal() { - this.confirmModal.show(); + showModal () { + this.confirmModal.show() } - hideModal() { - this.confirmModal.hide(); + hideModal () { + this.confirmModal.hide() } } diff --git a/client/src/app/core/confirm/confirm.service.ts b/client/src/app/core/confirm/confirm.service.ts index 08127a66ff..f12ff18480 100644 --- a/client/src/app/core/confirm/confirm.service.ts +++ b/client/src/app/core/confirm/confirm.service.ts @@ -1,15 +1,15 @@ -import { Injectable } from '@angular/core'; -import { Subject } from 'rxjs/Subject'; -import 'rxjs/add/operator/first'; +import { Injectable } from '@angular/core' +import { Subject } from 'rxjs/Subject' +import 'rxjs/add/operator/first' @Injectable() export class ConfirmService { - showConfirm = new Subject<{ title, message }>(); - confirmResponse = new Subject<boolean>(); + showConfirm = new Subject<{ title, message }>() + confirmResponse = new Subject<boolean>() - confirm(message = '', title = '') { - this.showConfirm.next({ title, message }); + confirm (message = '', title = '') { + this.showConfirm.next({ title, message }) - return this.confirmResponse.asObservable().first(); + return this.confirmResponse.asObservable().first() } } diff --git a/client/src/app/core/confirm/index.ts b/client/src/app/core/confirm/index.ts index 789e7e5473..44aabfc130 100644 --- a/client/src/app/core/confirm/index.ts +++ b/client/src/app/core/confirm/index.ts @@ -1,2 +1,2 @@ -export * from './confirm.component'; -export * from './confirm.service'; +export * from './confirm.component' +export * from './confirm.service' diff --git a/client/src/app/core/core.module.ts b/client/src/app/core/core.module.ts index 81c8f2da68..382febe5c8 100644 --- a/client/src/app/core/core.module.ts +++ b/client/src/app/core/core.module.ts @@ -1,16 +1,16 @@ -import { NgModule, Optional, SkipSelf } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { HttpModule } from '@angular/http'; -import { RouterModule } from '@angular/router'; +import { NgModule, Optional, SkipSelf } from '@angular/core' +import { CommonModule } from '@angular/common' +import { HttpModule } from '@angular/http' +import { RouterModule } from '@angular/router' -import { SimpleNotificationsModule } from 'angular2-notifications'; -import { ModalModule } from 'ngx-bootstrap/modal'; +import { SimpleNotificationsModule } from 'angular2-notifications' +import { ModalModule } from 'ngx-bootstrap/modal' -import { AuthService } from './auth'; -import { ConfigService } from './config'; -import { ConfirmComponent, ConfirmService } from './confirm'; -import { MenuComponent, MenuAdminComponent } from './menu'; -import { throwIfAlreadyLoaded } from './module-import-guard'; +import { AuthService } from './auth' +import { ConfigService } from './config' +import { ConfirmComponent, ConfirmService } from './confirm' +import { MenuComponent, MenuAdminComponent } from './menu' +import { throwIfAlreadyLoaded } from './module-import-guard' @NgModule({ imports: [ @@ -43,7 +43,7 @@ import { throwIfAlreadyLoaded } from './module-import-guard'; ] }) export class CoreModule { - constructor( @Optional() @SkipSelf() parentModule: CoreModule) { - throwIfAlreadyLoaded(parentModule, 'CoreModule'); + constructor ( @Optional() @SkipSelf() parentModule: CoreModule) { + throwIfAlreadyLoaded(parentModule, 'CoreModule') } } diff --git a/client/src/app/core/index.ts b/client/src/app/core/index.ts index 96b28658b1..01b12ce7e4 100644 --- a/client/src/app/core/index.ts +++ b/client/src/app/core/index.ts @@ -1,5 +1,5 @@ -export * from './auth'; -export * from './config'; -export * from './confirm'; -export * from './menu'; +export * from './auth' +export * from './config' +export * from './confirm' +export * from './menu' export * from './core.module' diff --git a/client/src/app/core/menu/index.ts b/client/src/app/core/menu/index.ts index ff40f26e1a..c905ed20a1 100644 --- a/client/src/app/core/menu/index.ts +++ b/client/src/app/core/menu/index.ts @@ -1,2 +1,2 @@ -export * from './menu.component'; -export * from './menu-admin.component'; +export * from './menu.component' +export * from './menu-admin.component' diff --git a/client/src/app/core/menu/menu-admin.component.ts b/client/src/app/core/menu/menu-admin.component.ts index 236161fce8..f6cc6554cb 100644 --- a/client/src/app/core/menu/menu-admin.component.ts +++ b/client/src/app/core/menu/menu-admin.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' @Component({ selector: 'my-menu-admin', diff --git a/client/src/app/core/menu/menu.component.ts b/client/src/app/core/menu/menu.component.ts index 5ab8bf4644..b725f64a7d 100644 --- a/client/src/app/core/menu/menu.component.ts +++ b/client/src/app/core/menu/menu.component.ts @@ -1,8 +1,8 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; +import { Component, OnInit } from '@angular/core' +import { Router } from '@angular/router' -import { AuthService, AuthStatus } from '../auth'; -import { ConfigService } from '../config'; +import { AuthService, AuthStatus } from '../auth' +import { ConfigService } from '../config' @Component({ selector: 'my-menu', @@ -10,7 +10,7 @@ import { ConfigService } from '../config'; styleUrls: [ './menu.component.scss' ] }) export class MenuComponent implements OnInit { - isLoggedIn: boolean; + isLoggedIn: boolean constructor ( private authService: AuthService, @@ -18,35 +18,35 @@ export class MenuComponent implements OnInit { private router: Router ) {} - ngOnInit() { - this.isLoggedIn = this.authService.isLoggedIn(); + ngOnInit () { + this.isLoggedIn = this.authService.isLoggedIn() this.authService.loginChangedSource.subscribe( status => { if (status === AuthStatus.LoggedIn) { - this.isLoggedIn = true; - console.log('Logged in.'); + this.isLoggedIn = true + console.log('Logged in.') } else if (status === AuthStatus.LoggedOut) { - this.isLoggedIn = false; - console.log('Logged out.'); + this.isLoggedIn = false + console.log('Logged out.') } else { - console.error('Unknown auth status: ' + status); + console.error('Unknown auth status: ' + status) } } - ); + ) } - isRegistrationEnabled() { - return this.configService.getConfig().signup.enabled; + isRegistrationEnabled () { + return this.configService.getConfig().signup.enabled } - isUserAdmin() { - return this.authService.isAdmin(); + isUserAdmin () { + return this.authService.isAdmin() } - logout() { - this.authService.logout(); + logout () { + this.authService.logout() // Redirect to home page - this.router.navigate(['/videos/list']); + this.router.navigate(['/videos/list']) } } diff --git a/client/src/app/core/module-import-guard.ts b/client/src/app/core/module-import-guard.ts index 445640c4ff..32b1d8f193 100644 --- a/client/src/app/core/module-import-guard.ts +++ b/client/src/app/core/module-import-guard.ts @@ -1,5 +1,5 @@ -export function throwIfAlreadyLoaded(parentModule: any, moduleName: string) { +export function throwIfAlreadyLoaded (parentModule: any, moduleName: string) { if (parentModule) { - throw new Error(`${moduleName} has already been loaded. Import Core modules in the AppModule only.`); + throw new Error(`${moduleName} has already been loaded. Import Core modules in the AppModule only.`) } } diff --git a/client/src/app/environment.ts b/client/src/app/environment.ts index 799102d827..dd327a62e4 100644 --- a/client/src/app/environment.ts +++ b/client/src/app/environment.ts @@ -1,3 +1,5 @@ +/* tslint:disable */ + /** * Angular 2 */ diff --git a/client/src/app/index.ts b/client/src/app/index.ts index da53f6aef4..d45dbeff6b 100644 --- a/client/src/app/index.ts +++ b/client/src/app/index.ts @@ -1 +1 @@ -export * from './app.module'; +export * from './app.module' diff --git a/client/src/app/login/index.ts b/client/src/app/login/index.ts index 5639915f7c..f1301d8b51 100644 --- a/client/src/app/login/index.ts +++ b/client/src/app/login/index.ts @@ -1,3 +1,3 @@ -export * from './login-routing.module'; -export * from './login.component'; -export * from './login.module'; +export * from './login-routing.module' +export * from './login.component' +export * from './login.module' diff --git a/client/src/app/login/login-routing.module.ts b/client/src/app/login/login-routing.module.ts index 3719938842..1a91677c02 100644 --- a/client/src/app/login/login-routing.module.ts +++ b/client/src/app/login/login-routing.module.ts @@ -1,7 +1,7 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' -import { LoginComponent } from './login.component'; +import { LoginComponent } from './login.component' const loginRoutes: Routes = [ { @@ -13,7 +13,7 @@ const loginRoutes: Routes = [ } } } -]; +] @NgModule({ imports: [ RouterModule.forChild(loginRoutes) ], diff --git a/client/src/app/login/login.component.ts b/client/src/app/login/login.component.ts index fd4a314ccf..77703a80c1 100644 --- a/client/src/app/login/login.component.ts +++ b/client/src/app/login/login.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; +import { Component, OnInit } from '@angular/core' +import { FormBuilder, FormGroup, Validators } from '@angular/forms' +import { Router } from '@angular/router' -import { AuthService } from '../core'; -import { FormReactive } from '../shared'; +import { AuthService } from '../core' +import { FormReactive } from '../shared' @Component({ selector: 'my-login', @@ -11,60 +11,60 @@ import { FormReactive } from '../shared'; }) export class LoginComponent extends FormReactive implements OnInit { - error: string = null; + error: string = null - form: FormGroup; + form: FormGroup formErrors = { 'username': '', 'password': '' - }; + } validationMessages = { 'username': { - 'required': 'Username is required.', + 'required': 'Username is required.' }, 'password': { 'required': 'Password is required.' } - }; + } - constructor( + constructor ( private authService: AuthService, private formBuilder: FormBuilder, private router: Router ) { - super(); + super() } - buildForm() { + buildForm () { this.form = this.formBuilder.group({ username: [ '', Validators.required ], - password: [ '', Validators.required ], - }); + password: [ '', Validators.required ] + }) - this.form.valueChanges.subscribe(data => this.onValueChanged(data)); + this.form.valueChanges.subscribe(data => this.onValueChanged(data)) } - ngOnInit() { - this.buildForm(); + ngOnInit () { + this.buildForm() } - login() { - this.error = null; + login () { + this.error = null - const { username, password } = this.form.value; + const { username, password } = this.form.value this.authService.login(username, password).subscribe( result => this.router.navigate(['/videos/list']), error => { - console.error(error.json); + console.error(error.json) if (error.json.error === 'invalid_grant') { - this.error = 'Credentials are invalid.'; + this.error = 'Credentials are invalid.' } else { - this.error = `${error.json.error}: ${error.json.error_description}`; + this.error = `${error.json.error}: ${error.json.error_description}` } } - ); + ) } } diff --git a/client/src/app/login/login.module.ts b/client/src/app/login/login.module.ts index 31a723b43e..1de72dbaac 100644 --- a/client/src/app/login/login.module.ts +++ b/client/src/app/login/login.module.ts @@ -1,8 +1,8 @@ -import { NgModule } from '@angular/core'; +import { NgModule } from '@angular/core' -import { LoginRoutingModule } from './login-routing.module'; -import { LoginComponent } from './login.component'; -import { SharedModule } from '../shared'; +import { LoginRoutingModule } from './login-routing.module' +import { LoginComponent } from './login.component' +import { SharedModule } from '../shared' @NgModule({ imports: [ diff --git a/client/src/app/shared/auth/auth-http.service.ts b/client/src/app/shared/auth/auth-http.service.ts index c4114aa023..0fbaab0a84 100644 --- a/client/src/app/shared/auth/auth-http.service.ts +++ b/client/src/app/shared/auth/auth-http.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable } from '@angular/core' import { ConnectionBackend, Headers, @@ -9,79 +9,79 @@ import { RequestOptionsArgs, Response, XHRBackend -} from '@angular/http'; -import { Observable } from 'rxjs/Observable'; +} from '@angular/http' +import { Observable } from 'rxjs/Observable' -import { AuthService } from '../../core'; +import { AuthService } from '../../core' @Injectable() export class AuthHttp extends Http { - constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private authService: AuthService) { - super(backend, defaultOptions); + constructor (backend: ConnectionBackend, defaultOptions: RequestOptions, private authService: AuthService) { + super(backend, defaultOptions) } - request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { - if (!options) options = {}; + request (url: string | Request, options?: RequestOptionsArgs): Observable<Response> { + if (!options) options = {} - options.headers = new Headers(); - this.setAuthorizationHeader(options.headers); + options.headers = new Headers() + this.setAuthorizationHeader(options.headers) return super.request(url, options) .catch((err) => { if (err.status === 401) { - return this.handleTokenExpired(url, options); + return this.handleTokenExpired(url, options) } - return Observable.throw(err); - }); + return Observable.throw(err) + }) } - delete(url: string, options?: RequestOptionsArgs): Observable<Response> { - if (!options) options = {}; - options.method = RequestMethod.Delete; + delete (url: string, options?: RequestOptionsArgs): Observable<Response> { + if (!options) options = {} + options.method = RequestMethod.Delete - return this.request(url, options); + return this.request(url, options) } - get(url: string, options?: RequestOptionsArgs): Observable<Response> { - if (!options) options = {}; - options.method = RequestMethod.Get; + get (url: string, options?: RequestOptionsArgs): Observable<Response> { + if (!options) options = {} + options.method = RequestMethod.Get - return this.request(url, options); + return this.request(url, options) } - post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> { - if (!options) options = {}; - options.method = RequestMethod.Post; - options.body = body; + post (url: string, body: any, options?: RequestOptionsArgs): Observable<Response> { + if (!options) options = {} + options.method = RequestMethod.Post + options.body = body - return this.request(url, options); + return this.request(url, options) } - put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> { - if (!options) options = {}; - options.method = RequestMethod.Put; - options.body = body; + put (url: string, body: any, options?: RequestOptionsArgs): Observable<Response> { + if (!options) options = {} + options.method = RequestMethod.Put + options.body = body - return this.request(url, options); + return this.request(url, options) } - private handleTokenExpired(url: string | Request, options: RequestOptionsArgs) { + private handleTokenExpired (url: string | Request, options: RequestOptionsArgs) { return this.authService.refreshAccessToken() .flatMap(() => { - this.setAuthorizationHeader(options.headers); + this.setAuthorizationHeader(options.headers) - return super.request(url, options); - }); + return super.request(url, options) + }) } - private setAuthorizationHeader(headers: Headers) { - headers.set('Authorization', this.authService.getRequestHeaderValue()); + private setAuthorizationHeader (headers: Headers) { + headers.set('Authorization', this.authService.getRequestHeaderValue()) } } -export function useFactory(backend: XHRBackend, defaultOptions: RequestOptions, authService: AuthService) { - return new AuthHttp(backend, defaultOptions, authService); +export function useFactory (backend: XHRBackend, defaultOptions: RequestOptions, authService: AuthService) { + return new AuthHttp(backend, defaultOptions, authService) } export const AUTH_HTTP_PROVIDERS = [ @@ -89,5 +89,5 @@ export const AUTH_HTTP_PROVIDERS = [ provide: AuthHttp, useFactory, deps: [ XHRBackend, RequestOptions, AuthService ] - }, -]; + } +] diff --git a/client/src/app/shared/auth/index.ts b/client/src/app/shared/auth/index.ts index c488aed695..0f2bfb0d68 100644 --- a/client/src/app/shared/auth/index.ts +++ b/client/src/app/shared/auth/index.ts @@ -1 +1 @@ -export * from './auth-http.service'; +export * from './auth-http.service' diff --git a/client/src/app/shared/forms/form-reactive.ts b/client/src/app/shared/forms/form-reactive.ts index a5732e083a..e7764d0695 100644 --- a/client/src/app/shared/forms/form-reactive.ts +++ b/client/src/app/shared/forms/form-reactive.ts @@ -1,38 +1,38 @@ -import { FormGroup } from '@angular/forms'; +import { FormGroup } from '@angular/forms' export abstract class FormReactive { - abstract form: FormGroup; - abstract formErrors: Object; - abstract validationMessages: Object; + abstract form: FormGroup + abstract formErrors: Object + abstract validationMessages: Object - abstract buildForm(): void; + abstract buildForm (): void - protected onValueChanged(data?: any) { + protected onValueChanged (data?: any) { for (const field in this.formErrors) { // clear previous error message (if any) - this.formErrors[field] = ''; - const control = this.form.get(field); + this.formErrors[field] = '' + const control = this.form.get(field) if (control && control.dirty && !control.valid) { - const messages = this.validationMessages[field]; + const messages = this.validationMessages[field] for (const key in control.errors) { - this.formErrors[field] += messages[key] + ' '; + this.formErrors[field] += messages[key] + ' ' } } } } // Same as onValueChanged but force checking even if the field is not dirty - protected forceCheck() { + protected forceCheck () { for (const field in this.formErrors) { // clear previous error message (if any) - this.formErrors[field] = ''; - const control = this.form.get(field); + this.formErrors[field] = '' + const control = this.form.get(field) if (control && !control.valid) { - const messages = this.validationMessages[field]; + const messages = this.validationMessages[field] for (const key in control.errors) { - this.formErrors[field] += messages[key] + ' '; + this.formErrors[field] += messages[key] + ' ' } } } diff --git a/client/src/app/shared/forms/form-validators/host.validator.ts b/client/src/app/shared/forms/form-validators/host.validator.ts index ec417e0795..03e810fdb9 100644 --- a/client/src/app/shared/forms/form-validators/host.validator.ts +++ b/client/src/app/shared/forms/form-validators/host.validator.ts @@ -1,14 +1,14 @@ -import { FormControl } from '@angular/forms'; +import { FormControl } from '@angular/forms' -export function validateHost(c: FormControl) { +export function validateHost (c: FormControl) { // Thanks to http://stackoverflow.com/a/106223 const HOST_REGEXP = new RegExp( '^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$' - ); + ) return HOST_REGEXP.test(c.value) ? null : { validateHost: { valid: false } - }; + } } diff --git a/client/src/app/shared/forms/form-validators/index.ts b/client/src/app/shared/forms/form-validators/index.ts index ab7c2df319..efe77d4ae4 100644 --- a/client/src/app/shared/forms/form-validators/index.ts +++ b/client/src/app/shared/forms/form-validators/index.ts @@ -1,4 +1,4 @@ -export * from './host.validator'; -export * from './user'; -export * from './video-abuse'; -export * from './video'; +export * from './host.validator' +export * from './user' +export * from './video-abuse' +export * from './video' diff --git a/client/src/app/shared/forms/form-validators/user.ts b/client/src/app/shared/forms/form-validators/user.ts index 259d2b8689..fd316583e9 100644 --- a/client/src/app/shared/forms/form-validators/user.ts +++ b/client/src/app/shared/forms/form-validators/user.ts @@ -1,4 +1,4 @@ -import { Validators } from '@angular/forms'; +import { Validators } from '@angular/forms' export const USER_USERNAME = { VALIDATORS: [ Validators.required, Validators.minLength(3), Validators.maxLength(20) ], @@ -7,18 +7,18 @@ export const USER_USERNAME = { 'minlength': 'Username must be at least 3 characters long.', 'maxlength': 'Username cannot be more than 20 characters long.' } -}; +} export const USER_EMAIL = { VALIDATORS: [ Validators.required, Validators.email ], MESSAGES: { 'required': 'Email is required.', - 'email': 'Email must be valid.', + 'email': 'Email must be valid.' } -}; +} export const USER_PASSWORD = { VALIDATORS: [ Validators.required, Validators.minLength(6) ], MESSAGES: { 'required': 'Password is required.', - 'minlength': 'Password must be at least 6 characters long.', + 'minlength': 'Password must be at least 6 characters long.' } -}; +} diff --git a/client/src/app/shared/forms/form-validators/video-abuse.ts b/client/src/app/shared/forms/form-validators/video-abuse.ts index 94a29a3b7b..3c7f26205f 100644 --- a/client/src/app/shared/forms/form-validators/video-abuse.ts +++ b/client/src/app/shared/forms/form-validators/video-abuse.ts @@ -1,4 +1,4 @@ -import { Validators } from '@angular/forms'; +import { Validators } from '@angular/forms' export const VIDEO_ABUSE_REASON = { VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(300) ], @@ -7,4 +7,4 @@ export const VIDEO_ABUSE_REASON = { 'minlength': 'Report reson must be at least 2 characters long.', 'maxlength': 'Report reson cannot be more than 300 characters long.' } -}; +} diff --git a/client/src/app/shared/forms/form-validators/video.ts b/client/src/app/shared/forms/form-validators/video.ts index f7e4e5e4b1..6542cf8f6e 100644 --- a/client/src/app/shared/forms/form-validators/video.ts +++ b/client/src/app/shared/forms/form-validators/video.ts @@ -1,4 +1,4 @@ -import { Validators } from '@angular/forms'; +import { Validators } from '@angular/forms' export const VIDEO_NAME = { VALIDATORS: [ Validators.required, Validators.minLength(3), Validators.maxLength(50) ], @@ -7,26 +7,26 @@ export const VIDEO_NAME = { 'minlength': 'Video name must be at least 3 characters long.', 'maxlength': 'Video name cannot be more than 50 characters long.' } -}; +} export const VIDEO_CATEGORY = { VALIDATORS: [ Validators.required ], MESSAGES: { 'required': 'Video category is required.' } -}; +} export const VIDEO_LICENCE = { VALIDATORS: [ Validators.required ], MESSAGES: { 'required': 'Video licence is required.' } -}; +} export const VIDEO_LANGUAGE = { VALIDATORS: [ ], MESSAGES: {} -}; +} export const VIDEO_DESCRIPTION = { VALIDATORS: [ Validators.required, Validators.minLength(3), Validators.maxLength(250) ], @@ -35,7 +35,7 @@ export const VIDEO_DESCRIPTION = { 'minlength': 'Video description must be at least 3 characters long.', 'maxlength': 'Video description cannot be more than 250 characters long.' } -}; +} export const VIDEO_TAGS = { VALIDATORS: [ Validators.minLength(2), Validators.maxLength(10) ], @@ -43,4 +43,4 @@ export const VIDEO_TAGS = { 'minlength': 'A tag should be more than 2 characters long.', 'maxlength': 'A tag should be less than 10 characters long.' } -}; +} diff --git a/client/src/app/shared/forms/index.ts b/client/src/app/shared/forms/index.ts index 588ebb4be4..7464bb0222 100644 --- a/client/src/app/shared/forms/index.ts +++ b/client/src/app/shared/forms/index.ts @@ -1,2 +1,2 @@ -export * from './form-validators'; -export * from './form-reactive'; +export * from './form-validators' +export * from './form-reactive' diff --git a/client/src/app/shared/index.ts b/client/src/app/shared/index.ts index 61e8ed5232..212645c519 100644 --- a/client/src/app/shared/index.ts +++ b/client/src/app/shared/index.ts @@ -1,8 +1,8 @@ -export * from './auth'; -export * from './forms'; -export * from './rest'; -export * from './search'; -export * from './users'; -export * from './video-abuse'; -export * from './shared.module'; -export * from './utils'; +export * from './auth' +export * from './forms' +export * from './rest' +export * from './search' +export * from './users' +export * from './video-abuse' +export * from './shared.module' +export * from './utils' diff --git a/client/src/app/shared/rest/index.ts b/client/src/app/shared/rest/index.ts index 3cb123c3b8..e0be155cf7 100644 --- a/client/src/app/shared/rest/index.ts +++ b/client/src/app/shared/rest/index.ts @@ -1,4 +1,4 @@ -export * from './rest-data-source'; -export * from './rest-extractor.service'; -export * from './rest-pagination'; -export * from './rest.service'; +export * from './rest-data-source' +export * from './rest-extractor.service' +export * from './rest-pagination' +export * from './rest.service' diff --git a/client/src/app/shared/rest/rest-data-source.ts b/client/src/app/shared/rest/rest-data-source.ts index 1def38c73a..2ef5d38da8 100644 --- a/client/src/app/shared/rest/rest-data-source.ts +++ b/client/src/app/shared/rest/rest-data-source.ts @@ -1,51 +1,51 @@ -import { Http, RequestOptionsArgs, URLSearchParams, } from '@angular/http'; +import { Http, RequestOptionsArgs, URLSearchParams, Response } from '@angular/http' -import { ServerDataSource } from 'ng2-smart-table'; +import { ServerDataSource } from 'ng2-smart-table' export class RestDataSource extends ServerDataSource { - constructor(http: Http, endpoint: string) { - const options = { - endPoint: endpoint, - sortFieldKey: 'sort', - dataKey: 'data' - }; - - super(http, options); - } - - protected extractTotalFromResponse(res) { - const rawData = res.json(); - return rawData ? parseInt(rawData.total) : 0; + constructor (http: Http, endpoint: string) { + const options = { + endPoint: endpoint, + sortFieldKey: 'sort', + dataKey: 'data' + } + + super(http, options) + } + + protected extractTotalFromResponse (res: Response) { + const rawData = res.json() + return rawData ? parseInt(rawData.total, 10) : 0 } - protected addSortRequestOptions(requestOptions: RequestOptionsArgs) { - let searchParams: URLSearchParams = <URLSearchParams> requestOptions.search; + protected addSortRequestOptions (requestOptions: RequestOptionsArgs) { + const searchParams = requestOptions.search as URLSearchParams if (this.sortConf) { this.sortConf.forEach((fieldConf) => { - const sortPrefix = fieldConf.direction === 'desc' ? '-' : ''; + const sortPrefix = fieldConf.direction === 'desc' ? '-' : '' - searchParams.set(this.conf.sortFieldKey, sortPrefix + fieldConf.field); - }); + searchParams.set(this.conf.sortFieldKey, sortPrefix + fieldConf.field) + }) } - return requestOptions; + return requestOptions } - protected addPagerRequestOptions(requestOptions: RequestOptionsArgs) { - let searchParams: URLSearchParams = <URLSearchParams> requestOptions.search; + protected addPagerRequestOptions (requestOptions: RequestOptionsArgs) { + const searchParams = requestOptions.search as URLSearchParams if (this.pagingConf && this.pagingConf['page'] && this.pagingConf['perPage']) { - const perPage = this.pagingConf['perPage']; - const page = this.pagingConf['page']; + const perPage = this.pagingConf['perPage'] + const page = this.pagingConf['page'] - const start = (page - 1) * perPage; - const count = perPage; + const start = (page - 1) * perPage + const count = perPage - searchParams.set('start', start.toString()); - searchParams.set('count', count.toString()); + searchParams.set('start', start.toString()) + searchParams.set('count', count.toString()) } - return requestOptions; + return requestOptions } } diff --git a/client/src/app/shared/rest/rest-extractor.service.ts b/client/src/app/shared/rest/rest-extractor.service.ts index fcb1598f43..f6a818ec86 100644 --- a/client/src/app/shared/rest/rest-extractor.service.ts +++ b/client/src/app/shared/rest/rest-extractor.service.ts @@ -1,52 +1,52 @@ -import { Injectable } from '@angular/core'; -import { Response } from '@angular/http'; -import { Observable } from 'rxjs/Observable'; +import { Injectable } from '@angular/core' +import { Response } from '@angular/http' +import { Observable } from 'rxjs/Observable' export interface ResultList { - data: any[]; - total: number; + data: any[] + total: number } @Injectable() export class RestExtractor { - constructor () { ; } - - extractDataBool(res: Response) { - return true; + extractDataBool (res: Response) { + return true } - extractDataList(res: Response) { - const body = res.json(); + extractDataList (res: Response) { + const body = res.json() const ret: ResultList = { data: body.data, total: body.total - }; + } - return ret; + return ret } - extractDataGet(res: Response) { - return res.json(); + extractDataGet (res: Response) { + return res.json() } - handleError(res: Response) { - let text = 'Server error: '; - text += res.text(); - let json = ''; + handleError (res: Response) { + let text = 'Server error: ' + text += res.text() + let json = '' try { - json = res.json(); - } catch (err) { ; } + json = res.json() + } catch (err) { + console.error('Cannot get JSON from response.') + } const error = { json, text - }; + } - console.error(error); + console.error(error) - return Observable.throw(error); + return Observable.throw(error) } } diff --git a/client/src/app/shared/rest/rest-pagination.ts b/client/src/app/shared/rest/rest-pagination.ts index 0cfa4f4681..766e7a9e5c 100644 --- a/client/src/app/shared/rest/rest-pagination.ts +++ b/client/src/app/shared/rest/rest-pagination.ts @@ -1,5 +1,5 @@ export interface RestPagination { - currentPage: number; - itemsPerPage: number; - totalItems: number; -}; + currentPage: number + itemsPerPage: number + totalItems: number +} diff --git a/client/src/app/shared/rest/rest.service.ts b/client/src/app/shared/rest/rest.service.ts index 16b47e9574..43dc20b34e 100644 --- a/client/src/app/shared/rest/rest.service.ts +++ b/client/src/app/shared/rest/rest.service.ts @@ -1,27 +1,27 @@ -import { Injectable } from '@angular/core'; -import { URLSearchParams } from '@angular/http'; +import { Injectable } from '@angular/core' +import { URLSearchParams } from '@angular/http' -import { RestPagination } from './rest-pagination'; +import { RestPagination } from './rest-pagination' @Injectable() export class RestService { - buildRestGetParams(pagination?: RestPagination, sort?: string) { - const params = new URLSearchParams(); + buildRestGetParams (pagination?: RestPagination, sort?: string) { + const params = new URLSearchParams() if (pagination) { - const start: number = (pagination.currentPage - 1) * pagination.itemsPerPage; - const count: number = pagination.itemsPerPage; + const start: number = (pagination.currentPage - 1) * pagination.itemsPerPage + const count: number = pagination.itemsPerPage - params.set('start', start.toString()); - params.set('count', count.toString()); + params.set('start', start.toString()) + params.set('count', count.toString()) } if (sort) { - params.set('sort', sort); + params.set('sort', sort) } - return params; + return params } } diff --git a/client/src/app/shared/search/index.ts b/client/src/app/shared/search/index.ts index a897ed0995..d4016cf899 100644 --- a/client/src/app/shared/search/index.ts +++ b/client/src/app/shared/search/index.ts @@ -1,4 +1,4 @@ -export * from './search-field.type'; -export * from './search.component'; -export * from './search.model'; -export * from './search.service'; +export * from './search-field.type' +export * from './search.component' +export * from './search.model' +export * from './search.service' diff --git a/client/src/app/shared/search/search-field.type.ts b/client/src/app/shared/search/search-field.type.ts index 6be584ed15..63557898a9 100644 --- a/client/src/app/shared/search/search-field.type.ts +++ b/client/src/app/shared/search/search-field.type.ts @@ -1 +1 @@ -export type SearchField = "name" | "author" | "host" | "magnetUri" | "tags"; +export type SearchField = 'name' | 'author' | 'host' | 'magnetUri' | 'tags' diff --git a/client/src/app/shared/search/search.component.ts b/client/src/app/shared/search/search.component.ts index 48413b4f23..ecce20666e 100644 --- a/client/src/app/shared/search/search.component.ts +++ b/client/src/app/shared/search/search.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; +import { Component, OnInit } from '@angular/core' +import { Router } from '@angular/router' -import { Search } from './search.model'; -import { SearchField } from './search-field.type'; -import { SearchService } from './search.service'; +import { Search } from './search.model' +import { SearchField } from './search-field.type' +import { SearchService } from './search.service' @Component({ selector: 'my-search', @@ -18,53 +18,53 @@ export class SearchComponent implements OnInit { host: 'Pod Host', magnetUri: 'Magnet URI', tags: 'Tags' - }; + } searchCriterias: Search = { field: 'name', value: '' - }; + } - constructor(private searchService: SearchService, private router: Router) {} + constructor (private searchService: SearchService, private router: Router) {} - ngOnInit() { + ngOnInit () { // Subscribe if the search changed // Usually changed by videos list component this.searchService.updateSearch.subscribe( newSearchCriterias => { // Put a field by default if (!newSearchCriterias.field) { - newSearchCriterias.field = 'name'; + newSearchCriterias.field = 'name' } - this.searchCriterias = newSearchCriterias; + this.searchCriterias = newSearchCriterias } - ); + ) } - get choiceKeys() { - return Object.keys(this.fieldChoices); + get choiceKeys () { + return Object.keys(this.fieldChoices) } - choose($event: MouseEvent, choice: SearchField) { - $event.preventDefault(); - $event.stopPropagation(); + choose ($event: MouseEvent, choice: SearchField) { + $event.preventDefault() + $event.stopPropagation() - this.searchCriterias.field = choice; + this.searchCriterias.field = choice if (this.searchCriterias.value) { - this.doSearch(); + this.doSearch() } } - doSearch() { + doSearch () { if (this.router.url.indexOf('/videos/list') === -1) { - this.router.navigate([ '/videos/list' ]); + this.router.navigate([ '/videos/list' ]) } - this.searchService.searchUpdated.next(this.searchCriterias); + this.searchService.searchUpdated.next(this.searchCriterias) } - getStringChoice(choiceKey: SearchField) { - return this.fieldChoices[choiceKey]; + getStringChoice (choiceKey: SearchField) { + return this.fieldChoices[choiceKey] } } diff --git a/client/src/app/shared/search/search.model.ts b/client/src/app/shared/search/search.model.ts index 932a6566c4..174adf2c6b 100644 --- a/client/src/app/shared/search/search.model.ts +++ b/client/src/app/shared/search/search.model.ts @@ -1,6 +1,6 @@ -import { SearchField } from './search-field.type'; +import { SearchField } from './search-field.type' export interface Search { - field: SearchField; - value: string; + field: SearchField + value: string } diff --git a/client/src/app/shared/search/search.service.ts b/client/src/app/shared/search/search.service.ts index 717a7fa500..0480b46bd8 100644 --- a/client/src/app/shared/search/search.service.ts +++ b/client/src/app/shared/search/search.service.ts @@ -1,18 +1,18 @@ -import { Injectable } from '@angular/core'; -import { Subject } from 'rxjs/Subject'; -import { ReplaySubject } from 'rxjs/ReplaySubject'; +import { Injectable } from '@angular/core' +import { Subject } from 'rxjs/Subject' +import { ReplaySubject } from 'rxjs/ReplaySubject' -import { Search } from './search.model'; +import { Search } from './search.model' // This class is needed to communicate between videos/ and search component // Remove it when we'll be able to subscribe to router changes @Injectable() export class SearchService { - searchUpdated: Subject<Search>; - updateSearch: Subject<Search>; + searchUpdated: Subject<Search> + updateSearch: Subject<Search> - constructor() { - this.updateSearch = new Subject<Search>(); - this.searchUpdated = new ReplaySubject<Search>(1); + constructor () { + this.updateSearch = new Subject<Search>() + this.searchUpdated = new ReplaySubject<Search>(1) } } diff --git a/client/src/app/shared/shared.module.ts b/client/src/app/shared/shared.module.ts index 8ffaf964b6..99b51aa4e6 100644 --- a/client/src/app/shared/shared.module.ts +++ b/client/src/app/shared/shared.module.ts @@ -1,23 +1,23 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { HttpModule } from '@angular/http'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { HttpModule } from '@angular/http' +import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { RouterModule } from '@angular/router' -import { BytesPipe } from 'angular-pipes/src/math/bytes.pipe'; -import { KeysPipe } from 'angular-pipes/src/object/keys.pipe'; -import { BsDropdownModule } from 'ngx-bootstrap/dropdown'; -import { ProgressbarModule } from 'ngx-bootstrap/progressbar'; -import { PaginationModule } from 'ngx-bootstrap/pagination'; -import { ModalModule } from 'ngx-bootstrap/modal'; -import { FileUploadModule } from 'ng2-file-upload/ng2-file-upload'; -import { Ng2SmartTableModule } from 'ng2-smart-table'; +import { BytesPipe } from 'angular-pipes/src/math/bytes.pipe' +import { KeysPipe } from 'angular-pipes/src/object/keys.pipe' +import { BsDropdownModule } from 'ngx-bootstrap/dropdown' +import { ProgressbarModule } from 'ngx-bootstrap/progressbar' +import { PaginationModule } from 'ngx-bootstrap/pagination' +import { ModalModule } from 'ngx-bootstrap/modal' +import { FileUploadModule } from 'ng2-file-upload/ng2-file-upload' +import { Ng2SmartTableModule } from 'ng2-smart-table' -import { AUTH_HTTP_PROVIDERS } from './auth'; -import { RestExtractor, RestService } from './rest'; -import { SearchComponent, SearchService } from './search'; -import { UserService } from './users'; -import { VideoAbuseService } from './video-abuse'; +import { AUTH_HTTP_PROVIDERS } from './auth' +import { RestExtractor, RestService } from './rest' +import { SearchComponent, SearchService } from './search' +import { UserService } from './users' +import { VideoAbuseService } from './video-abuse' @NgModule({ imports: [ diff --git a/client/src/app/shared/users/index.ts b/client/src/app/shared/users/index.ts index ff009e89b4..7b5a67bc78 100644 --- a/client/src/app/shared/users/index.ts +++ b/client/src/app/shared/users/index.ts @@ -1,2 +1,2 @@ -export * from './user.model'; -export * from './user.service'; +export * from './user.model' +export * from './user.service' diff --git a/client/src/app/shared/users/user.model.ts b/client/src/app/shared/users/user.model.ts index d4695ab67e..1c2b481e34 100644 --- a/client/src/app/shared/users/user.model.ts +++ b/client/src/app/shared/users/user.model.ts @@ -1,33 +1,33 @@ -import { User as UserServerModel, UserRole } from '../../../../../shared'; +import { User as UserServerModel, UserRole } from '../../../../../shared' export class User implements UserServerModel { - id: number; - username: string; - email: string; - role: UserRole; - displayNSFW: boolean; - createdAt: Date; + id: number + username: string + email: string + role: UserRole + displayNSFW: boolean + createdAt: Date - constructor(hash: { + constructor (hash: { id: number, username: string, email: string, role: UserRole, displayNSFW?: boolean, - createdAt?: Date, + createdAt?: Date }) { - this.id = hash.id; - this.username = hash.username; - this.email = hash.email; - this.role = hash.role; - this.displayNSFW = hash.displayNSFW; + this.id = hash.id + this.username = hash.username + this.email = hash.email + this.role = hash.role + this.displayNSFW = hash.displayNSFW if (hash.createdAt) { - this.createdAt = hash.createdAt; + this.createdAt = hash.createdAt } } - isAdmin() { - return this.role === 'admin'; + isAdmin () { + return this.role === 'admin' } } diff --git a/client/src/app/shared/users/user.service.ts b/client/src/app/shared/users/user.service.ts index f1265be0a8..e956df5b1c 100644 --- a/client/src/app/shared/users/user.service.ts +++ b/client/src/app/shared/users/user.service.ts @@ -1,58 +1,58 @@ -import { Injectable } from '@angular/core'; -import { Http } from '@angular/http'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/map'; +import { Injectable } from '@angular/core' +import { Http } from '@angular/http' +import 'rxjs/add/operator/catch' +import 'rxjs/add/operator/map' -import { AuthService } from '../../core'; -import { AuthHttp } from '../auth'; -import { RestExtractor } from '../rest'; +import { AuthService } from '../../core' +import { AuthHttp } from '../auth' +import { RestExtractor } from '../rest' @Injectable() export class UserService { - static BASE_USERS_URL = API_URL + '/api/v1/users/'; + static BASE_USERS_URL = API_URL + '/api/v1/users/' - constructor( + constructor ( private http: Http, private authHttp: AuthHttp, private authService: AuthService, private restExtractor: RestExtractor ) {} - checkTokenValidity() { - const url = UserService.BASE_USERS_URL + 'me'; + checkTokenValidity () { + const url = UserService.BASE_USERS_URL + 'me' // AuthHttp will redirect us to the login page if the oken is not valid anymore - this.authHttp.get(url).subscribe(() => { ; }); + this.authHttp.get(url).subscribe() } - changePassword(newPassword: string) { - const url = UserService.BASE_USERS_URL + this.authService.getUser().id; + changePassword (newPassword: string) { + const url = UserService.BASE_USERS_URL + this.authService.getUser().id const body = { password: newPassword - }; + } return this.authHttp.put(url, body) .map(this.restExtractor.extractDataBool) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - updateDetails(details: { displayNSFW: boolean }) { - const url = UserService.BASE_USERS_URL + this.authService.getUser().id; + updateDetails (details: { displayNSFW: boolean }) { + const url = UserService.BASE_USERS_URL + this.authService.getUser().id return this.authHttp.put(url, details) .map(this.restExtractor.extractDataBool) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - signup(username: string, password: string, email: string) { + signup (username: string, password: string, email: string) { const body = { username, email, password - }; + } return this.http.post(UserService.BASE_USERS_URL + 'register', body) .map(this.restExtractor.extractDataBool) - .catch(this.restExtractor.handleError); + .catch(this.restExtractor.handleError) } } diff --git a/client/src/app/shared/utils.ts b/client/src/app/shared/utils.ts index 5ab41fe5a3..832311f892 100644 --- a/client/src/app/shared/utils.ts +++ b/client/src/app/shared/utils.ts @@ -1,12 +1,12 @@ -import { DatePipe } from '@angular/common'; +import { DatePipe } from '@angular/common' export class Utils { - static dateToHuman(date: String) { - return new DatePipe('en').transform(date, 'medium'); + static dateToHuman (date: String) { + return new DatePipe('en').transform(date, 'medium') } - static getRowDeleteButton() { - return '<span class="glyphicon glyphicon-remove glyphicon-black"></span>'; + static getRowDeleteButton () { + return '<span class="glyphicon glyphicon-remove glyphicon-black"></span>' } } diff --git a/client/src/app/shared/video-abuse/index.ts b/client/src/app/shared/video-abuse/index.ts index 563533ba52..7cf24c87df 100644 --- a/client/src/app/shared/video-abuse/index.ts +++ b/client/src/app/shared/video-abuse/index.ts @@ -1,2 +1,2 @@ -export * from './video-abuse.service'; -export * from './video-abuse.model'; +export * from './video-abuse.service' +export * from './video-abuse.model' diff --git a/client/src/app/shared/video-abuse/video-abuse.model.ts b/client/src/app/shared/video-abuse/video-abuse.model.ts index bb0373027d..49c87d6b86 100644 --- a/client/src/app/shared/video-abuse/video-abuse.model.ts +++ b/client/src/app/shared/video-abuse/video-abuse.model.ts @@ -1,8 +1,8 @@ export interface VideoAbuse { - id: string; - reason: string; - reporterPodHost: string; - reporterUsername: string; - videoId: string; - createdAt: Date; + id: string + reason: string + reporterPodHost: string + reporterUsername: string + videoId: string + createdAt: Date } diff --git a/client/src/app/shared/video-abuse/video-abuse.service.ts b/client/src/app/shared/video-abuse/video-abuse.service.ts index da7b2ef8a3..4317f93538 100644 --- a/client/src/app/shared/video-abuse/video-abuse.service.ts +++ b/client/src/app/shared/video-abuse/video-abuse.service.ts @@ -1,42 +1,42 @@ -import { Injectable } from '@angular/core'; -import { Http } from '@angular/http'; -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/map'; +import { Injectable } from '@angular/core' +import { Http } from '@angular/http' +import { Observable } from 'rxjs/Observable' +import 'rxjs/add/operator/catch' +import 'rxjs/add/operator/map' -import { AuthService } from '../core'; -import { AuthHttp } from '../auth'; -import { RestDataSource, RestExtractor, ResultList } from '../rest'; -import { VideoAbuse } from './video-abuse.model'; +import { AuthService } from '../core' +import { AuthHttp } from '../auth' +import { RestDataSource, RestExtractor, ResultList } from '../rest' +import { VideoAbuse } from './video-abuse.model' @Injectable() export class VideoAbuseService { - private static BASE_VIDEO_ABUSE_URL = API_URL + '/api/v1/videos/'; + private static BASE_VIDEO_ABUSE_URL = API_URL + '/api/v1/videos/' - constructor( + constructor ( private authHttp: AuthHttp, private restExtractor: RestExtractor ) {} - getDataSource() { - return new RestDataSource(this.authHttp, VideoAbuseService.BASE_VIDEO_ABUSE_URL + 'abuse'); + getDataSource () { + return new RestDataSource(this.authHttp, VideoAbuseService.BASE_VIDEO_ABUSE_URL + 'abuse') } - reportVideo(id: string, reason: string) { + reportVideo (id: string, reason: string) { const body = { reason - }; - const url = VideoAbuseService.BASE_VIDEO_ABUSE_URL + id + '/abuse'; + } + const url = VideoAbuseService.BASE_VIDEO_ABUSE_URL + id + '/abuse' return this.authHttp.post(url, body) .map(this.restExtractor.extractDataBool) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - private extractVideoAbuses(result: ResultList) { - const videoAbuses: VideoAbuse[] = result.data; - const totalVideoAbuses = result.total; + private extractVideoAbuses (result: ResultList) { + const videoAbuses: VideoAbuse[] = result.data + const totalVideoAbuses = result.total - return { videoAbuses, totalVideoAbuses }; + return { videoAbuses, totalVideoAbuses } } } diff --git a/client/src/app/signup/index.ts b/client/src/app/signup/index.ts index 1f4290ab5e..b0aca97236 100644 --- a/client/src/app/signup/index.ts +++ b/client/src/app/signup/index.ts @@ -1,3 +1,3 @@ -export * from './signup-routing.module'; -export * from './signup.component'; -export * from './signup.module'; +export * from './signup-routing.module' +export * from './signup.component' +export * from './signup.module' diff --git a/client/src/app/signup/signup-routing.module.ts b/client/src/app/signup/signup-routing.module.ts index 367eed90c9..122d6c976f 100644 --- a/client/src/app/signup/signup-routing.module.ts +++ b/client/src/app/signup/signup-routing.module.ts @@ -1,7 +1,7 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' -import { SignupComponent } from './signup.component'; +import { SignupComponent } from './signup.component' const signupRoutes: Routes = [ { @@ -13,7 +13,7 @@ const signupRoutes: Routes = [ } } } -]; +] @NgModule({ imports: [ RouterModule.forChild(signupRoutes) ], diff --git a/client/src/app/signup/signup.component.ts b/client/src/app/signup/signup.component.ts index 85f93793b8..bcbc8ded3b 100644 --- a/client/src/app/signup/signup.component.ts +++ b/client/src/app/signup/signup.component.ts @@ -1,72 +1,72 @@ -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; +import { Component, OnInit } from '@angular/core' +import { FormBuilder, FormGroup, Validators } from '@angular/forms' +import { Router } from '@angular/router' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' -import { AuthService } from '../core'; +import { AuthService } from '../core' import { FormReactive, UserService, USER_USERNAME, USER_EMAIL, USER_PASSWORD -} from '../shared'; +} from '../shared' @Component({ selector: 'my-signup', templateUrl: './signup.component.html' }) export class SignupComponent extends FormReactive implements OnInit { - error: string = null; + error: string = null - form: FormGroup; + form: FormGroup formErrors = { 'username': '', 'email': '', 'password': '' - }; + } validationMessages = { 'username': USER_USERNAME.MESSAGES, 'email': USER_EMAIL.MESSAGES, - 'password': USER_PASSWORD.MESSAGES, - }; + 'password': USER_PASSWORD.MESSAGES + } - constructor( + constructor ( private formBuilder: FormBuilder, private router: Router, private notificationsService: NotificationsService, private userService: UserService ) { - super(); + super() } - buildForm() { + buildForm () { this.form = this.formBuilder.group({ username: [ '', USER_USERNAME.VALIDATORS ], email: [ '', USER_EMAIL.VALIDATORS ], - password: [ '', USER_PASSWORD.VALIDATORS ], - }); + password: [ '', USER_PASSWORD.VALIDATORS ] + }) - this.form.valueChanges.subscribe(data => this.onValueChanged(data)); + this.form.valueChanges.subscribe(data => this.onValueChanged(data)) } - ngOnInit() { - this.buildForm(); + ngOnInit () { + this.buildForm() } - signup() { - this.error = null; + signup () { + this.error = null - const { username, password, email } = this.form.value; + const { username, password, email } = this.form.value this.userService.signup(username, password, email).subscribe( () => { - this.notificationsService.success('Success', `Registration for ${username} complete.`); - this.router.navigate([ '/videos/list' ]); + this.notificationsService.success('Success', `Registration for ${username} complete.`) + this.router.navigate([ '/videos/list' ]) }, err => this.error = err.text - ); + ) } } diff --git a/client/src/app/signup/signup.module.ts b/client/src/app/signup/signup.module.ts index acb7e55155..61560ddcfd 100644 --- a/client/src/app/signup/signup.module.ts +++ b/client/src/app/signup/signup.module.ts @@ -1,8 +1,8 @@ -import { NgModule } from '@angular/core'; +import { NgModule } from '@angular/core' -import { SignupRoutingModule } from './signup-routing.module'; -import { SignupComponent } from './signup.component'; -import { SharedModule } from '../shared'; +import { SignupRoutingModule } from './signup-routing.module' +import { SignupComponent } from './signup.component' +import { SharedModule } from '../shared' @NgModule({ imports: [ diff --git a/client/src/app/videos/index.ts b/client/src/app/videos/index.ts index 5158a23f83..83edcc7586 100644 --- a/client/src/app/videos/index.ts +++ b/client/src/app/videos/index.ts @@ -1,7 +1,7 @@ -export * from './shared'; -export * from './video-edit'; -export * from './video-list'; -export * from './video-watch'; -export * from './videos-routing.module'; -export * from './videos.component'; -export * from './videos.module'; +export * from './shared' +export * from './video-edit' +export * from './video-list' +export * from './video-watch' +export * from './videos-routing.module' +export * from './videos.component' +export * from './videos.module' diff --git a/client/src/app/videos/shared/index.ts b/client/src/app/videos/shared/index.ts index a684910225..0fa14f6417 100644 --- a/client/src/app/videos/shared/index.ts +++ b/client/src/app/videos/shared/index.ts @@ -1,4 +1,4 @@ -export * from './sort-field.type'; -export * from './rate-type.type'; -export * from './video.model'; -export * from './video.service'; +export * from './sort-field.type' +export * from './rate-type.type' +export * from './video.model' +export * from './video.service' diff --git a/client/src/app/videos/shared/rate-type.type.ts b/client/src/app/videos/shared/rate-type.type.ts index 88034d1ff1..20eea3ae53 100644 --- a/client/src/app/videos/shared/rate-type.type.ts +++ b/client/src/app/videos/shared/rate-type.type.ts @@ -1 +1 @@ -export type RateType = 'like' | 'dislike'; +export type RateType = 'like' | 'dislike' diff --git a/client/src/app/videos/shared/sort-field.type.ts b/client/src/app/videos/shared/sort-field.type.ts index 6cc598d8b6..776f360f8d 100644 --- a/client/src/app/videos/shared/sort-field.type.ts +++ b/client/src/app/videos/shared/sort-field.type.ts @@ -2,5 +2,4 @@ export type SortField = 'name' | '-name' | 'duration' | '-duration' | 'createdAt' | '-createdAt' | 'views' | '-views' - | 'likes' | '-likes'; - + | 'likes' | '-likes' diff --git a/client/src/app/videos/shared/video.model.ts b/client/src/app/videos/shared/video.model.ts index e897eb1750..f5e16fc13f 100644 --- a/client/src/app/videos/shared/video.model.ts +++ b/client/src/app/videos/shared/video.model.ts @@ -1,56 +1,56 @@ -import { Video as VideoServerModel } from '../../../../../shared'; -import { User } from '../../shared'; +import { Video as VideoServerModel } from '../../../../../shared' +import { User } from '../../shared' export class Video implements VideoServerModel { - author: string; - by: string; - createdAt: Date; - categoryLabel: string; - category: number; - licenceLabel: string; - licence: number; - languageLabel: string; - language: number; - description: string; - duration: number; - durationLabel: string; - id: string; - isLocal: boolean; - magnetUri: string; - name: string; - podHost: string; - tags: string[]; - thumbnailPath: string; - thumbnailUrl: string; - views: number; - likes: number; - dislikes: number; - nsfw: boolean; + author: string + by: string + createdAt: Date + categoryLabel: string + category: number + licenceLabel: string + licence: number + languageLabel: string + language: number + description: string + duration: number + durationLabel: string + id: string + isLocal: boolean + magnetUri: string + name: string + podHost: string + tags: string[] + thumbnailPath: string + thumbnailUrl: string + views: number + likes: number + dislikes: number + nsfw: boolean - private static createByString(author: string, podHost: string) { - return author + '@' + podHost; + private static createByString (author: string, podHost: string) { + return author + '@' + podHost } - private static createDurationString(duration: number) { - const minutes = Math.floor(duration / 60); - const seconds = duration % 60; - const minutes_padding = minutes >= 10 ? '' : '0'; - const seconds_padding = seconds >= 10 ? '' : '0'; + private static createDurationString (duration: number) { + const minutes = Math.floor(duration / 60) + const seconds = duration % 60 + const minutesPadding = minutes >= 10 ? '' : '0' + const secondsPadding = seconds >= 10 ? '' : '0' - return minutes_padding + minutes.toString() + ':' + seconds_padding + seconds.toString(); + return minutesPadding + minutes.toString() + ':' + secondsPadding + seconds.toString() } - constructor(hash: { + constructor (hash: { author: string, createdAt: string, categoryLabel: string, category: number, licenceLabel: string, licence: number, - languageLabel: string; - language: number; + languageLabel: string + language: number description: string, - duration: number; + duration: number id: string, isLocal: boolean, magnetUri: string, @@ -63,57 +63,57 @@ export class Video implements VideoServerModel { dislikes: number, nsfw: boolean }) { - this.author = hash.author; - this.createdAt = new Date(hash.createdAt); - this.categoryLabel = hash.categoryLabel; - this.category = hash.category; - this.licenceLabel = hash.licenceLabel; - this.licence = hash.licence; - this.languageLabel = hash.languageLabel; - this.language = hash.language; - this.description = hash.description; - this.duration = hash.duration; - this.durationLabel = Video.createDurationString(hash.duration); - this.id = hash.id; - this.isLocal = hash.isLocal; - this.magnetUri = hash.magnetUri; - this.name = hash.name; - this.podHost = hash.podHost; - this.tags = hash.tags; - this.thumbnailPath = hash.thumbnailPath; - this.thumbnailUrl = API_URL + hash.thumbnailPath; - this.views = hash.views; - this.likes = hash.likes; - this.dislikes = hash.dislikes; - this.nsfw = hash.nsfw; + this.author = hash.author + this.createdAt = new Date(hash.createdAt) + this.categoryLabel = hash.categoryLabel + this.category = hash.category + this.licenceLabel = hash.licenceLabel + this.licence = hash.licence + this.languageLabel = hash.languageLabel + this.language = hash.language + this.description = hash.description + this.duration = hash.duration + this.durationLabel = Video.createDurationString(hash.duration) + this.id = hash.id + this.isLocal = hash.isLocal + this.magnetUri = hash.magnetUri + this.name = hash.name + this.podHost = hash.podHost + this.tags = hash.tags + this.thumbnailPath = hash.thumbnailPath + this.thumbnailUrl = API_URL + hash.thumbnailPath + this.views = hash.views + this.likes = hash.likes + this.dislikes = hash.dislikes + this.nsfw = hash.nsfw - this.by = Video.createByString(hash.author, hash.podHost); + this.by = Video.createByString(hash.author, hash.podHost) } - isRemovableBy(user) { - return user && this.isLocal === true && (this.author === user.username || user.isAdmin() === true); + isRemovableBy (user) { + return user && this.isLocal === true && (this.author === user.username || user.isAdmin() === true) } - isBlackistableBy(user) { - return user && user.isAdmin() === true && this.isLocal === false; + isBlackistableBy (user) { + return user && user.isAdmin() === true && this.isLocal === false } - isUpdatableBy(user) { - return user && this.isLocal === true && user.username === this.author; + isUpdatableBy (user) { + return user && this.isLocal === true && user.username === this.author } - isVideoNSFWForUser(user: User) { + isVideoNSFWForUser (user: User) { // If the video is NSFW and the user is not logged in, or the user does not want to display NSFW videos... - return (this.nsfw && (!user || user.displayNSFW === false)); + return (this.nsfw && (!user || user.displayNSFW === false)) } - patch(values: Object) { + patch (values: Object) { Object.keys(values).forEach((key) => { - this[key] = values[key]; - }); + this[key] = values[key] + }) } - toJSON() { + toJSON () { return { author: this.author, createdAt: this.createdAt, @@ -133,6 +133,6 @@ export class Video implements VideoServerModel { likes: this.likes, dislikes: this.dislikes, nsfw: this.nsfw - }; + } } } diff --git a/client/src/app/videos/shared/video.service.ts b/client/src/app/videos/shared/video.service.ts index a53ea10648..a4e3d16dfc 100644 --- a/client/src/app/videos/shared/video.service.ts +++ b/client/src/app/videos/shared/video.service.ts @@ -1,13 +1,13 @@ -import { Injectable } from '@angular/core'; -import { Http, Headers, RequestOptions } from '@angular/http'; -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/map'; - -import { Search } from '../../shared'; -import { SortField } from './sort-field.type'; -import { RateType } from './rate-type.type'; -import { AuthService } from '../../core'; +import { Injectable } from '@angular/core' +import { Http, Headers, RequestOptions } from '@angular/http' +import { Observable } from 'rxjs/Observable' +import 'rxjs/add/operator/catch' +import 'rxjs/add/operator/map' + +import { Search } from '../../shared' +import { SortField } from './sort-field.type' +import { RateType } from './rate-type.type' +import { AuthService } from '../../core' import { AuthHttp, RestExtractor, @@ -15,18 +15,18 @@ import { RestService, ResultList, UserService -} from '../../shared'; -import { Video } from './video.model'; +} from '../../shared' +import { Video } from './video.model' @Injectable() export class VideoService { - private static BASE_VIDEO_URL = API_URL + '/api/v1/videos/'; + private static BASE_VIDEO_URL = API_URL + '/api/v1/videos/' - videoCategories: Array<{ id: number, label: string }> = []; - videoLicences: Array<{ id: number, label: string }> = []; - videoLanguages: Array<{ id: number, label: string }> = []; + videoCategories: Array<{ id: number, label: string }> = [] + videoLicences: Array<{ id: number, label: string }> = [] + videoLanguages: Array<{ id: number, label: string }> = [] - constructor( + constructor ( private authService: AuthService, private authHttp: AuthHttp, private http: Http, @@ -34,54 +34,54 @@ export class VideoService { private restService: RestService ) {} - loadVideoCategories() { + loadVideoCategories () { return this.http.get(VideoService.BASE_VIDEO_URL + 'categories') .map(this.restExtractor.extractDataGet) .subscribe(data => { Object.keys(data).forEach(categoryKey => { this.videoCategories.push({ - id: parseInt(categoryKey), + id: parseInt(categoryKey, 10), label: data[categoryKey] - }); - }); - }); + }) + }) + }) } - loadVideoLicences() { + loadVideoLicences () { return this.http.get(VideoService.BASE_VIDEO_URL + 'licences') .map(this.restExtractor.extractDataGet) .subscribe(data => { Object.keys(data).forEach(licenceKey => { this.videoLicences.push({ - id: parseInt(licenceKey), + id: parseInt(licenceKey, 10), label: data[licenceKey] - }); - }); - }); + }) + }) + }) } - loadVideoLanguages() { + loadVideoLanguages () { return this.http.get(VideoService.BASE_VIDEO_URL + 'languages') .map(this.restExtractor.extractDataGet) .subscribe(data => { Object.keys(data).forEach(languageKey => { this.videoLanguages.push({ - id: parseInt(languageKey), + id: parseInt(languageKey, 10), label: data[languageKey] - }); - }); - }); + }) + }) + }) } - getVideo(id: string): Observable<Video> { + getVideo (id: string): Observable<Video> { return this.http.get(VideoService.BASE_VIDEO_URL + id) .map(this.restExtractor.extractDataGet) - .map(video_hash => new Video(video_hash)) - .catch((res) => this.restExtractor.handleError(res)); + .map(videoHash => new Video(videoHash)) + .catch((res) => this.restExtractor.handleError(res)) } - updateVideo(video: Video) { - const language = video.language ? video.language : null; + updateVideo (video: Video) { + const language = video.language ? video.language : null const body = { name: video.name, @@ -90,94 +90,94 @@ export class VideoService { language, description: video.description, tags: video.tags - }; + } - const headers = new Headers({ 'Content-Type': 'application/json' }); - const options = new RequestOptions({ headers: headers }); + const headers = new Headers({ 'Content-Type': 'application/json' }) + const options = new RequestOptions({ headers: headers }) return this.authHttp.put(`${VideoService.BASE_VIDEO_URL}/${video.id}`, body, options) .map(this.restExtractor.extractDataBool) - .catch(this.restExtractor.handleError); + .catch(this.restExtractor.handleError) } - getVideos(pagination: RestPagination, sort: SortField) { - const params = this.restService.buildRestGetParams(pagination, sort); + getVideos (pagination: RestPagination, sort: SortField) { + const params = this.restService.buildRestGetParams(pagination, sort) return this.http.get(VideoService.BASE_VIDEO_URL, { search: params }) .map(res => res.json()) .map(this.extractVideos) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - removeVideo(id: string) { + removeVideo (id: string) { return this.authHttp.delete(VideoService.BASE_VIDEO_URL + id) .map(this.restExtractor.extractDataBool) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - searchVideos(search: Search, pagination: RestPagination, sort: SortField) { - const params = this.restService.buildRestGetParams(pagination, sort); + searchVideos (search: Search, pagination: RestPagination, sort: SortField) { + const params = this.restService.buildRestGetParams(pagination, sort) - if (search.field) params.set('field', search.field); + if (search.field) params.set('field', search.field) return this.http.get(VideoService.BASE_VIDEO_URL + 'search/' + encodeURIComponent(search.value), { search: params }) .map(this.restExtractor.extractDataList) .map(this.extractVideos) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - reportVideo(id: string, reason: string) { - const url = VideoService.BASE_VIDEO_URL + id + '/abuse'; + reportVideo (id: string, reason: string) { + const url = VideoService.BASE_VIDEO_URL + id + '/abuse' const body = { reason - }; + } return this.authHttp.post(url, body) .map(this.restExtractor.extractDataBool) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - setVideoLike(id: string) { - return this.setVideoRate(id, 'like'); + setVideoLike (id: string) { + return this.setVideoRate(id, 'like') } - setVideoDislike(id: string) { - return this.setVideoRate(id, 'dislike'); + setVideoDislike (id: string) { + return this.setVideoRate(id, 'dislike') } - getUserVideoRating(id: string) { - const url = UserService.BASE_USERS_URL + '/me/videos/' + id + '/rating'; + getUserVideoRating (id: string) { + const url = UserService.BASE_USERS_URL + '/me/videos/' + id + '/rating' return this.authHttp.get(url) .map(this.restExtractor.extractDataGet) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - blacklistVideo(id: string) { + blacklistVideo (id: string) { return this.authHttp.post(VideoService.BASE_VIDEO_URL + id + '/blacklist', {}) .map(this.restExtractor.extractDataBool) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - private setVideoRate(id: string, rateType: RateType) { - const url = VideoService.BASE_VIDEO_URL + id + '/rate'; + private setVideoRate (id: string, rateType: RateType) { + const url = VideoService.BASE_VIDEO_URL + id + '/rate' const body = { rating: rateType - }; + } return this.authHttp.put(url, body) .map(this.restExtractor.extractDataBool) - .catch((res) => this.restExtractor.handleError(res)); + .catch((res) => this.restExtractor.handleError(res)) } - private extractVideos(result: ResultList) { - const videosJson = result.data; - const totalVideos = result.total; - const videos = []; + private extractVideos (result: ResultList) { + const videosJson = result.data + const totalVideos = result.total + const videos = [] for (const videoJson of videosJson) { - videos.push(new Video(videoJson)); + videos.push(new Video(videoJson)) } - return { videos, totalVideos }; + return { videos, totalVideos } } } diff --git a/client/src/app/videos/video-edit/index.ts b/client/src/app/videos/video-edit/index.ts index 5ce4fb9b1c..3b4a9cb874 100644 --- a/client/src/app/videos/video-edit/index.ts +++ b/client/src/app/videos/video-edit/index.ts @@ -1,2 +1,2 @@ -export * from './video-add.component'; -export * from './video-update.component'; +export * from './video-add.component' +export * from './video-update.component' diff --git a/client/src/app/videos/video-edit/video-add.component.ts b/client/src/app/videos/video-edit/video-add.component.ts index e5eb9a9f42..0653f5ac4a 100644 --- a/client/src/app/videos/video-edit/video-add.component.ts +++ b/client/src/app/videos/video-edit/video-add.component.ts @@ -1,11 +1,11 @@ -import { Component, ElementRef, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; -import { Router } from '@angular/router'; +import { Component, ElementRef, OnInit } from '@angular/core' +import { FormBuilder, FormGroup } from '@angular/forms' +import { Router } from '@angular/router' -import { FileUploader } from 'ng2-file-upload/ng2-file-upload'; -import { NotificationsService } from 'angular2-notifications'; +import { FileUploader } from 'ng2-file-upload/ng2-file-upload' +import { NotificationsService } from 'angular2-notifications' -import { AuthService } from '../../core'; +import { AuthService } from '../../core' import { FormReactive, VIDEO_NAME, @@ -14,8 +14,8 @@ import { VIDEO_LANGUAGE, VIDEO_DESCRIPTION, VIDEO_TAGS -} from '../../shared'; -import { VideoService } from '../shared'; +} from '../../shared' +import { VideoService } from '../shared' @Component({ selector: 'my-videos-add', @@ -24,36 +24,36 @@ import { VideoService } from '../shared'; }) export class VideoAddComponent extends FormReactive implements OnInit { - tags: string[] = []; - uploader: FileUploader; - videoCategories = []; - videoLicences = []; - videoLanguages = []; + tags: string[] = [] + uploader: FileUploader + videoCategories = [] + videoLicences = [] + videoLanguages = [] - tagValidators = VIDEO_TAGS.VALIDATORS; - tagValidatorsMessages = VIDEO_TAGS.MESSAGES; + tagValidators = VIDEO_TAGS.VALIDATORS + tagValidatorsMessages = VIDEO_TAGS.MESSAGES - error: string = null; - form: FormGroup; + error: string = null + form: FormGroup formErrors = { name: '', category: '', licence: '', language: '', description: '' - }; + } validationMessages = { name: VIDEO_NAME.MESSAGES, category: VIDEO_CATEGORY.MESSAGES, licence: VIDEO_LICENCE.MESSAGES, language: VIDEO_LANGUAGE.MESSAGES, description: VIDEO_DESCRIPTION.MESSAGES - }; + } // Special error messages - fileError = ''; + fileError = '' - constructor( + constructor ( private authService: AuthService, private elementRef: ElementRef, private formBuilder: FormBuilder, @@ -61,18 +61,18 @@ export class VideoAddComponent extends FormReactive implements OnInit { private notificationsService: NotificationsService, private videoService: VideoService ) { - super(); + super() } - get filename() { + get filename () { if (this.uploader.queue.length === 0) { - return null; + return null } - return this.uploader.queue[0].file.name; + return this.uploader.queue[0].file.name } - buildForm() { + buildForm () { this.form = this.formBuilder.group({ name: [ '', VIDEO_NAME.VALIDATORS ], nsfw: [ false ], @@ -81,115 +81,106 @@ export class VideoAddComponent extends FormReactive implements OnInit { language: [ '', VIDEO_LANGUAGE.VALIDATORS ], description: [ '', VIDEO_DESCRIPTION.VALIDATORS ], tags: [ ''] - }); + }) - this.form.valueChanges.subscribe(data => this.onValueChanged(data)); + this.form.valueChanges.subscribe(data => this.onValueChanged(data)) } - ngOnInit() { - this.videoCategories = this.videoService.videoCategories; - this.videoLicences = this.videoService.videoLicences; - this.videoLanguages = this.videoService.videoLanguages; + ngOnInit () { + this.videoCategories = this.videoService.videoCategories + this.videoLicences = this.videoService.videoLicences + this.videoLanguages = this.videoService.videoLanguages this.uploader = new FileUploader({ authToken: this.authService.getRequestHeaderValue(), queueLimit: 1, url: API_URL + '/api/v1/videos', removeAfterUpload: true - }); + }) this.uploader.onBuildItemForm = (item, form) => { - const name = this.form.value['name']; - const nsfw = this.form.value['nsfw']; - const category = this.form.value['category']; - const licence = this.form.value['licence']; - const language = this.form.value['language']; - const description = this.form.value['description']; - const tags = this.form.value['tags']; - - form.append('name', name); - form.append('category', category); - form.append('nsfw', nsfw); - form.append('licence', licence); + const name = this.form.value['name'] + const nsfw = this.form.value['nsfw'] + const category = this.form.value['category'] + const licence = this.form.value['licence'] + const language = this.form.value['language'] + const description = this.form.value['description'] + const tags = this.form.value['tags'] + + form.append('name', name) + form.append('category', category) + form.append('nsfw', nsfw) + form.append('licence', licence) // Language is optional if (language) { - form.append('language', language); + form.append('language', language) } - form.append('description', description); + form.append('description', description) for (let i = 0; i < tags.length; i++) { - form.append(`tags[${i}]`, tags[i]); + form.append(`tags[${i}]`, tags[i]) } - }; + } - this.buildForm(); + this.buildForm() } - checkForm() { - this.forceCheck(); + checkForm () { + this.forceCheck() if (this.filename === null) { - this.fileError = 'You did not add a file.'; + this.fileError = 'You did not add a file.' } - return this.form.valid === true && this.fileError === ''; + return this.form.valid === true && this.fileError === '' } - fileChanged() { - this.fileError = ''; + fileChanged () { + this.fileError = '' } - removeFile() { - this.uploader.clearQueue(); + removeFile () { + this.uploader.clearQueue() } - upload() { + upload () { if (this.checkForm() === false) { - return; + return } - const item = this.uploader.queue[0]; + const item = this.uploader.queue[0] // TODO: wait for https://github.com/valor-software/ng2-file-upload/pull/242 - item.alias = 'videofile'; - - // FIXME: remove - // Run detection change for progress bar - const interval = setInterval(() => { ; }, 250); + item.alias = 'videofile' item.onSuccess = () => { - clearInterval(interval); - - console.log('Video uploaded.'); - this.notificationsService.success('Success', 'Video uploaded.'); - + console.log('Video uploaded.') + this.notificationsService.success('Success', 'Video uploaded.') // Print all the videos once it's finished - this.router.navigate(['/videos/list']); - }; + this.router.navigate(['/videos/list']) + } item.onError = (response: string, status: number) => { - clearInterval(interval); - // We need to handle manually these cases beceause we use the FileUpload component if (status === 400) { - this.error = response; + this.error = response } else if (status === 401) { - this.error = 'Access token was expired, refreshing token...'; + this.error = 'Access token was expired, refreshing token...' this.authService.refreshAccessToken().subscribe( () => { // Update the uploader request header - this.uploader.authToken = this.authService.getRequestHeaderValue(); - this.error += ' access token refreshed. Please retry your request.'; + this.uploader.authToken = this.authService.getRequestHeaderValue() + this.error += ' access token refreshed. Please retry your request.' } - ); + ) } else { - this.error = 'Unknow error'; - console.error(this.error); + this.error = 'Unknow error' + console.error(this.error) } - }; + } - this.uploader.uploadAll(); + this.uploader.uploadAll() } } diff --git a/client/src/app/videos/video-edit/video-update.component.ts b/client/src/app/videos/video-edit/video-update.component.ts index 933132cc06..9ee7ca6a8c 100644 --- a/client/src/app/videos/video-edit/video-update.component.ts +++ b/client/src/app/videos/video-edit/video-update.component.ts @@ -1,11 +1,11 @@ -import { Component, ElementRef, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; +import { Component, ElementRef, OnInit } from '@angular/core' +import { FormBuilder, FormGroup } from '@angular/forms' +import { ActivatedRoute, Router } from '@angular/router' -import { FileUploader } from 'ng2-file-upload/ng2-file-upload'; -import { NotificationsService } from 'angular2-notifications'; +import { FileUploader } from 'ng2-file-upload/ng2-file-upload' +import { NotificationsService } from 'angular2-notifications' -import { AuthService } from '../../core'; +import { AuthService } from '../../core' import { FormReactive, VIDEO_NAME, @@ -14,8 +14,8 @@ import { VIDEO_LANGUAGE, VIDEO_DESCRIPTION, VIDEO_TAGS -} from '../../shared'; -import { Video, VideoService } from '../shared'; +} from '../../shared' +import { Video, VideoService } from '../shared' @Component({ selector: 'my-videos-update', @@ -24,35 +24,35 @@ import { Video, VideoService } from '../shared'; }) export class VideoUpdateComponent extends FormReactive implements OnInit { - tags: string[] = []; - videoCategories = []; - videoLicences = []; - videoLanguages = []; - video: Video; + tags: string[] = [] + videoCategories = [] + videoLicences = [] + videoLanguages = [] + video: Video - tagValidators = VIDEO_TAGS.VALIDATORS; - tagValidatorsMessages = VIDEO_TAGS.MESSAGES; + tagValidators = VIDEO_TAGS.VALIDATORS + tagValidatorsMessages = VIDEO_TAGS.MESSAGES - error: string = null; - form: FormGroup; + error: string = null + form: FormGroup formErrors = { name: '', category: '', licence: '', language: '', description: '' - }; + } validationMessages = { name: VIDEO_NAME.MESSAGES, category: VIDEO_CATEGORY.MESSAGES, licence: VIDEO_LICENCE.MESSAGES, language: VIDEO_LANGUAGE.MESSAGES, description: VIDEO_DESCRIPTION.MESSAGES - }; + } - fileError = ''; + fileError = '' - constructor( + constructor ( private authService: AuthService, private elementRef: ElementRef, private formBuilder: FormBuilder, @@ -61,10 +61,10 @@ export class VideoUpdateComponent extends FormReactive implements OnInit { private notificationsService: NotificationsService, private videoService: VideoService ) { - super(); + super() } - buildForm() { + buildForm () { this.form = this.formBuilder.group({ name: [ '', VIDEO_NAME.VALIDATORS ], nsfw: [ false ], @@ -73,60 +73,63 @@ export class VideoUpdateComponent extends FormReactive implements OnInit { language: [ '', VIDEO_LANGUAGE.VALIDATORS ], description: [ '', VIDEO_DESCRIPTION.VALIDATORS ], tags: [ '' ] - }); + }) - this.form.valueChanges.subscribe(data => this.onValueChanged(data)); + this.form.valueChanges.subscribe(data => this.onValueChanged(data)) } - ngOnInit() { - this.buildForm(); + ngOnInit () { + this.buildForm() - this.videoCategories = this.videoService.videoCategories; - this.videoLicences = this.videoService.videoLicences; - this.videoLanguages = this.videoService.videoLanguages; + this.videoCategories = this.videoService.videoCategories + this.videoLicences = this.videoService.videoLicences + this.videoLanguages = this.videoService.videoLanguages - const id = this.route.snapshot.params['id']; + const id = this.route.snapshot.params['id'] this.videoService.getVideo(id) .subscribe( video => { - this.video = video; + this.video = video - this.hydrateFormFromVideo(); + this.hydrateFormFromVideo() }, - err => this.error = 'Cannot fetch video.' - ); + err => { + console.error(err) + this.error = 'Cannot fetch video.' + } + ) } - checkForm() { - this.forceCheck(); + checkForm () { + this.forceCheck() - return this.form.valid; + return this.form.valid } - update() { + update () { if (this.checkForm() === false) { - return; + return } - this.video.patch(this.form.value); + this.video.patch(this.form.value) this.videoService.updateVideo(this.video) .subscribe( () => { - this.notificationsService.success('Success', 'Video updated.'); - this.router.navigate([ '/videos/watch', this.video.id ]); + this.notificationsService.success('Success', 'Video updated.') + this.router.navigate([ '/videos/watch', this.video.id ]) }, err => { - this.error = 'Cannot update the video.'; - console.error(err); + this.error = 'Cannot update the video.' + console.error(err) } - ); + ) } - private hydrateFormFromVideo() { - this.form.patchValue(this.video.toJSON()); + private hydrateFormFromVideo () { + this.form.patchValue(this.video.toJSON()) } } diff --git a/client/src/app/videos/video-list/index.ts b/client/src/app/videos/video-list/index.ts index 71d3b78e6c..a490e6bb56 100644 --- a/client/src/app/videos/video-list/index.ts +++ b/client/src/app/videos/video-list/index.ts @@ -1,4 +1,4 @@ -export * from './loader.component'; -export * from './video-list.component'; -export * from './video-miniature.component'; -export * from './video-sort.component'; +export * from './loader.component' +export * from './video-list.component' +export * from './video-miniature.component' +export * from './video-sort.component' diff --git a/client/src/app/videos/video-list/loader.component.ts b/client/src/app/videos/video-list/loader.component.ts index e72d2f3f3d..e5780e0fa2 100644 --- a/client/src/app/videos/video-list/loader.component.ts +++ b/client/src/app/videos/video-list/loader.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input } from '@angular/core' @Component({ selector: 'my-loader', @@ -7,5 +7,5 @@ import { Component, Input } from '@angular/core'; }) export class LoaderComponent { - @Input() loading: boolean; + @Input() loading: boolean } diff --git a/client/src/app/videos/video-list/video-list.component.html b/client/src/app/videos/video-list/video-list.component.html index f805922798..680fba3f5a 100644 --- a/client/src/app/videos/video-list/video-list.component.html +++ b/client/src/app/videos/video-list/video-list.component.html @@ -17,7 +17,7 @@ <my-video-miniature class="ng-animate" - *ngFor="let video of videos" [video]="video" [user]="user" [currentSort]="sort" (removed)="onRemoved(video)" + *ngFor="let video of videos" [video]="video" [user]="user" [currentSort]="sort" > </my-video-miniature> </div> diff --git a/client/src/app/videos/video-list/video-list.component.ts b/client/src/app/videos/video-list/video-list.component.ts index 16a40bdc4f..0c36e5b089 100644 --- a/client/src/app/videos/video-list/video-list.component.ts +++ b/client/src/app/videos/video-list/video-list.component.ts @@ -1,17 +1,17 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { BehaviorSubject } from 'rxjs/BehaviorSubject' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' import { SortField, Video, VideoService -} from '../shared'; -import { AuthService, AuthUser } from '../../core'; -import { RestPagination, Search, SearchField } from '../../shared'; -import { SearchService } from '../../shared'; +} from '../shared' +import { AuthService, AuthUser } from '../../core' +import { RestPagination, Search, SearchField } from '../../shared' +import { SearchService } from '../../shared' @Component({ selector: 'my-videos-list', @@ -19,21 +19,21 @@ import { SearchService } from '../../shared'; templateUrl: './video-list.component.html' }) export class VideoListComponent implements OnInit, OnDestroy { - loading: BehaviorSubject<boolean> = new BehaviorSubject(false); + loading: BehaviorSubject<boolean> = new BehaviorSubject(false) pagination: RestPagination = { currentPage: 1, itemsPerPage: 25, totalItems: null - }; - sort: SortField; - user: AuthUser = null; - videos: Video[] = []; + } + sort: SortField + user: AuthUser = null + videos: Video[] = [] - private search: Search; - private subActivatedRoute: any; - private subSearch: any; + private search: Search + private subActivatedRoute: any + private subSearch: any - constructor( + constructor ( private notificationsService: NotificationsService, private authService: AuthService, private changeDetector: ChangeDetectorRef, @@ -43,114 +43,114 @@ export class VideoListComponent implements OnInit, OnDestroy { private searchService: SearchService ) {} - ngOnInit() { + ngOnInit () { if (this.authService.isLoggedIn()) { - this.user = AuthUser.load(); + this.user = AuthUser.load() } // Subscribe to route changes this.subActivatedRoute = this.route.params.subscribe(routeParams => { - this.loadRouteParams(routeParams); + this.loadRouteParams(routeParams) // Update the search service component - this.searchService.updateSearch.next(this.search); - this.getVideos(); - }); + this.searchService.updateSearch.next(this.search) + this.getVideos() + }) // Subscribe to search changes this.subSearch = this.searchService.searchUpdated.subscribe(search => { - this.search = search; + this.search = search // Reset pagination - this.pagination.currentPage = 1; + this.pagination.currentPage = 1 - this.navigateToNewParams(); - }); + this.navigateToNewParams() + }) } - ngOnDestroy() { - this.subActivatedRoute.unsubscribe(); - this.subSearch.unsubscribe(); + ngOnDestroy () { + this.subActivatedRoute.unsubscribe() + this.subSearch.unsubscribe() } - getVideos() { - this.loading.next(true); - this.videos = []; + getVideos () { + this.loading.next(true) + this.videos = [] - let observable = null; + let observable = null if (this.search.value) { - observable = this.videoService.searchVideos(this.search, this.pagination, this.sort); + observable = this.videoService.searchVideos(this.search, this.pagination, this.sort) } else { - observable = this.videoService.getVideos(this.pagination, this.sort); + observable = this.videoService.getVideos(this.pagination, this.sort) } observable.subscribe( ({ videos, totalVideos }) => { - this.videos = videos; - this.pagination.totalItems = totalVideos; + this.videos = videos + this.pagination.totalItems = totalVideos - this.loading.next(false); + this.loading.next(false) }, error => this.notificationsService.error('Error', error.text) - ); + ) } - isThereNoVideo() { - return !this.loading.getValue() && this.videos.length === 0; + isThereNoVideo () { + return !this.loading.getValue() && this.videos.length === 0 } - onPageChanged(event: any) { + onPageChanged (event: any) { // Be sure the current page is set - this.pagination.currentPage = event.page; + this.pagination.currentPage = event.page - this.navigateToNewParams(); + this.navigateToNewParams() } - onSort(sort: SortField) { - this.sort = sort; + onSort (sort: SortField) { + this.sort = sort - this.navigateToNewParams(); + this.navigateToNewParams() } - private buildRouteParams() { + private buildRouteParams () { // There is always a sort and a current page const params: any = { sort: this.sort, page: this.pagination.currentPage - }; + } // Maybe there is a search if (this.search.value) { - params.field = this.search.field; - params.search = this.search.value; + params.field = this.search.field + params.search = this.search.value } - return params; + return params } - private loadRouteParams(routeParams) { + private loadRouteParams (routeParams) { if (routeParams['search'] !== undefined) { this.search = { value: routeParams['search'], - field: <SearchField>routeParams['field'] - }; + field: routeParams['field'] as SearchField + } } else { this.search = { value: '', field: 'name' - }; + } } - this.sort = <SortField>routeParams['sort'] || '-createdAt'; + this.sort = routeParams['sort'] as SortField || '-createdAt' if (routeParams['page'] !== undefined) { - this.pagination.currentPage = parseInt(routeParams['page']); + this.pagination.currentPage = parseInt(routeParams['page'], 10) } else { - this.pagination.currentPage = 1; + this.pagination.currentPage = 1 } } - private navigateToNewParams() { - const routeParams = this.buildRouteParams(); - this.router.navigate(['/videos/list', routeParams]); + private navigateToNewParams () { + const routeParams = this.buildRouteParams() + this.router.navigate(['/videos/list', routeParams]) } } diff --git a/client/src/app/videos/video-list/video-miniature.component.ts b/client/src/app/videos/video-list/video-miniature.component.ts index 28601ca7f0..1cfeacf361 100644 --- a/client/src/app/videos/video-list/video-miniature.component.ts +++ b/client/src/app/videos/video-list/video-miniature.component.ts @@ -1,10 +1,10 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { Component, Input, Output, EventEmitter } from '@angular/core' -import { NotificationsService } from 'angular2-notifications'; +import { NotificationsService } from 'angular2-notifications' -import { ConfirmService, ConfigService } from '../../core'; -import { SortField, Video, VideoService } from '../shared'; -import { User } from '../../shared'; +import { ConfirmService, ConfigService } from '../../core' +import { SortField, Video, VideoService } from '../shared' +import { User } from '../../shared' @Component({ selector: 'my-video-miniature', @@ -13,25 +13,26 @@ import { User } from '../../shared'; }) export class VideoMiniatureComponent { - @Input() currentSort: SortField; - @Input() user: User; - @Input() video: Video; + @Input() currentSort: SortField + @Input() user: User + @Input() video: Video - constructor( + constructor ( private notificationsService: NotificationsService, private confirmService: ConfirmService, private configService: ConfigService, private videoService: VideoService ) {} - getVideoName() { - if (this.isVideoNSFWForThisUser()) - return 'NSFW'; + getVideoName () { + if (this.isVideoNSFWForThisUser()) { + return 'NSFW' + } - return this.video.name; + return this.video.name } - isVideoNSFWForThisUser() { - return this.video.isVideoNSFWForUser(this.user); + isVideoNSFWForThisUser () { + return this.video.isVideoNSFWForUser(this.user) } } diff --git a/client/src/app/videos/video-list/video-sort.component.ts b/client/src/app/videos/video-list/video-sort.component.ts index 20979a3950..64916bf166 100644 --- a/client/src/app/videos/video-list/video-sort.component.ts +++ b/client/src/app/videos/video-list/video-sort.component.ts @@ -1,6 +1,6 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core' -import { SortField } from '../shared'; +import { SortField } from '../shared' @Component({ selector: 'my-video-sort', @@ -8,9 +8,9 @@ import { SortField } from '../shared'; }) export class VideoSortComponent { - @Output() sort = new EventEmitter<any>(); + @Output() sort = new EventEmitter<any>() - @Input() currentSort: SortField; + @Input() currentSort: SortField sortChoices: { [ P in SortField ]: string } = { 'name': 'Name - Asc', @@ -23,17 +23,17 @@ export class VideoSortComponent { '-views': 'Views - Desc', 'likes': 'Likes - Asc', '-likes': 'Likes - Desc' - }; + } - get choiceKeys() { - return Object.keys(this.sortChoices); + get choiceKeys () { + return Object.keys(this.sortChoices) } - getStringChoice(choiceKey: SortField) { - return this.sortChoices[choiceKey]; + getStringChoice (choiceKey: SortField) { + return this.sortChoices[choiceKey] } - onSortChange() { - this.sort.emit(this.currentSort); + onSortChange () { + this.sort.emit(this.currentSort) } } diff --git a/client/src/app/videos/video-watch/index.ts b/client/src/app/videos/video-watch/index.ts index ed0ed2fc03..6e35262d30 100644 --- a/client/src/app/videos/video-watch/index.ts +++ b/client/src/app/videos/video-watch/index.ts @@ -1,5 +1,5 @@ -export * from './video-magnet.component'; -export * from './video-share.component'; -export * from './video-report.component'; -export * from './video-watch.component'; -export * from './webtorrent.service'; +export * from './video-magnet.component' +export * from './video-share.component' +export * from './video-report.component' +export * from './video-watch.component' +export * from './webtorrent.service' diff --git a/client/src/app/videos/video-watch/video-magnet.component.ts b/client/src/app/videos/video-watch/video-magnet.component.ts index 894fa45fc4..f9432e92cc 100644 --- a/client/src/app/videos/video-watch/video-magnet.component.ts +++ b/client/src/app/videos/video-watch/video-magnet.component.ts @@ -1,27 +1,27 @@ -import { Component, Input, ViewChild } from '@angular/core'; +import { Component, Input, ViewChild } from '@angular/core' -import { ModalDirective } from 'ngx-bootstrap/modal'; +import { ModalDirective } from 'ngx-bootstrap/modal' -import { Video } from '../shared'; +import { Video } from '../shared' @Component({ selector: 'my-video-magnet', templateUrl: './video-magnet.component.html' }) export class VideoMagnetComponent { - @Input() video: Video = null; + @Input() video: Video = null - @ViewChild('modal') modal: ModalDirective; + @ViewChild('modal') modal: ModalDirective - constructor() { + constructor () { // empty } - show() { - this.modal.show(); + show () { + this.modal.show() } - hide() { - this.modal.hide(); + hide () { + this.modal.hide() } } diff --git a/client/src/app/videos/video-watch/video-report.component.ts b/client/src/app/videos/video-watch/video-report.component.ts index 528005b841..61213cd684 100644 --- a/client/src/app/videos/video-watch/video-report.component.ts +++ b/client/src/app/videos/video-watch/video-report.component.ts @@ -1,69 +1,69 @@ -import { Component, Input, OnInit, ViewChild } from '@angular/core'; -import { FormBuilder, FormGroup } from '@angular/forms'; +import { Component, Input, OnInit, ViewChild } from '@angular/core' +import { FormBuilder, FormGroup } from '@angular/forms' -import { ModalDirective } from 'ngx-bootstrap/modal'; -import { NotificationsService } from 'angular2-notifications'; +import { ModalDirective } from 'ngx-bootstrap/modal' +import { NotificationsService } from 'angular2-notifications' -import { FormReactive, VideoAbuseService, VIDEO_ABUSE_REASON } from '../../shared'; -import { Video, VideoService } from '../shared'; +import { FormReactive, VideoAbuseService, VIDEO_ABUSE_REASON } from '../../shared' +import { Video, VideoService } from '../shared' @Component({ selector: 'my-video-report', templateUrl: './video-report.component.html' }) export class VideoReportComponent extends FormReactive implements OnInit { - @Input() video: Video = null; + @Input() video: Video = null - @ViewChild('modal') modal: ModalDirective; + @ViewChild('modal') modal: ModalDirective - error: string = null; - form: FormGroup; + error: string = null + form: FormGroup formErrors = { reason: '' - }; + } validationMessages = { reason: VIDEO_ABUSE_REASON.MESSAGES - }; + } - constructor( + constructor ( private formBuilder: FormBuilder, private videoAbuseService: VideoAbuseService, private notificationsService: NotificationsService ) { - super(); + super() } - ngOnInit() { - this.buildForm(); + ngOnInit () { + this.buildForm() } - buildForm() { + buildForm () { this.form = this.formBuilder.group({ reason: [ '', VIDEO_ABUSE_REASON.VALIDATORS ] - }); + }) - this.form.valueChanges.subscribe(data => this.onValueChanged(data)); + this.form.valueChanges.subscribe(data => this.onValueChanged(data)) } - show() { - this.modal.show(); + show () { + this.modal.show() } - hide() { - this.modal.hide(); + hide () { + this.modal.hide() } - report() { - const reason = this.form.value['reason']; + report () { + const reason = this.form.value['reason'] this.videoAbuseService.reportVideo(this.video.id, reason) .subscribe( () => { - this.notificationsService.success('Success', 'Video reported.'); - this.hide(); + this.notificationsService.success('Success', 'Video reported.') + this.hide() }, err => this.notificationsService.error('Error', err.text) - ); + ) } } diff --git a/client/src/app/videos/video-watch/video-share.component.ts b/client/src/app/videos/video-watch/video-share.component.ts index aa921afc2c..bbd25f5ef0 100644 --- a/client/src/app/videos/video-watch/video-share.component.ts +++ b/client/src/app/videos/video-watch/video-share.component.ts @@ -1,42 +1,42 @@ -import { Component, Input, ViewChild } from '@angular/core'; +import { Component, Input, ViewChild } from '@angular/core' -import { ModalDirective } from 'ngx-bootstrap/modal'; +import { ModalDirective } from 'ngx-bootstrap/modal' -import { Video } from '../shared'; +import { Video } from '../shared' @Component({ selector: 'my-video-share', templateUrl: './video-share.component.html' }) export class VideoShareComponent { - @Input() video: Video = null; + @Input() video: Video = null - @ViewChild('modal') modal: ModalDirective; + @ViewChild('modal') modal: ModalDirective - constructor() { + constructor () { // empty } - show() { - this.modal.show(); + show () { + this.modal.show() } - hide() { - this.modal.hide(); + hide () { + this.modal.hide() } - getVideoIframeCode() { + getVideoIframeCode () { return '<iframe width="560" height="315" ' + 'src="' + window.location.origin + '/videos/embed/' + this.video.id + '" ' + 'frameborder="0" allowfullscreen>' + - '</iframe>'; + '</iframe>' } - getVideoUrl() { - return window.location.href; + getVideoUrl () { + return window.location.href } - notSecure() { - return window.location.protocol === 'http:'; + notSecure () { + return window.location.protocol === 'http:' } } diff --git a/client/src/app/videos/video-watch/video-watch.component.ts b/client/src/app/videos/video-watch/video-watch.component.ts index bcfebf2fd1..4a547f7e48 100644 --- a/client/src/app/videos/video-watch/video-watch.component.ts +++ b/client/src/app/videos/video-watch/video-watch.component.ts @@ -1,18 +1,18 @@ -import { Component, ElementRef, NgZone, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { Observable } from 'rxjs/Observable'; -import { Subscription } from 'rxjs/Subscription'; - -import * as videojs from 'video.js'; -import { MetaService } from '@nglibs/meta'; -import { NotificationsService } from 'angular2-notifications'; - -import { AuthService, ConfirmService } from '../../core'; -import { VideoMagnetComponent } from './video-magnet.component'; -import { VideoShareComponent } from './video-share.component'; -import { VideoReportComponent } from './video-report.component'; -import { RateType, Video, VideoService } from '../shared'; -import { WebTorrentService } from './webtorrent.service'; +import { Component, ElementRef, NgZone, OnDestroy, OnInit, ViewChild } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { Observable } from 'rxjs/Observable' +import { Subscription } from 'rxjs/Subscription' + +import * as videojs from 'video.js' +import { MetaService } from '@nglibs/meta' +import { NotificationsService } from 'angular2-notifications' + +import { AuthService, ConfirmService } from '../../core' +import { VideoMagnetComponent } from './video-magnet.component' +import { VideoShareComponent } from './video-share.component' +import { VideoReportComponent } from './video-report.component' +import { RateType, Video, VideoService } from '../shared' +import { WebTorrentService } from './webtorrent.service' @Component({ selector: 'my-video-watch', @@ -21,30 +21,30 @@ import { WebTorrentService } from './webtorrent.service'; }) export class VideoWatchComponent implements OnInit, OnDestroy { - private static LOADTIME_TOO_LONG = 20000; - - @ViewChild('videoMagnetModal') videoMagnetModal: VideoMagnetComponent; - @ViewChild('videoShareModal') videoShareModal: VideoShareComponent; - @ViewChild('videoReportModal') videoReportModal: VideoReportComponent; - - downloadSpeed: number; - error = false; - loading = false; - numPeers: number; - player: videojs.Player; - playerElement: Element; - uploadSpeed: number; - userRating: RateType = null; - video: Video = null; - videoNotFound = false; - - private errorTimer: number; - private paramsSub: Subscription; - private errorsSub: Subscription; - private warningsSub: Subscription; - private torrentInfosInterval: number; - - constructor( + private static LOADTIME_TOO_LONG = 20000 + + @ViewChild('videoMagnetModal') videoMagnetModal: VideoMagnetComponent + @ViewChild('videoShareModal') videoShareModal: VideoShareComponent + @ViewChild('videoReportModal') videoReportModal: VideoReportComponent + + downloadSpeed: number + error = false + loading = false + numPeers: number + player: videojs.Player + playerElement: Element + uploadSpeed: number + userRating: RateType = null + video: Video = null + videoNotFound = false + + private errorTimer: number + private paramsSub: Subscription + private errorsSub: Subscription + private warningsSub: Subscription + private torrentInfosInterval: number + + constructor ( private elementRef: ElementRef, private ngZone: NgZone, private route: ActivatedRoute, @@ -57,278 +57,281 @@ export class VideoWatchComponent implements OnInit, OnDestroy { private notificationsService: NotificationsService ) {} - ngOnInit() { + ngOnInit () { this.paramsSub = this.route.params.subscribe(routeParams => { - let id = routeParams['id']; + let id = routeParams['id'] this.videoService.getVideo(id).subscribe( video => this.onVideoFetched(video), - error => this.videoNotFound = true - ); - }); + error => { + console.error(error) + this.videoNotFound = true + } + ) + }) - this.playerElement = this.elementRef.nativeElement.querySelector('#video-container'); + this.playerElement = this.elementRef.nativeElement.querySelector('#video-container') const videojsOptions = { controls: true, autoplay: false - }; + } - const self = this; + const self = this videojs(this.playerElement, videojsOptions, function () { - self.player = this; - }); + self.player = this + }) - this.errorsSub = this.webTorrentService.errors.subscribe(err => this.notificationsService.error('Error', err.message)); - this.warningsSub = this.webTorrentService.errors.subscribe(err => this.notificationsService.alert('Warning', err.message)); + this.errorsSub = this.webTorrentService.errors.subscribe(err => this.notificationsService.error('Error', err.message)) + this.warningsSub = this.webTorrentService.errors.subscribe(err => this.notificationsService.alert('Warning', err.message)) } - ngOnDestroy() { + ngOnDestroy () { // Remove WebTorrent stuff - console.log('Removing video from webtorrent.'); - window.clearInterval(this.torrentInfosInterval); - window.clearTimeout(this.errorTimer); + console.log('Removing video from webtorrent.') + window.clearInterval(this.torrentInfosInterval) + window.clearTimeout(this.errorTimer) if (this.video !== null && this.webTorrentService.has(this.video.magnetUri)) { - this.webTorrentService.remove(this.video.magnetUri); + this.webTorrentService.remove(this.video.magnetUri) } // Remove player - videojs(this.playerElement).dispose(); + videojs(this.playerElement).dispose() // Unsubscribe subscriptions - this.paramsSub.unsubscribe(); - this.errorsSub.unsubscribe(); - this.warningsSub.unsubscribe(); + this.paramsSub.unsubscribe() + this.errorsSub.unsubscribe() + this.warningsSub.unsubscribe() } - loadVideo() { + loadVideo () { // Reset the error - this.error = false; + this.error = false // We are loading the video - this.loading = true; + this.loading = true - console.log('Adding ' + this.video.magnetUri + '.'); + console.log('Adding ' + this.video.magnetUri + '.') // The callback might never return if there are network issues // So we create a timer to inform the user the load is abnormally long - this.errorTimer = window.setTimeout(() => this.loadTooLong(), VideoWatchComponent.LOADTIME_TOO_LONG); + this.errorTimer = window.setTimeout(() => this.loadTooLong(), VideoWatchComponent.LOADTIME_TOO_LONG) this.webTorrentService.add(this.video.magnetUri, (torrent) => { // Clear the error timer - window.clearTimeout(this.errorTimer); + window.clearTimeout(this.errorTimer) // Maybe the error was fired by the timer, so reset it - this.error = false; + this.error = false // We are not loading the video anymore - this.loading = false; + this.loading = false - console.log('Added ' + this.video.magnetUri + '.'); + console.log('Added ' + this.video.magnetUri + '.') torrent.files[0].renderTo(this.playerElement, { autoplay: true }, (err) => { if (err) { - this.notificationsService.error('Error', 'Cannot append the file in the video element.'); - console.error(err); + this.notificationsService.error('Error', 'Cannot append the file in the video element.') + console.error(err) } - }); + }) - this.runInProgress(torrent); - }); + this.runInProgress(torrent) + }) } - setLike() { - if (this.isUserLoggedIn() === false) return; + setLike () { + if (this.isUserLoggedIn() === false) return // Already liked this video - if (this.userRating === 'like') return; + if (this.userRating === 'like') return this.videoService.setVideoLike(this.video.id) .subscribe( () => { // Update the video like attribute - this.updateVideoRating(this.userRating, 'like'); - this.userRating = 'like'; + this.updateVideoRating(this.userRating, 'like') + this.userRating = 'like' }, err => this.notificationsService.error('Error', err.text) - ); + ) } - setDislike() { - if (this.isUserLoggedIn() === false) return; + setDislike () { + if (this.isUserLoggedIn() === false) return // Already disliked this video - if (this.userRating === 'dislike') return; + if (this.userRating === 'dislike') return this.videoService.setVideoDislike(this.video.id) .subscribe( () => { // Update the video dislike attribute - this.updateVideoRating(this.userRating, 'dislike'); - this.userRating = 'dislike'; + this.updateVideoRating(this.userRating, 'dislike') + this.userRating = 'dislike' }, err => this.notificationsService.error('Error', err.text) - ); + ) } - removeVideo(event: Event) { - event.preventDefault(); + removeVideo (event: Event) { + event.preventDefault() this.confirmService.confirm('Do you really want to delete this video?', 'Delete').subscribe( res => { - if (res === false) return; + if (res === false) return this.videoService.removeVideo(this.video.id) .subscribe( status => { - this.notificationsService.success('Success', `Video ${this.video.name} deleted.`); + this.notificationsService.success('Success', `Video ${this.video.name} deleted.`) // Go back to the video-list. - this.router.navigate(['/videos/list']); + this.router.navigate(['/videos/list']) }, error => this.notificationsService.error('Error', error.text) - ); + ) } - ); + ) } - blacklistVideo(event: Event) { - event.preventDefault(); + blacklistVideo (event: Event) { + event.preventDefault() this.confirmService.confirm('Do you really want to blacklist this video ?', 'Blacklist').subscribe( res => { - if (res === false) return; + if (res === false) return this.videoService.blacklistVideo(this.video.id) .subscribe( status => { - this.notificationsService.success('Success', `Video ${this.video.name} had been blacklisted.`); - this.router.navigate(['/videos/list']); + this.notificationsService.success('Success', `Video ${this.video.name} had been blacklisted.`) + this.router.navigate(['/videos/list']) }, error => this.notificationsService.error('Error', error.text) - ); + ) } - ); + ) } - showReportModal(event: Event) { - event.preventDefault(); - this.videoReportModal.show(); + showReportModal (event: Event) { + event.preventDefault() + this.videoReportModal.show() } - showShareModal() { - this.videoShareModal.show(); + showShareModal () { + this.videoShareModal.show() } - showMagnetUriModal(event: Event) { - event.preventDefault(); - this.videoMagnetModal.show(); + showMagnetUriModal (event: Event) { + event.preventDefault() + this.videoMagnetModal.show() } - isUserLoggedIn() { - return this.authService.isLoggedIn(); + isUserLoggedIn () { + return this.authService.isLoggedIn() } - canUserUpdateVideo() { - return this.video.isUpdatableBy(this.authService.getUser()); + canUserUpdateVideo () { + return this.video.isUpdatableBy(this.authService.getUser()) } - isVideoRemovable() { - return this.video.isRemovableBy(this.authService.getUser()); + isVideoRemovable () { + return this.video.isRemovableBy(this.authService.getUser()) } - isVideoBlacklistable() { - return this.video.isBlackistableBy(this.authService.getUser()); + isVideoBlacklistable () { + return this.video.isBlackistableBy(this.authService.getUser()) } - private checkUserRating() { + private checkUserRating () { // Unlogged users do not have ratings - if (this.isUserLoggedIn() === false) return; + if (this.isUserLoggedIn() === false) return this.videoService.getUserVideoRating(this.video.id) .subscribe( ratingObject => { if (ratingObject) { - this.userRating = ratingObject.rating; + this.userRating = ratingObject.rating } }, err => this.notificationsService.error('Error', err.text) - ); + ) } - private onVideoFetched(video: Video) { - this.video = video; + private onVideoFetched (video: Video) { + this.video = video - let observable; + let observable if (this.video.isVideoNSFWForUser(this.authService.getUser())) { - observable = this.confirmService.confirm('This video is not safe for work. Are you sure you want to watch it?', 'NSFW'); + observable = this.confirmService.confirm('This video is not safe for work. Are you sure you want to watch it?', 'NSFW') } else { - observable = Observable.of(true); + observable = Observable.of(true) } observable.subscribe( res => { if (res === false) { - return this.router.navigate([ '/videos/list' ]); + return this.router.navigate([ '/videos/list' ]) } - this.setOpenGraphTags(); - this.loadVideo(); - this.checkUserRating(); + this.setOpenGraphTags() + this.loadVideo() + this.checkUserRating() } - ); + ) } - private updateVideoRating(oldRating: RateType, newRating: RateType) { - let likesToIncrement = 0; - let dislikesToIncrement = 0; + private updateVideoRating (oldRating: RateType, newRating: RateType) { + let likesToIncrement = 0 + let dislikesToIncrement = 0 if (oldRating) { - if (oldRating === 'like') likesToIncrement--; - if (oldRating === 'dislike') dislikesToIncrement--; + if (oldRating === 'like') likesToIncrement-- + if (oldRating === 'dislike') dislikesToIncrement-- } - if (newRating === 'like') likesToIncrement++; - if (newRating === 'dislike') dislikesToIncrement++; + if (newRating === 'like') likesToIncrement++ + if (newRating === 'dislike') dislikesToIncrement++ - this.video.likes += likesToIncrement; - this.video.dislikes += dislikesToIncrement; + this.video.likes += likesToIncrement + this.video.dislikes += dislikesToIncrement } - private loadTooLong() { - this.error = true; - console.error('The video load seems to be abnormally long.'); + private loadTooLong () { + this.error = true + console.error('The video load seems to be abnormally long.') } - private setOpenGraphTags() { - this.metaService.setTitle(this.video.name); + private setOpenGraphTags () { + this.metaService.setTitle(this.video.name) - this.metaService.setTag('og:type', 'video'); + this.metaService.setTag('og:type', 'video') - this.metaService.setTag('og:title', this.video.name); - this.metaService.setTag('name', this.video.name); + this.metaService.setTag('og:title', this.video.name) + this.metaService.setTag('name', this.video.name) - this.metaService.setTag('og:description', this.video.description); - this.metaService.setTag('description', this.video.description); + this.metaService.setTag('og:description', this.video.description) + this.metaService.setTag('description', this.video.description) - this.metaService.setTag('og:image', this.video.thumbnailPath); + this.metaService.setTag('og:image', this.video.thumbnailPath) - this.metaService.setTag('og:duration', this.video.duration.toString()); + this.metaService.setTag('og:duration', this.video.duration.toString()) - this.metaService.setTag('og:site_name', 'PeerTube'); + this.metaService.setTag('og:site_name', 'PeerTube') - this.metaService.setTag('og:url', window.location.href); - this.metaService.setTag('url', window.location.href); + this.metaService.setTag('og:url', window.location.href) + this.metaService.setTag('url', window.location.href) } - private runInProgress(torrent: any) { + private runInProgress (torrent: any) { // Refresh each second this.torrentInfosInterval = window.setInterval(() => { this.ngZone.run(() => { - this.downloadSpeed = torrent.downloadSpeed; - this.numPeers = torrent.numPeers; - this.uploadSpeed = torrent.uploadSpeed; - }); - }, 1000); + this.downloadSpeed = torrent.downloadSpeed + this.numPeers = torrent.numPeers + this.uploadSpeed = torrent.uploadSpeed + }) + }, 1000) } } diff --git a/client/src/app/videos/video-watch/webtorrent.service.ts b/client/src/app/videos/video-watch/webtorrent.service.ts index 8936e79925..211894bfd3 100644 --- a/client/src/app/videos/video-watch/webtorrent.service.ts +++ b/client/src/app/videos/video-watch/webtorrent.service.ts @@ -1,33 +1,33 @@ -import { Injectable } from '@angular/core'; -import { Subject } from 'rxjs/Subject'; +import { Injectable } from '@angular/core' +import { Subject } from 'rxjs/Subject' -import * as WebTorrent from 'webtorrent'; +import * as WebTorrent from 'webtorrent' @Injectable() export class WebTorrentService { - errors = new Subject<Error>(); - warnings = new Subject<Error>(); + errors = new Subject<Error>() + warnings = new Subject<Error>() // TODO: use WebTorrent @type - // private client: WebTorrent.Client; - private client: any; + // private client: WebTorrent.Client + private client: any - constructor() { - this.client = new WebTorrent({ dht: false }); + constructor () { + this.client = new WebTorrent({ dht: false }) - this.client.on('error', (err) => this.errors.next(err)); - this.client.on('warning', (err) => this.warnings.next(err)); + this.client.on('error', (err) => this.errors.next(err)) + this.client.on('warning', (err) => this.warnings.next(err)) } - add(magnetUri: string, callback: Function) { - return this.client.add(magnetUri, callback); + add (magnetUri: string, callback: Function) { + return this.client.add(magnetUri, callback) } - remove(magnetUri: string) { - return this.client.remove(magnetUri); + remove (magnetUri: string) { + return this.client.remove(magnetUri) } - has(magnetUri: string) { - return this.client.get(magnetUri) !== null; + has (magnetUri: string) { + return this.client.get(magnetUri) !== null } } diff --git a/client/src/app/videos/videos-routing.module.ts b/client/src/app/videos/videos-routing.module.ts index 70968b4d1d..7d002abded 100644 --- a/client/src/app/videos/videos-routing.module.ts +++ b/client/src/app/videos/videos-routing.module.ts @@ -1,10 +1,10 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' -import { VideoAddComponent, VideoUpdateComponent } from './video-edit'; -import { VideoListComponent } from './video-list'; -import { VideosComponent } from './videos.component'; -import { VideoWatchComponent } from './video-watch'; +import { VideoAddComponent, VideoUpdateComponent } from './video-edit' +import { VideoListComponent } from './video-list' +import { VideosComponent } from './videos.component' +import { VideoWatchComponent } from './video-watch' const videosRoutes: Routes = [ { @@ -48,7 +48,7 @@ const videosRoutes: Routes = [ } ] } -]; +] @NgModule({ imports: [ RouterModule.forChild(videosRoutes) ], diff --git a/client/src/app/videos/videos.component.ts b/client/src/app/videos/videos.component.ts index 591e7523d1..972c2221f5 100644 --- a/client/src/app/videos/videos.component.ts +++ b/client/src/app/videos/videos.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component } from '@angular/core' @Component({ template: '<router-outlet></router-outlet>' diff --git a/client/src/app/videos/videos.module.ts b/client/src/app/videos/videos.module.ts index adfbe70310..75a8dd24f9 100644 --- a/client/src/app/videos/videos.module.ts +++ b/client/src/app/videos/videos.module.ts @@ -1,20 +1,20 @@ -import { NgModule } from '@angular/core'; +import { NgModule } from '@angular/core' -import { TagInputModule } from 'ng2-tag-input'; +import { TagInputModule } from 'ng2-tag-input' -import { VideosRoutingModule } from './videos-routing.module'; -import { VideosComponent } from './videos.component'; -import { VideoAddComponent, VideoUpdateComponent } from './video-edit'; -import { LoaderComponent, VideoListComponent, VideoMiniatureComponent, VideoSortComponent } from './video-list'; +import { VideosRoutingModule } from './videos-routing.module' +import { VideosComponent } from './videos.component' +import { VideoAddComponent, VideoUpdateComponent } from './video-edit' +import { LoaderComponent, VideoListComponent, VideoMiniatureComponent, VideoSortComponent } from './video-list' import { VideoWatchComponent, VideoMagnetComponent, VideoReportComponent, VideoShareComponent, WebTorrentService -} from './video-watch'; -import { VideoService } from './shared'; -import { SharedModule } from '../shared'; +} from './video-watch' +import { VideoService } from './shared' +import { SharedModule } from '../shared' @NgModule({ imports: [ diff --git a/client/src/custom-typings.d.ts b/client/src/custom-typings.d.ts index 67e069cc61..882d15d54b 100644 --- a/client/src/custom-typings.d.ts +++ b/client/src/custom-typings.d.ts @@ -1,3 +1,5 @@ +/* tslint: disable */ + /* * Custom Type Definitions * When including 3rd party modules you also need to include the type definition for the module diff --git a/client/src/main.browser.aot.ts b/client/src/main.browser.aot.ts index 718cb3a809..9635d615b5 100644 --- a/client/src/main.browser.aot.ts +++ b/client/src/main.browser.aot.ts @@ -1,3 +1,5 @@ +/* tslint: disable */ + import { platformBrowser } from '@angular/platform-browser'; import { decorateModuleRef } from './app/environment'; diff --git a/client/src/main.browser.ts b/client/src/main.browser.ts index f627ba7dff..aeae06e045 100644 --- a/client/src/main.browser.ts +++ b/client/src/main.browser.ts @@ -1,3 +1,5 @@ +/* tslint: disable */ + import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { decorateModuleRef } from './app/environment'; diff --git a/client/src/polyfills.browser.ts b/client/src/polyfills.browser.ts index 5119cf4b94..b1a6316555 100644 --- a/client/src/polyfills.browser.ts +++ b/client/src/polyfills.browser.ts @@ -1,3 +1,5 @@ +/* tslint: disable */ + // Polyfills // (these modules are what are in 'angular2/bundles/angular2-polyfills' so don't use that here) diff --git a/client/tslint.json b/client/tslint.json index 50b90be65c..cfad2a5d94 100644 --- a/client/tslint.json +++ b/client/tslint.json @@ -1,36 +1,18 @@ { + "extends": "tslint-config-standard", "rulesDirectory": ["./node_modules/codelyzer"], "rules": { - "class-name": true, "no-inferrable-types": true, - "curly": false, "eofline": true, "indent": ["spaces"], "max-line-length": [true, 140], + "no-floating-promises": false, + "no-unused-variable": false, // Bug, wait TypeScript 2.4 "member-ordering": [true, "public-before-private", "static-before-instance", "variables-before-functions" ], - "no-arg": true, - "no-construct": true, - "no-duplicate-variable": true, - "no-empty": true, - "no-eval": true, - "no-trailing-whitespace": true, - "no-unused-expression": true, - "no-use-before-declare": true, - "one-line": [true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "quotemark": [true, "single"], - "semicolon": true, - "trailing-comma": true, - "triple-equals": true, - "variable-name": false, "directive-selector": [true, "attribute", "my", "camelCase"], "component-selector": [true, "element", "my", "kebab-case"], @@ -48,23 +30,6 @@ "directive-class-suffix": true, "templates-use-public": true, "no-access-missing-member": true, - "invoke-injectable": true, - - "typedef-whitespace": [ true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "whitespace": [ true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ] + "invoke-injectable": true } } diff --git a/client/yarn.lock b/client/yarn.lock index 68e4116acf..7fd6628b15 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -172,10 +172,11 @@ ajv@^4.7.0, ajv@^4.9.1: json-stable-stringify "^1.0.1" ajv@^5.0.0: - version "5.1.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.1.5.tgz#8734931b601f00d4feef7c65738d77d1b65d1f68" + version "5.1.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.1.6.tgz#4b2f1a19dece93d57ac216037e3e9791c7dd1564" dependencies: co "^4.6.0" + json-schema-traverse "^0.3.0" json-stable-stringify "^1.0.1" align-text@^0.1.1, align-text@^0.1.3: @@ -415,10 +416,14 @@ babel-runtime@^6.9.2: core-js "^2.4.0" regenerator-runtime "^0.10.0" -balanced-match@^0.4.1, balanced-match@^0.4.2: +balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + base64-js@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" @@ -591,10 +596,10 @@ bootstrap@^3.3.6: resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71" brace-expansion@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" dependencies: - balanced-match "^0.4.1" + balanced-match "^1.0.0" concat-map "0.0.1" braces@^1.8.2: @@ -761,8 +766,8 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000683" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000683.tgz#58b57ed1e0bb9da54eaf1462985147bbe16679fa" + version "1.0.30000686" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000686.tgz#d55b479ed6e6402c1fd3f1fd8f46e694d86ea464" cardinal@^1.0.0: version "1.0.0" @@ -830,14 +835,14 @@ circular-json@^0.3.1: resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" clap@^1.0.9: - version "1.1.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.1.3.tgz#b3bd36e93dd4cbfb395a3c26896352445265c05b" + version "1.2.0" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.0.tgz#59c90fe3e137104746ff19469a27a634ff68c857" dependencies: chalk "^1.1.3" clean-css@4.1.x: - version "4.1.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.3.tgz#07cfe8980edb20d455ddc23aadcf1e04c6e509ce" + version "4.1.4" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.4.tgz#eec8811db27457e0078d8ca921fa81b72fa82bf4" dependencies: source-map "0.5.x" @@ -880,14 +885,13 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -clone-deep@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" +clone-deep@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8" dependencies: - for-own "^0.1.3" + for-own "^1.0.0" is-plain-object "^2.0.1" - kind-of "^3.0.2" - lazy-cache "^1.0.3" + kind-of "^3.2.2" shallow-clone "^0.1.2" clone@^1.0.2: @@ -1400,6 +1404,13 @@ doctrine@1.5.0, doctrine@^1.2.2: esutils "^2.0.2" isarray "^1.0.0" +doctrine@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" + dependencies: + esutils "^1.1.6" + isarray "0.0.1" + doctrine@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" @@ -1776,6 +1787,10 @@ estree-walker@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" +esutils@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2008,12 +2023,18 @@ for-in@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" -for-own@^0.1.3, for-own@^0.1.4: +for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" dependencies: for-in "^1.0.1" +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" @@ -2064,11 +2085,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" dependencies: nan "^2.3.0" - node-pre-gyp "^0.6.29" + node-pre-gyp "^0.6.36" fstream-ignore@^1.0.5: version "1.0.5" @@ -2760,6 +2781,10 @@ json-loader@^0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" +json-schema-traverse@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.0.tgz#0016c0b1ca1efe46d44d37541bcdfc19dcfae0db" + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -2841,7 +2866,7 @@ kind-of@^2.0.1: dependencies: is-buffer "^1.0.2" -kind-of@^3.0.2: +kind-of@^3.0.2, kind-of@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: @@ -3508,7 +3533,7 @@ node-notifier@^4.1.0: shellwords "^0.1.0" which "^1.0.5" -node-pre-gyp@^0.6.29: +node-pre-gyp@^0.6.36: version "0.6.36" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" dependencies: @@ -3880,10 +3905,14 @@ piece-length@^1.0.0: dependencies: closest-to "~2.0.0" -pify@^2.0.0, pify@^2.3.0: +pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -4172,8 +4201,8 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 supports-color "^3.2.3" postcss@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.2.tgz#5c4fea589f0ac3b00caa75b1cbc3a284195b7e5d" dependencies: chalk "^1.1.3" source-map "^0.5.6" @@ -4588,8 +4617,8 @@ resolve-from@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" resolve-url-loader@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.0.2.tgz#c465e97ea0a4791f3961f766cea775ff2e3ceb8c" + version "2.0.3" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.0.3.tgz#f54cd1b040e8f0ab72b2cb32c9fbb8544152d9e9" dependencies: adjust-sourcemap-loader "^1.1.0" camelcase "^4.0.0" @@ -4710,14 +4739,14 @@ sass-graph@^2.1.1: yargs "^7.0.0" sass-loader@^6.0.3: - version "6.0.5" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-6.0.5.tgz#a847910f36442aa56c5985879d54eb519e24a328" + version "6.0.6" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-6.0.6.tgz#e9d5e6c1f155faa32a4b26d7a9b7107c225e40f9" dependencies: async "^2.1.5" - clone-deep "^0.2.4" + clone-deep "^0.3.0" loader-utils "^1.0.1" lodash.tail "^4.1.1" - pify "^2.3.0" + pify "^3.0.0" sass-resources-loader@^1.2.1: version "1.2.1" @@ -5093,8 +5122,8 @@ stream-browserify@^2.0.1: readable-stream "^2.0.2" stream-http@^2.3.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.1.tgz#546a51741ad5a6b07e9e31b0b10441a917df528a" + version "2.7.2" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" @@ -5380,10 +5409,24 @@ tsickle@^0.21.0: source-map "^0.5.6" source-map-support "^0.4.2" -tslib@^1.5.0, tslib@^1.6.0, tslib@^1.7.1: +tslib@^1.0.0, tslib@^1.5.0, tslib@^1.6.0, tslib@^1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.7.1.tgz#bc8004164691923a79fe8378bbeb3da2017538ec" +tslint-config-standard@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-6.0.1.tgz#a04ba0a794759e877287056f549b081e47a56d6c" + dependencies: + tslint-eslint-rules "^4.0.0" + +tslint-eslint-rules@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-4.1.1.tgz#7c30e7882f26bc276bff91d2384975c69daf88ba" + dependencies: + doctrine "^0.7.2" + tslib "^1.0.0" + tsutils "^1.4.0" + tslint-loader@^3.3.0: version "3.5.3" resolved "https://registry.yarnpkg.com/tslint-loader/-/tslint-loader-3.5.3.tgz#343f74122d94f356b689457d3f59f64a69ab606f" @@ -5413,6 +5456,10 @@ tsml@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tsml/-/tsml-1.0.1.tgz#89f8218b9d9e257f47d7f6b56d01c5a4d2c68fc3" +tsutils@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0" + tsutils@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.4.0.tgz#ad4ce6dba0e5a3edbddf8626b7ca040782189fea" @@ -5458,20 +5505,20 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typescript@~2.3.0: - version "2.3.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.4.tgz#3d38321828231e434f287514959c37a82b629f42" +typescript@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.0.tgz#aef5a8d404beba36ad339abf079ddddfffba86dd" uglify-js@3.0.x: - version "3.0.15" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.15.tgz#aacb323a846b234602270dead8a32441a8806f42" + version "3.0.17" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.17.tgz#d228cd55c2df9b3d2f53f147568cb4cc4a72cc06" dependencies: commander "~2.9.0" source-map "~0.5.1" uglify-js@^2.8.27: - version "2.8.28" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.28.tgz#e335032df9bb20dcb918f164589d5af47f38834a" + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -5533,8 +5580,8 @@ urix@^0.1.0, urix@~0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" url-loader@^0.5.7: - version "0.5.8" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.8.tgz#b9183b1801e0f847718673673040bc9dc1c715c5" + version "0.5.9" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.9.tgz#cc8fea82c7b906e7777019250869e569e995c295" dependencies: loader-utils "^1.0.2" mime "1.3.x" diff --git a/package.json b/package.json index 095d380bfd..ac542c3f9e 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,8 @@ "postinstall": "cd client && yarn install", "tsc": "tsc", "nodemon": "nodemon", - "ts-node": "ts-node" + "ts-node": "ts-node", + "tslint": "tslint" }, "dependencies": { "async": "^2.0.0", @@ -76,7 +77,7 @@ "scripty": "^1.5.0", "sequelize": "4.0.0-2", "ts-node": "^3.0.6", - "typescript": "~2.2.0", + "typescript": "^2.3.4", "validator": "^7.0.0", "winston": "^2.1.1", "ws": "^2.0.0" @@ -94,7 +95,7 @@ "@types/morgan": "^1.7.32", "@types/multer": "^0.0.34", "@types/node": "^7.0.18", - "@types/request": "^0.0.43", + "@types/request": "^0.0.44", "@types/sequelize": "^4.0.55", "@types/validator": "^6.2.0", "@types/winston": "^2.3.2", @@ -107,7 +108,7 @@ "standard": "^10.0.0", "supertest": "^3.0.0", "tslint": "^5.2.0", - "tslint-config-standard": "^5.0.2", + "tslint-config-standard": "^6.0.0", "webtorrent": "^0.98.0" }, "standard": { diff --git a/scripts/check.ts b/scripts/check.ts index 28167482cf..24f4806af6 100755 --- a/scripts/check.ts +++ b/scripts/check.ts @@ -130,7 +130,7 @@ function isThereValidCORSHeaders (res: request.RequestResponse) { console.error(headerAllowMethodsKey + ' is not present.') fail = true } else { - const allowMethodsMissed = findPatternNotInString(headerAllowMethods, [ 'get' ]) + const allowMethodsMissed = findPatternNotInString(headerAllowMethods as string, [ 'get' ]) if (allowMethodsMissed !== null) { console.error(headerAllowMethodsKey + ' misses the ' + allowMethodsMissed + ' method.') fail = true @@ -147,7 +147,7 @@ function isThereValidCORSHeaders (res: request.RequestResponse) { const headersThatShouldBePresent = [ 'Range' ] - const allowHeadersMissed = findPatternNotInString(headerAllowHeaders, headersThatShouldBePresent) + const allowHeadersMissed = findPatternNotInString(headerAllowHeaders as string, headersThatShouldBePresent) if (allowHeadersMissed !== null) { console.error(headerAllowHeadersKey + ' misses the ' + allowHeadersMissed + ' header.') fail = true diff --git a/scripts/test.sh b/scripts/test.sh index b341fc0d07..701dea8d04 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -4,5 +4,5 @@ cd client || exit -1 npm test || exit -1 cd .. || exit -1 -standard || exit -1 +npm run tslint -- --type-check --project ./tsconfig.json -c ./tslint.json server.ts server/**/*.ts || exit -1 mocha server/tests diff --git a/server/controllers/index.ts b/server/controllers/index.ts index bb56fd7cfc..0223a98f11 100644 --- a/server/controllers/index.ts +++ b/server/controllers/index.ts @@ -1,3 +1,3 @@ -export * from './static'; -export * from './client'; -export * from './api'; +export * from './static' +export * from './client' +export * from './api' diff --git a/server/helpers/utils.ts b/server/helpers/utils.ts index 8e489de966..07c1b3f51a 100644 --- a/server/helpers/utils.ts +++ b/server/helpers/utils.ts @@ -1,7 +1,6 @@ import * as express from 'express' import { pseudoRandomBytes } from 'crypto' -import { join } from 'path' import { logger } from './logger' diff --git a/server/initializers/database.ts b/server/initializers/database.ts index 1662c1968f..47604c6b01 100644 --- a/server/initializers/database.ts +++ b/server/initializers/database.ts @@ -144,7 +144,7 @@ function getModelFiles (modelDirectory: string, callback: (err: Error, filePaths return eachCallback(null) }) - }, function(err: Error) { + }, function (err: Error) { return callback(err, modelFilePaths) }) }) diff --git a/server/initializers/migrator.ts b/server/initializers/migrator.ts index d72c60638a..d8faaebc6d 100644 --- a/server/initializers/migrator.ts +++ b/server/initializers/migrator.ts @@ -6,7 +6,6 @@ import * as Sequelize from 'sequelize' import { database as db } from './database' import { LAST_MIGRATION_VERSION } from './constants' import { logger } from '../helpers' -import { ApplicationInstance } from '../models' function migrate (finalCallback: (err: Error) => void) { waterfall([ diff --git a/server/lib/friends.ts b/server/lib/friends.ts index d07433a5dd..522cb82b34 100644 --- a/server/lib/friends.ts +++ b/server/lib/friends.ts @@ -103,7 +103,11 @@ function quickAndDirtyUpdateVideoToFriends (qaduParam: QaduParam, transaction?: return createVideoQaduRequest(options, callback) } -function quickAndDirtyUpdatesVideoToFriends (qadusParams: QaduParam[], transaction: Sequelize.Transaction, finalCallback: (err: Error) => void) { +function quickAndDirtyUpdatesVideoToFriends ( + qadusParams: QaduParam[], + transaction: Sequelize.Transaction, + finalCallback: (err: Error) => void +) { const tasks = [] qadusParams.forEach(function (qaduParams) { diff --git a/server/lib/jobs/handlers/video-transcoder.ts b/server/lib/jobs/handlers/video-transcoder.ts index efa18ef2d6..6f606a7d34 100644 --- a/server/lib/jobs/handlers/video-transcoder.ts +++ b/server/lib/jobs/handlers/video-transcoder.ts @@ -13,9 +13,9 @@ function process (data: { id: string }, callback: (err: Error, videoInstance?: V }) } -function onError (err: Error, jobId: number, video: VideoInstance, callback: () => void) { +function onError (err: Error, jobId: number, video: VideoInstance, callback: (err: Error) => void) { logger.error('Error when transcoding video file in job %d.', jobId, { error: err }) - return callback() + return callback(null) } function onSuccess (data: any, jobId: number, video: VideoInstance, callback: (err: Error) => void) { diff --git a/tslint.json b/tslint.json index 8887798568..70e5d9bb41 100644 --- a/tslint.json +++ b/tslint.json @@ -1,3 +1,10 @@ { - "extends": "tslint-config-standard" + "extends": "tslint-config-standard", + "rules": { + "no-inferrable-types": true, + "eofline": true, + "indent": ["spaces"], + "max-line-length": [true, 140], + "no-floating-promises": false + } } diff --git a/yarn.lock b/yarn.lock index 9c0af9d327..85143ca6ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,14 +32,14 @@ resolved "https://registry.yarnpkg.com/@types/config/-/config-0.0.32.tgz#c106055802d78e234e28374adc4dad460d098558" "@types/express-serve-static-core@*": - version "4.0.45" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.45.tgz#71bb1f87d7187482d0d8851f5b294458e1c78667" + version "4.0.47" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.47.tgz#71b3c6b060ba8aea97d205171ff3f3a69d3db465" dependencies: "@types/node" "*" "@types/express@*", "@types/express@^4.0.35", "@types/express@~4.0.34": - version "4.0.35" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.35.tgz#6267c7b60a51fac473467b3c4a02cd1e441805fe" + version "4.0.36" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.36.tgz#14eb47de7ecb10319f0a2fb1cf971aa8680758c2" dependencies: "@types/express-serve-static-core" "*" "@types/serve-static" "*" @@ -55,8 +55,8 @@ resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.2.tgz#b02d10ab028e2928ac592a051aaa4981a1941d03" "@types/lodash@*", "@types/lodash@^4.14.64": - version "4.14.65" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.65.tgz#a0f78d71ffcd3c02628d5f616410c98c424326d5" + version "4.14.66" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.66.tgz#3dbb83477becf130611f8fac82a8fdb199805981" "@types/magnet-uri@^5.1.1": version "5.1.1" @@ -65,8 +65,8 @@ "@types/node" "*" "@types/mime@*": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b" + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.0.tgz#d24ffac7d1006fe68517202fb2aeba3dbe48284b" "@types/mkdirp@^0.3.29": version "0.3.29" @@ -85,12 +85,12 @@ "@types/express" "*" "@types/node@*", "@types/node@^7.0.18": - version "7.0.29" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.29.tgz#ccfcec5b7135c7caf6c4ffb8c7f33102340d99df" + version "7.0.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.31.tgz#80ea4d175599b2a00149c29a10a4eb2dff592e86" -"@types/request@^0.0.43": - version "0.0.43" - resolved "https://registry.yarnpkg.com/@types/request/-/request-0.0.43.tgz#fcc59cfd88e63034e813c6884a0aade2d0f7e935" +"@types/request@^0.0.44": + version "0.0.44" + resolved "https://registry.yarnpkg.com/@types/request/-/request-0.0.44.tgz#77572176765376d2ba98654079311650cf4113af" dependencies: "@types/form-data" "*" "@types/node" "*" @@ -319,9 +319,9 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.0" -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" basic-auth@^1.0.0, basic-auth@~1.1.0: version "1.1.0" @@ -485,10 +485,10 @@ boom@2.x.x: hoek "2.x.x" brace-expansion@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" dependencies: - balanced-match "^0.4.1" + balanced-match "^1.0.0" concat-map "0.0.1" braces@^1.8.2: @@ -1521,13 +1521,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" dependencies: nan "^2.3.0" - node-pre-gyp "^0.6.29" + node-pre-gyp "^0.6.36" -fstream-ignore@~1.0.5: +fstream-ignore@^1.0.5, fstream-ignore@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" dependencies: @@ -1535,7 +1535,7 @@ fstream-ignore@~1.0.5: inherits "2" minimatch "^3.0.0" -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2, fstream@~1.0.10: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" dependencies: @@ -2473,7 +2473,7 @@ node-abi@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.0.3.tgz#0ca67e5e667b8e1343549ca17153a815d0bbfdaa" -node-pre-gyp@0.6.32, node-pre-gyp@^0.6.29: +node-pre-gyp@0.6.32: version "0.6.32" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" dependencies: @@ -2487,6 +2487,20 @@ node-pre-gyp@0.6.32, node-pre-gyp@^0.6.29: tar "~2.2.1" tar-pack "~3.3.0" +node-pre-gyp@^0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + node-uuid@~1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -2510,6 +2524,13 @@ noop-logger@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + nopt@~1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -2528,7 +2549,7 @@ normalize-path@^2.0.1: dependencies: remove-trailing-separator "^1.0.1" -npmlog@^4.0.1: +npmlog@^4.0.1, npmlog@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" dependencies: @@ -2645,7 +2666,7 @@ os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -osenv@^0.1.0: +osenv@^0.1.0, osenv@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" dependencies: @@ -2997,7 +3018,7 @@ raw-body@~2.2.0: iconv-lite "0.4.15" unpipe "1.0.0" -rc@^1.0.1, rc@^1.1.6, rc@~1.1.6: +rc@^1.0.1, rc@^1.1.6, rc@^1.1.7, rc@~1.1.6: version "1.1.7" resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea" dependencies: @@ -3179,7 +3200,7 @@ retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" -rimraf@2, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.4: +rimraf@2, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: @@ -3650,6 +3671,19 @@ tar-fs@^1.13.0: pump "^1.0.0" tar-stream "^1.1.2" +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + tar-pack@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" @@ -3672,7 +3706,7 @@ tar-stream@^1.1.2: readable-stream "^2.0.0" xtend "^4.0.0" -tar@~2.2.1: +tar@^2.2.1, tar@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: @@ -3787,9 +3821,9 @@ tslib@^1.0.0, tslib@^1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.7.1.tgz#bc8004164691923a79fe8378bbeb3da2017538ec" -tslint-config-standard@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-5.0.2.tgz#e98fd5c412a6b973798366dc2c85508cf0ed740f" +tslint-config-standard@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-6.0.1.tgz#a04ba0a794759e877287056f549b081e47a56d6c" dependencies: tslint-eslint-rules "^4.0.0" @@ -3869,11 +3903,11 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typescript@~2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.2.2.tgz#606022508479b55ffa368b58fee963a03dfd7b0c" +typescript@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.0.tgz#aef5a8d404beba36ad339abf079ddddfffba86dd" -uid-number@~0.0.6: +uid-number@^0.0.6, uid-number@~0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" -- GitLab