X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Faccount%2Faccount.ts;h=4dc4123018a5fc2dc6713df5afe447fa2786b9ff;hb=13176a07a95984a53cc59aec5217f2ce9806d1bc;hp=09cada0967abf5ad39c820fbd20ee888717fa9ee;hpb=b6a1dd4d1b3b0032f8b968e72cbd074f646e8827;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/account/account.ts b/server/models/account/account.ts index 09cada096..4dc412301 100644 --- a/server/models/account/account.ts +++ b/server/models/account/account.ts @@ -27,12 +27,20 @@ import { UserModel } from './user' import { AvatarModel } from '../avatar/avatar' import { VideoPlaylistModel } from '../video/video-playlist' import { CONSTRAINTS_FIELDS, WEBSERVER } from '../../initializers/constants' -import { Op, Transaction, WhereOptions } from 'sequelize' +import { FindOptions, IncludeOptions, Op, Transaction, WhereOptions } from 'sequelize' +import { AccountBlocklistModel } from './account-blocklist' +import { ServerBlocklistModel } from '../server/server-blocklist' +import { ActorFollowModel } from '../activitypub/actor-follow' export enum ScopeNames { SUMMARY = 'SUMMARY' } +export type SummaryOptions = { + whereActor?: WhereOptions + withAccountBlockerIds?: number[] +} + @DefaultScope(() => ({ include: [ { @@ -42,8 +50,16 @@ export enum ScopeNames { ] })) @Scopes(() => ({ - [ ScopeNames.SUMMARY ]: (whereActor?: WhereOptions) => { - return { + [ ScopeNames.SUMMARY ]: (options: SummaryOptions = {}) => { + const whereActor = options.whereActor || undefined + + const serverInclude: IncludeOptions = { + attributes: [ 'host' ], + model: ServerModel.unscoped(), + required: false + } + + const query: FindOptions = { attributes: [ 'id', 'name' ], include: [ { @@ -52,11 +68,8 @@ export enum ScopeNames { required: true, where: whereActor, include: [ - { - attributes: [ 'host' ], - model: ServerModel.unscoped(), - required: false - }, + serverInclude, + { model: AvatarModel.unscoped(), required: false @@ -65,6 +78,35 @@ export enum ScopeNames { } ] } + + if (options.withAccountBlockerIds) { + query.include.push({ + attributes: [ 'id' ], + model: AccountBlocklistModel.unscoped(), + as: 'BlockedAccounts', + required: false, + where: { + accountId: { + [Op.in]: options.withAccountBlockerIds + } + } + }) + + serverInclude.include = [ + { + attributes: [ 'id' ], + model: ServerBlocklistModel.unscoped(), + required: false, + where: { + accountId: { + [Op.in]: options.withAccountBlockerIds + } + } + } + ] + } + + return query } })) @Table({ @@ -163,12 +205,23 @@ export class AccountModel extends Model { }) VideoComments: VideoCommentModel[] + @HasMany(() => AccountBlocklistModel, { + foreignKey: { + name: 'targetAccountId', + allowNull: false + }, + as: 'BlockedAccounts', + onDelete: 'CASCADE' + }) + BlockedAccounts: AccountBlocklistModel[] + @BeforeDestroy static async sendDeleteIfOwned (instance: AccountModel, options) { if (!instance.Actor) { instance.Actor = await instance.$get('Actor', { transaction: options.transaction }) as ActorModel } + await ActorFollowModel.removeFollowsOf(instance.Actor.id, options.transaction) if (instance.isOwned()) { return sendDeleteActor(instance.Actor, options.transaction) } @@ -343,4 +396,8 @@ export class AccountModel extends Model { getDisplayName () { return this.name } + + isBlocked () { + return this.BlockedAccounts && this.BlockedAccounts.length !== 0 + } }