diff options
author | Green-Star <Green-Star@users.noreply.github.com> | 2017-04-26 21:22:10 +0200 |
---|---|---|
committer | Bigard Florian <florian.bigard@gmail.com> | 2017-04-26 21:22:10 +0200 |
commit | 198b205c10dba362b9ae1ef6895b29d7e0dd685f (patch) | |
tree | 3be413139784f7445e775cbecccc6091a738360b /client/src/app/videos/video-watch | |
parent | 00871a261787ae1ed8446861ba2bd5eea9faca6d (diff) | |
download | PeerTube-198b205c10dba362b9ae1ef6895b29d7e0dd685f.tar.gz PeerTube-198b205c10dba362b9ae1ef6895b29d7e0dd685f.tar.zst PeerTube-198b205c10dba362b9ae1ef6895b29d7e0dd685f.zip |
Add ability for an administrator to remove any video (#61)
* Add ability for an admin to remove every video on the pod.
* Server: add BlacklistedVideos relation.
* Server: Insert in BlacklistedVideos relation upon deletion of a video.
* Server: Modify BlacklistedVideos schema to add Pod id information.
* Server: Moving insertion of a blacklisted video from the `afterDestroy` hook into the process of deletion of a video.
To avoid inserting a video when it is removed on its origin pod.
When a video is removed on its origin pod, the `afterDestroy` hook is fire, but no request is made on the delete('/:videoId') interface.
Hence, we insert into `BlacklistedVideos` only on request on delete('/:videoId') (if requirements for insertion are met).
* Server: Add removeVideoFromBlacklist hook on deletion of a video.
We are going to proceed in another way :).
We will add a new route : /:videoId/blacklist to blacklist a video.
We do not blacklist a video upon its deletion now (to distinguish a video blacklist from a regular video delete)
When we blacklist a video, the video remains in the DB, so we don't have any concern about its update. It just doesn't appear in the video list.
When we remove a video, we then have to remove it from the blacklist too.
We could also remove a video from the blacklist to 'unremove' it and make it appear again in the video list (will be another feature).
* Server: Add handler for new route post(/:videoId/blacklist)
* Client: Add isBlacklistable method
* Client: Update isRemovableBy method.
* Client: Move 'Delete video' feature from the video-list to the video-watch module.
* Server: Exclude blacklisted videos from the video list
* Server: Use findAll() in BlacklistedVideos.list() method
* Server: Fix addVideoToBlacklist function.
* Client: Add blacklist feature.
* Server: Use JavaScript Standard Style.
* Server: In checkUserCanDeleteVideo, move the callback call inside the db callback function
* Server: Modify BlacklistVideo relation
* Server: Modifiy Videos methods.
* Server: Add checkVideoIsBlacklistable method
* Server: Rewrite addVideoToBlacklist method
* Server: Fix checkVideoIsBlacklistable method
* Server: Add return to addVideoToBlacklist method
Diffstat (limited to 'client/src/app/videos/video-watch')
-rw-r--r-- | client/src/app/videos/video-watch/video-watch.component.html | 12 | ||||
-rw-r--r-- | client/src/app/videos/video-watch/video-watch.component.ts | 47 |
2 files changed, 59 insertions, 0 deletions
diff --git a/client/src/app/videos/video-watch/video-watch.component.html b/client/src/app/videos/video-watch/video-watch.component.html index 19e9bd9ed..ed26b513e 100644 --- a/client/src/app/videos/video-watch/video-watch.component.html +++ b/client/src/app/videos/video-watch/video-watch.component.html | |||
@@ -96,6 +96,18 @@ | |||
96 | <span class="glyphicon glyphicon-alert"></span> Report | 96 | <span class="glyphicon glyphicon-alert"></span> Report |
97 | </a> | 97 | </a> |
98 | </li> | 98 | </li> |
99 | |||
100 | <li *ngIf="isVideoRemovable()" role="menuitem"> | ||
101 | <a class="dropdown-item" title="Delete this video" href="#" (click)="removeVideo($event)"> | ||
102 | <span class="glyphicon glyphicon-remove"></span> Delete | ||
103 | </a> | ||
104 | </li> | ||
105 | |||
106 | <li *ngIf="isVideoBlacklistable()" role="menuitem"> | ||
107 | <a class="dropdown-item" title="Blacklist this video" href="#" (click)="blacklistVideo($event)"> | ||
108 | <span class="glyphicon glyphicon-eye-close"></span> Blacklist | ||
109 | </a> | ||
110 | </li> | ||
99 | </ul> | 111 | </ul> |
100 | </div> | 112 | </div> |
101 | </div> | 113 | </div> |
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 e04626a67..f582df45c 100644 --- a/client/src/app/videos/video-watch/video-watch.component.ts +++ b/client/src/app/videos/video-watch/video-watch.component.ts | |||
@@ -169,6 +169,45 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
169 | ); | 169 | ); |
170 | } | 170 | } |
171 | 171 | ||
172 | removeVideo(event: Event) { | ||
173 | event.preventDefault(); | ||
174 | this.confirmService.confirm('Do you really want to delete this video?', 'Delete').subscribe( | ||
175 | res => { | ||
176 | if (res === false) return; | ||
177 | |||
178 | this.videoService.removeVideo(this.video.id) | ||
179 | .subscribe( | ||
180 | status => { | ||
181 | this.notificationsService.success('Success', `Video ${this.video.name} deleted.`) | ||
182 | // Go back to the video-list. | ||
183 | this.router.navigate(['/videos/list']) | ||
184 | }, | ||
185 | |||
186 | error => this.notificationsService.error('Error', error.text) | ||
187 | ); | ||
188 | } | ||
189 | ); | ||
190 | } | ||
191 | |||
192 | blacklistVideo(event: Event) { | ||
193 | event.preventDefault() | ||
194 | this.confirmService.confirm('Do you really want to blacklist this video ?', 'Blacklist').subscribe( | ||
195 | res => { | ||
196 | if (res === false) return; | ||
197 | |||
198 | this.videoService.blacklistVideo(this.video.id) | ||
199 | .subscribe( | ||
200 | status => { | ||
201 | this.notificationsService.success('Success', `Video ${this.video.name} had been blacklisted.`) | ||
202 | this.router.navigate(['/videos/list']) | ||
203 | }, | ||
204 | |||
205 | error => this.notificationsService.error('Error', error.text) | ||
206 | ) | ||
207 | } | ||
208 | ) | ||
209 | } | ||
210 | |||
172 | showReportModal(event: Event) { | 211 | showReportModal(event: Event) { |
173 | event.preventDefault(); | 212 | event.preventDefault(); |
174 | this.videoReportModal.show(); | 213 | this.videoReportModal.show(); |
@@ -192,6 +231,14 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
192 | this.authService.getUser().username === this.video.author; | 231 | this.authService.getUser().username === this.video.author; |
193 | } | 232 | } |
194 | 233 | ||
234 | isVideoRemovable() { | ||
235 | return this.video.isRemovableBy(this.authService.getUser()); | ||
236 | } | ||
237 | |||
238 | isVideoBlacklistable() { | ||
239 | return this.video.isBlackistableBy(this.authService.getUser()); | ||
240 | } | ||
241 | |||
195 | private checkUserRating() { | 242 | private checkUserRating() { |
196 | // Unlogged users do not have ratings | 243 | // Unlogged users do not have ratings |
197 | if (this.isUserLoggedIn() === false) return; | 244 | if (this.isUserLoggedIn() === false) return; |