<img src="https://david-dm.org/Chocobozzz/PeerTube/dev-status.svg" alt="devDependency Status" />
</a>
- <a href="https://codeclimate.com/github/Chocobozzz/PeerTube">
- <img src="https://codeclimate.com/github/Chocobozzz/PeerTube/badges/gpa.svg" alt="Code climate" />
- </a>
-
<a href="http://standardjs.com/">
<img src="https://img.shields.io/badge/code%20style-standard-brightgreen.svg" alt="JavaScript Style Guide" />
</a>
import { FriendsRoutes } from './friends';
import { RequestsRoutes } from './requests';
import { UsersRoutes } from './users';
+import { VideoAbusesRoutes } from './video-abuses';
const adminRoutes: Routes = [
{
},
...FriendsRoutes,
...RequestsRoutes,
- ...UsersRoutes
+ ...UsersRoutes,
+ ...VideoAbusesRoutes
]
}
];
import { FriendsComponent, FriendAddComponent, FriendListComponent, FriendService } from './friends';
import { RequestsComponent, RequestStatsComponent, RequestService } from './requests';
import { UsersComponent, UserAddComponent, UserListComponent, UserService } from './users';
+import { VideoAbusesComponent, VideoAbuseListComponent } from './video-abuses';
import { MenuAdminComponent } from './menu-admin.component';
import { SharedModule } from '../shared';
UserAddComponent,
UserListComponent,
+ VideoAbusesComponent,
+ VideoAbuseListComponent,
+
MenuAdminComponent
],
<span class="hidden-xs glyphicon glyphicon-stats"></span>
<a [routerLink]="['/admin/requests/stats']">Request stats</a>
</div>
+
+ <div id="panel-video-abuses" class="panel-button">
+ <span class="hidden-xs glyphicon glyphicon-alert"></span>
+ <a [routerLink]="['/admin/video-abuses/list']">Video abuses</a>
+ </div>
</div>
<div class="panel-block">
--- /dev/null
+export * from './video-abuse-list';
+export * from './video-abuses.component';
+export * from './video-abuses.routes';
--- /dev/null
+export * from './video-abuse-list.component';
--- /dev/null
+<h3>Video abuses list</h3>
+
+<table class="table table-hover">
+ <thead>
+ <tr>
+ <th class="cell-id">ID</th>
+ <th class="cell-reason">Reason</th>
+ <th>Reporter pod host</th>
+ <th>Reporter username</th>
+ <th>Video</th>
+ <th>Created at</th>
+ </tr>
+ </thead>
+
+ <tbody>
+ <tr *ngFor="let videoAbuse of videoAbuses">
+ <td>{{ videoAbuse.id }}</td>
+ <td>{{ videoAbuse.reason }}</td>
+ <td>{{ videoAbuse.reporterPodHost }}</td>
+ <td>{{ videoAbuse.reporterUsername }}</td>
+ <td>
+ <a [routerLink]="buildVideoLink(videoAbuse)" title="Go to video">{{ videoAbuse.videoId }}</a>
+ </td>
+ <td>{{ videoAbuse.createdAt | date: 'medium' }}</td>
+ </tr>
+ </tbody>
+</table>
--- /dev/null
+.cell-id {
+ width: 40px;
+}
+
+.cell-reason {
+ width: 200px;
+}
--- /dev/null
+import { setInterval } from 'timers'
+import { Component, OnInit } from '@angular/core';
+
+import { VideoAbuseService, VideoAbuse} from '../../../shared';
+
+@Component({
+ selector: 'my-video-abuse-list',
+ templateUrl: './video-abuse-list.component.html',
+ styleUrls: [ './video-abuse-list.component.scss' ]
+})
+export class VideoAbuseListComponent implements OnInit {
+ videoAbuses: VideoAbuse[];
+
+ constructor(private videoAbuseService: VideoAbuseService) { }
+
+ ngOnInit() {
+ this.getVideoAbuses();
+ }
+
+ buildVideoLink(videoAbuse: VideoAbuse) {
+ return `/videos/${videoAbuse.videoId}`;
+ }
+
+ private getVideoAbuses() {
+ this.videoAbuseService.getVideoAbuses().subscribe(
+ res => this.videoAbuses = res.videoAbuses,
+
+ err => alert(err.text)
+ );
+ }
+}
--- /dev/null
+import { Component } from '@angular/core';
+
+@Component({
+ template: '<router-outlet></router-outlet>'
+})
+
+export class VideoAbusesComponent {
+}
--- /dev/null
+import { Routes } from '@angular/router';
+
+import { VideoAbusesComponent } from './video-abuses.component';
+import { VideoAbuseListComponent } from './video-abuse-list';
+
+export const VideoAbusesRoutes: Routes = [
+ {
+ path: 'video-abuses',
+ component: VideoAbusesComponent
+ ,
+ children: [
+ {
+ path: '',
+ redirectTo: 'list',
+ pathMatch: 'full'
+ },
+ {
+ path: 'list',
+ component: VideoAbuseListComponent,
+ data: {
+ meta: {
+ titleSuffix: ' - Video abuses list'
+ }
+ }
+ }
+ ]
+ }
+];
export * from './host.validator';
export * from './user';
-export * from './video-report';
+export * from './video-abuse';
export * from './video';
--- /dev/null
+import { Validators } from '@angular/forms';
+
+export const VIDEO_ABUSE_REASON = {
+ VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(300) ],
+ MESSAGES: {
+ 'required': 'Report reason name is required.',
+ 'minlength': 'Report reson must be at least 2 characters long.',
+ 'maxlength': 'Report reson cannot be more than 300 characters long.'
+ }
+};
+++ /dev/null
-import { Validators } from '@angular/forms';
-
-export const VIDEO_REPORT_REASON = {
- VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(300) ],
- MESSAGES: {
- 'required': 'Report reason name is required.',
- 'minlength': 'Report reson must be at least 2 characters long.',
- 'maxlength': 'Report reson cannot be more than 300 characters long.'
- }
-};
export * from './rest';
export * from './search';
export * from './users';
+export * from './video-abuse';
export * from './shared.module';
import { AUTH_HTTP_PROVIDERS } from './auth';
import { RestExtractor, RestService } from './rest';
import { SearchComponent, SearchService } from './search';
+import { VideoAbuseService } from './video-abuse';
@NgModule({
imports: [
AUTH_HTTP_PROVIDERS,
RestExtractor,
RestService,
- SearchService
+ SearchService,
+ VideoAbuseService
]
})
export class SharedModule { }
--- /dev/null
+export * from './video-abuse.service';
+export * from './video-abuse.model';
--- /dev/null
+export interface VideoAbuse {
+ id: string;
+ reason: string;
+ reporterPodHost: string;
+ reporterUsername: string;
+ videoId: string;
+ createdAt: Date;
+}
--- /dev/null
+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 { RestExtractor, ResultList } from '../rest';
+import { VideoAbuse } from './video-abuse.model';
+
+@Injectable()
+export class VideoAbuseService {
+ private static BASE_VIDEO_ABUSE_URL = '/api/v1/videos/';
+
+ constructor(
+ private authHttp: AuthHttp,
+ private restExtractor: RestExtractor
+ ) {}
+
+ getVideoAbuses() {
+ return this.authHttp.get(VideoAbuseService.BASE_VIDEO_ABUSE_URL + 'abuse')
+ .map(this.restExtractor.extractDataList)
+ .map(this.extractVideoAbuses)
+ }
+
+ reportVideo(id: string, reason: string) {
+ const body = {
+ reason
+ };
+ 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));
+ }
+
+ private extractVideoAbuses(result: ResultList) {
+ const videoAbuses: VideoAbuse[] = result.data;
+ const totalVideoAbuses = result.total;
+
+ return { videoAbuses, totalVideoAbuses };
+ }
+}
import { ModalDirective } from 'ng2-bootstrap/modal';
-import { FormReactive, VIDEO_REPORT_REASON } from '../../shared';
+import { FormReactive, VideoAbuseService, VIDEO_ABUSE_REASON } from '../../shared';
import { Video, VideoService } from '../shared';
@Component({
reason: ''
};
validationMessages = {
- reason: VIDEO_REPORT_REASON.MESSAGES
+ reason: VIDEO_ABUSE_REASON.MESSAGES
};
constructor(
private formBuilder: FormBuilder,
- private videoService: VideoService
+ private videoAbuseService: VideoAbuseService
) {
super();
}
buildForm() {
this.form = this.formBuilder.group({
- reason: [ '', VIDEO_REPORT_REASON.VALIDATORS ]
+ reason: [ '', VIDEO_ABUSE_REASON.VALIDATORS ]
});
this.form.valueChanges.subscribe(data => this.onValueChanged(data));
report() {
const reason = this.form.value['reason']
- this.videoService.reportVideo(this.video.id, reason)
+ this.videoAbuseService.reportVideo(this.video.id, reason)
.subscribe(
// TODO: move alert to beautiful notifications
ok => {
}
})
- if (!silent) logger.info('Database is ready.')
+ if (!silent) logger.info('Database %s is ready.', dbname)
return callback(null)
})
reporterPodHost,
reason: this.reason,
reporterUsername: this.reporterUsername,
- videoId: this.videoId
+ videoId: this.videoId,
+ createdAt: this.createdAt
}
return json