diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
index fe9d856d0..ec6f879d7 100644
--- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
+++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
@@ -221,6 +221,41 @@
+
Instance followings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Administrator
diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts
index 8bd7f7cf6..d51104569 100644
--- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts
+++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts
@@ -158,6 +158,17 @@ export class EditCustomConfigComponent extends FormReactive implements OnInit {
enabled: null,
manualApproval: null
}
+ },
+ followings: {
+ instance: {
+ autoFollowBack: {
+ enabled: null
+ },
+ autoFollowIndex: {
+ enabled: null,
+ indexUrl: this.customConfigValidatorsService.INDEX_URL
+ }
+ }
}
}
diff --git a/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts
index 34febc457..76fabb19d 100644
--- a/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts
+++ b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts
@@ -43,7 +43,8 @@ export class MyAccountNotificationPreferencesComponent implements OnInit {
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)[]
@@ -51,7 +52,8 @@ export class MyAccountNotificationPreferencesComponent implements OnInit {
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
diff --git a/client/src/app/shared/forms/form-validators/custom-config-validators.service.ts b/client/src/app/shared/forms/form-validators/custom-config-validators.service.ts
index 882e39453..767e3f026 100644
--- a/client/src/app/shared/forms/form-validators/custom-config-validators.service.ts
+++ b/client/src/app/shared/forms/form-validators/custom-config-validators.service.ts
@@ -13,6 +13,7 @@ export class CustomConfigValidatorsService {
readonly SIGNUP_LIMIT: BuildFormValidator
readonly ADMIN_EMAIL: BuildFormValidator
readonly TRANSCODING_THREADS: BuildFormValidator
+ readonly INDEX_URL: BuildFormValidator
constructor (private i18n: I18n) {
this.INSTANCE_NAME = {
@@ -78,5 +79,13 @@ export class CustomConfigValidatorsService {
'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')
+ }
+ }
}
}
diff --git a/client/src/app/shared/users/user-notification.model.ts b/client/src/app/shared/users/user-notification.model.ts
index 37fa29ee8..b4ac075c5 100644
--- a/client/src/app/shared/users/user-notification.model.ts
+++ b/client/src/app/shared/users/user-notification.model.ts
@@ -42,9 +42,10 @@ export class UserNotification implements UserNotificationServer {
state: FollowState
follower: ActorInfo & { avatarUrl?: string }
following: {
- type: 'account' | 'channel'
+ type: 'account' | 'channel' | 'instance'
name: string
displayName: string
+ host: string
}
}
@@ -146,6 +147,10 @@ export class UserNotification implements UserNotificationServer {
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
diff --git a/client/src/app/shared/users/user-notifications.component.html b/client/src/app/shared/users/user-notifications.component.html
index 292813426..0702d3b5e 100644
--- a/client/src/app/shared/users/user-notifications.component.html
+++ b/client/src/app/shared/users/user-notifications.component.html
@@ -40,7 +40,7 @@
@@ -111,6 +111,14 @@
awaiting your approval
+
+
+
+
+
+
{{ notification.createdAt | myFromNow }}
diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts
index 7c0c5a87c..01d4f1d74 100644
--- a/server/initializers/constants.ts
+++ b/server/initializers/constants.ts
@@ -14,7 +14,7 @@ import { CONFIG, registerConfigChangedHandler } from './config'
// ---------------------------------------------------------------------------
-const LAST_MIGRATION_VERSION = 425
+const LAST_MIGRATION_VERSION = 430
// ---------------------------------------------------------------------------
diff --git a/server/initializers/migrations/0430-auto-follow-notification-setting.ts b/server/initializers/migrations/0430-auto-follow-notification-setting.ts
new file mode 100644
index 000000000..034bdd46d
--- /dev/null
+++ b/server/initializers/migrations/0430-auto-follow-notification-setting.ts
@@ -0,0 +1,40 @@
+import * as Sequelize from 'sequelize'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction,
+ queryInterface: Sequelize.QueryInterface,
+ sequelize: Sequelize.Sequelize,
+ db: any
+}): Promise {
+ {
+ 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
+}