diff options
author | kontrollanten <6680299+kontrollanten@users.noreply.github.com> | 2021-12-13 15:29:13 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-13 15:29:13 +0100 |
commit | a37e9e74ff07b057370d1ed6c0b391a02be8a6d2 (patch) | |
tree | 30d59e12518149a309bbd10bee1485f8be523c75 /client/src/app/+video-channels | |
parent | 11e520b50d791a0dd48cbb2d0fc681b25eb7cd53 (diff) | |
download | PeerTube-a37e9e74ff07b057370d1ed6c0b391a02be8a6d2.tar.gz PeerTube-a37e9e74ff07b057370d1ed6c0b391a02be8a6d2.tar.zst PeerTube-a37e9e74ff07b057370d1ed6c0b391a02be8a6d2.zip |
Give moderators access to edit channels (#4608)
* give admins access to edit all channels
closes #4598
* test(channels): +admin update another users channel
* Fix tests
* fix(server): delete another users channel
Since the channel owner isn't necessary the auth user we need to check
the right account whether it's the last video or not.
* REMOVE_ANY_VIDEO_CHANNEL > MANAGE_ANY_VIDEO_CHANNEL
Merge REMOVE_ANY_VIDEO_CHANNEL and MANY_VIDEO_CHANNELS to
MANAGE_ANY_VIDEO_CHANNEL.
* user-right: moderator can't manage admins channel
* client: MyVideoChannelCreateComponent > VideoChannelCreateComponent
* client: MyVideoChannelEdit > VideoChannelEdit
* Revert "user-right: moderator can't manage admins channel"
This reverts commit 2c627c154e2bfe6af2e0f45efb27faf4117572f3.
* server: clean dupl validator functionality
* fix ensureUserCanManageChannel usage
It's not async anymore.
* server: merge channel validator middleares
ensureAuthUserOwnsChannelValidator & ensureUserCanManageChannel gets
merged into one middleware.
* client(VideoChannelEdit): redirect to prev route
* fix(VideoChannels): handle anon users
* client: new routes for create/update channel
* Refactor channel validators
Co-authored-by: Chocobozzz <me@florianbigard.com>
Diffstat (limited to 'client/src/app/+video-channels')
3 files changed, 12 insertions, 4 deletions
diff --git a/client/src/app/+video-channels/video-channels.component.html b/client/src/app/+video-channels/video-channels.component.html index aec2e373c..212e2f867 100644 --- a/client/src/app/+video-channels/video-channels.component.html +++ b/client/src/app/+video-channels/video-channels.component.html | |||
@@ -6,11 +6,11 @@ | |||
6 | <div class="channel-info"> | 6 | <div class="channel-info"> |
7 | 7 | ||
8 | <ng-template #buttonsTemplate> | 8 | <ng-template #buttonsTemplate> |
9 | <a *ngIf="isManageable()" [routerLink]="[ '/my-library/video-channels/update', videoChannel.nameWithHost ]" class="peertube-button-link orange-button" i18n> | 9 | <a *ngIf="isManageable()" [routerLink]="[ '/manage/update', videoChannel.nameWithHost ]" class="peertube-button-link orange-button" i18n> |
10 | Manage channel | 10 | Manage channel |
11 | </a> | 11 | </a> |
12 | 12 | ||
13 | <my-subscribe-button *ngIf="!isManageable()" #subscribeButton [videoChannels]="[videoChannel]"></my-subscribe-button> | 13 | <my-subscribe-button *ngIf="!isOwner()" #subscribeButton [videoChannels]="[videoChannel]"></my-subscribe-button> |
14 | 14 | ||
15 | <button *ngIf="videoChannel.support" (click)="showSupportModal()" class="support-button peertube-button orange-button-inverted"> | 15 | <button *ngIf="videoChannel.support" (click)="showSupportModal()" class="support-button peertube-button orange-button-inverted"> |
16 | <my-global-icon iconName="support" aria-hidden="true"></my-global-icon> | 16 | <my-global-icon iconName="support" aria-hidden="true"></my-global-icon> |
diff --git a/client/src/app/+video-channels/video-channels.component.ts b/client/src/app/+video-channels/video-channels.component.ts index ebb991f4e..82c52d239 100644 --- a/client/src/app/+video-channels/video-channels.component.ts +++ b/client/src/app/+video-channels/video-channels.component.ts | |||
@@ -8,7 +8,7 @@ import { Account, ListOverflowItem, VideoChannel, VideoChannelService, VideoServ | |||
8 | import { BlocklistService } from '@app/shared/shared-moderation' | 8 | import { BlocklistService } from '@app/shared/shared-moderation' |
9 | import { SupportModalComponent } from '@app/shared/shared-support-modal' | 9 | import { SupportModalComponent } from '@app/shared/shared-support-modal' |
10 | import { SubscribeButtonComponent } from '@app/shared/shared-user-subscription' | 10 | import { SubscribeButtonComponent } from '@app/shared/shared-user-subscription' |
11 | import { HttpStatusCode } from '@shared/models' | 11 | import { HttpStatusCode, UserRight } from '@shared/models' |
12 | 12 | ||
13 | @Component({ | 13 | @Component({ |
14 | templateUrl: './video-channels.component.html', | 14 | templateUrl: './video-channels.component.html', |
@@ -98,12 +98,18 @@ export class VideoChannelsComponent implements OnInit, OnDestroy { | |||
98 | return this.authService.isLoggedIn() | 98 | return this.authService.isLoggedIn() |
99 | } | 99 | } |
100 | 100 | ||
101 | isManageable () { | 101 | isOwner () { |
102 | if (!this.isUserLoggedIn()) return false | 102 | if (!this.isUserLoggedIn()) return false |
103 | 103 | ||
104 | return this.videoChannel?.ownerAccount.userId === this.authService.getUser().id | 104 | return this.videoChannel?.ownerAccount.userId === this.authService.getUser().id |
105 | } | 105 | } |
106 | 106 | ||
107 | isManageable () { | ||
108 | if (!this.isUserLoggedIn()) return false | ||
109 | |||
110 | return this.isOwner() || this.authService.getUser().hasRight(UserRight.MANAGE_ANY_VIDEO_CHANNEL) | ||
111 | } | ||
112 | |||
107 | activateCopiedMessage () { | 113 | activateCopiedMessage () { |
108 | this.notifier.success($localize`Username copied`) | 114 | this.notifier.success($localize`Username copied`) |
109 | } | 115 | } |
diff --git a/client/src/app/+video-channels/video-channels.module.ts b/client/src/app/+video-channels/video-channels.module.ts index 76aaecf83..aef3ed0a3 100644 --- a/client/src/app/+video-channels/video-channels.module.ts +++ b/client/src/app/+video-channels/video-channels.module.ts | |||
@@ -12,6 +12,7 @@ import { VideoChannelPlaylistsComponent } from './video-channel-playlists/video- | |||
12 | import { VideoChannelVideosComponent } from './video-channel-videos/video-channel-videos.component' | 12 | import { VideoChannelVideosComponent } from './video-channel-videos/video-channel-videos.component' |
13 | import { VideoChannelsRoutingModule } from './video-channels-routing.module' | 13 | import { VideoChannelsRoutingModule } from './video-channels-routing.module' |
14 | import { VideoChannelsComponent } from './video-channels.component' | 14 | import { VideoChannelsComponent } from './video-channels.component' |
15 | import { SharedActorImageEditModule } from '@app/shared/shared-actor-image-edit' | ||
15 | 16 | ||
16 | @NgModule({ | 17 | @NgModule({ |
17 | imports: [ | 18 | imports: [ |
@@ -25,6 +26,7 @@ import { VideoChannelsComponent } from './video-channels.component' | |||
25 | SharedGlobalIconModule, | 26 | SharedGlobalIconModule, |
26 | SharedSupportModal, | 27 | SharedSupportModal, |
27 | SharedActorImageModule, | 28 | SharedActorImageModule, |
29 | SharedActorImageEditModule, | ||
28 | SharedModerationModule | 30 | SharedModerationModule |
29 | ], | 31 | ], |
30 | 32 | ||