</ng-container>
</ng-container>
+ <div i18n class="inner-form-title">Instance followings</div>
+
+ <ng-container formGroupName="followings">
+ <ng-container formGroupName="instance">
+
+ <ng-container formGroupName="autoFollowBack">
+ <div class="form-group">
+ <my-peertube-checkbox
+ inputName="followingsInstanceAutoFollowBackEnabled" formControlName="enabled"
+ i18n-labelText labelText="Automatically follow other instances that follow you"
+ ></my-peertube-checkbox>
+ </div>
+ </ng-container>
+
+ <ng-container formGroupName="autoFollowIndex">
+ <div class="form-group">
+ <my-peertube-checkbox
+ inputName="followingsInstanceAutoFollowIndexEnabled" formControlName="enabled"
+ i18n-labelText labelText="Automatically follow instance of the public index (below)"
+ ></my-peertube-checkbox>
+ </div>
+
+ <div class="form-group">
+ <label i18n for="followingsInstanceAutoFollowIndexUrl">Index URL</label>
+ <input
+ type="text" id="followingsInstanceAutoFollowIndexUrl"
+ formControlName="indexUrl" [ngClass]="{ 'input-error': formErrors['followings.instance.autoFollowIndex.indexUrl'] }"
+ >
+ <div *ngIf="formErrors.followings.instance.autoFollowIndex.indexUrl" class="form-error">{{ formErrors.followings.instance.autoFollowIndex.indexUrl }}</div>
+ </div>
+
+ </ng-container>
+ </ng-container>
+ </ng-container>
+
<div i18n class="inner-form-title">Administrator</div>
enabled: null,
manualApproval: null
}
+ },
+ followings: {
+ instance: {
+ autoFollowBack: {
+ enabled: null
+ },
+ autoFollowIndex: {
+ enabled: null,
+ indexUrl: this.customConfigValidatorsService.INDEX_URL
+ }
+ }
}
}
newUserRegistration: this.i18n('A new user registered on your instance'),
newFollow: this.i18n('You or your channel(s) has a new follower'),
commentMention: this.i18n('Someone mentioned you in video comments'),
- newInstanceFollower: this.i18n('Your instance has a new follower')
+ newInstanceFollower: this.i18n('Your instance has a new follower'),
+ autoInstanceFollowing: this.i18n('Your instance auto followed another instance')
}
this.notificationSettingKeys = Object.keys(this.labelNotifications) as (keyof UserNotificationSetting)[]
videoAbuseAsModerator: UserRight.MANAGE_VIDEO_ABUSES,
videoAutoBlacklistAsModerator: UserRight.MANAGE_VIDEO_BLACKLIST,
newUserRegistration: UserRight.MANAGE_USERS,
- newInstanceFollower: UserRight.MANAGE_SERVER_FOLLOW
+ newInstanceFollower: UserRight.MANAGE_SERVER_FOLLOW,
+ autoInstanceFollowing: UserRight.MANAGE_CONFIGURATION
}
this.emailEnabled = this.serverService.getConfig().email.enabled
readonly SIGNUP_LIMIT: BuildFormValidator
readonly ADMIN_EMAIL: BuildFormValidator
readonly TRANSCODING_THREADS: BuildFormValidator
+ readonly INDEX_URL: BuildFormValidator
constructor (private i18n: I18n) {
this.INSTANCE_NAME = {
'min': this.i18n('Transcoding threads must be greater or equal to 0.')
}
}
+
+ this.INDEX_URL = {
+ VALIDATORS: [ Validators.required, Validators.pattern(/^https:\/\//) ],
+ MESSAGES: {
+ 'required': this.i18n('Index URL is required.'),
+ 'pattern': this.i18n('Index URL should be a URL')
+ }
+ }
}
}
state: FollowState
follower: ActorInfo & { avatarUrl?: string }
following: {
- type: 'account' | 'channel'
+ type: 'account' | 'channel' | 'instance'
name: string
displayName: string
+ host: string
}
}
case UserNotificationType.NEW_INSTANCE_FOLLOWER:
this.instanceFollowUrl = '/admin/follows/followers-list'
break
+
+ case UserNotificationType.AUTO_INSTANCE_FOLLOWING:
+ this.instanceFollowUrl = '/admin/follows/following-list'
+ break
}
} catch (err) {
this.type = null
<my-global-icon iconName="no"></my-global-icon>
<div class="message">
- The recently added video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been <a (click)="markAsRead(notification)" [routerLink]="notification.videoAutoBlacklistUrl">auto-blacklisted</a>
+ The recently added video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.videoBlacklist.video.name }}</a> has been <a (click)="markAsRead(notification)" [routerLink]="notification.videoAutoBlacklistUrl">auto-blacklisted</a>
</div>
</ng-container>
<ng-container *ngIf="notification.actorFollow.state === 'pending'"> awaiting your approval</ng-container>
</div>
</ng-container>
+
+ <ng-container i18n *ngSwitchCase="UserNotificationType.AUTO_INSTANCE_FOLLOWING">
+ <my-global-icon iconName="users"></my-global-icon>
+
+ <div class="message">
+ Your instance automatically followed <a (click)="markAsRead(notification)" [routerLink]="notification.instanceFollowUrl">{{ notification.actorFollow.following.host }}</a>
+ </div>
+ </ng-container>
</ng-container>
<div class="from-date">{{ notification.createdAt | myFromNow }}</div>
// ---------------------------------------------------------------------------
-const LAST_MIGRATION_VERSION = 425
+const LAST_MIGRATION_VERSION = 430
// ---------------------------------------------------------------------------
--- /dev/null
+import * as Sequelize from 'sequelize'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction,
+ queryInterface: Sequelize.QueryInterface,
+ sequelize: Sequelize.Sequelize,
+ db: any
+}): Promise<void> {
+ {
+ const data = {
+ type: Sequelize.INTEGER,
+ defaultValue: null,
+ allowNull: true
+ }
+ await utils.queryInterface.addColumn('userNotificationSetting', 'autoInstanceFollowing', data)
+ }
+
+ {
+ const query = 'UPDATE "userNotificationSetting" SET "autoInstanceFollowing" = 1'
+ await utils.sequelize.query(query)
+ }
+
+ {
+ const data = {
+ type: Sequelize.INTEGER,
+ defaultValue: null,
+ allowNull: false
+ }
+ await utils.queryInterface.changeColumn('userNotificationSetting', 'autoInstanceFollowing', data)
+ }
+}
+
+function down (options) {
+ throw new Error('Not implemented.')
+}
+
+export {
+ up,
+ down
+}