import * as Sequelize from 'sequelize'
import {
- AfterDestroy, AllowNull, BelongsTo, Column, CreatedAt, DefaultScope, ForeignKey, HasMany, Model, Table,
+ AllowNull,
+ BeforeDestroy,
+ BelongsTo,
+ Column,
+ CreatedAt,
+ Default,
+ DefaultScope,
+ ForeignKey,
+ HasMany,
+ Is,
+ Model,
+ Table,
UpdatedAt
} from 'sequelize-typescript'
import { Account } from '../../../shared/models/actors'
+import { isAccountDescriptionValid } from '../../helpers/custom-validators/accounts'
+import { logger } from '../../helpers/logger'
import { sendDeleteActor } from '../../lib/activitypub/send'
import { ActorModel } from '../activitypub/actor'
import { ApplicationModel } from '../application/application'
import { AvatarModel } from '../avatar/avatar'
import { ServerModel } from '../server/server'
-import { getSort } from '../utils'
+import { getSort, throwIfNotValid } from '../utils'
import { VideoChannelModel } from '../video/video-channel'
+import { VideoCommentModel } from '../video/video-comment'
import { UserModel } from './user'
@DefaultScope({
@Column
name: string
+ @AllowNull(true)
+ @Default(null)
+ @Is('AccountDescription', value => throwIfNotValid(value, isAccountDescriptionValid, 'description'))
+ @Column
+ description: string
+
@CreatedAt
createdAt: Date
},
onDelete: 'cascade'
})
- Account: ApplicationModel
+ Application: ApplicationModel
@HasMany(() => VideoChannelModel, {
foreignKey: {
})
VideoChannels: VideoChannelModel[]
- @AfterDestroy
- static sendDeleteIfOwned (instance: AccountModel) {
+ @HasMany(() => VideoCommentModel, {
+ foreignKey: {
+ allowNull: false
+ },
+ onDelete: 'cascade',
+ hooks: true
+ })
+ VideoComments: VideoCommentModel[]
+
+ @BeforeDestroy
+ static async sendDeleteIfOwned (instance: AccountModel, options) {
+ if (!instance.Actor) {
+ instance.Actor = await instance.$get('Actor', { transaction: options.transaction }) as ActorModel
+ }
+
if (instance.isOwned()) {
- return sendDeleteActor(instance.Actor, undefined)
+ logger.debug('Sending delete of actor of account %s.', instance.Actor.url)
+ return sendDeleteActor(instance.Actor, options.transaction)
}
return undefined
static loadLocalByName (name: string) {
const query = {
where: {
- name,
[ Sequelize.Op.or ]: [
{
userId: {
}
}
]
- }
+ },
+ include: [
+ {
+ model: ActorModel,
+ required: true,
+ where: {
+ preferredUsername: name
+ }
+ }
+ ]
+ }
+
+ return AccountModel.findOne(query)
+ }
+
+ static loadLocalByNameAndHost (name: string, host: string) {
+ const query = {
+ include: [
+ {
+ model: ActorModel,
+ required: true,
+ where: {
+ preferredUsername: name
+ },
+ include: [
+ {
+ model: ServerModel,
+ required: true,
+ where: {
+ host
+ }
+ }
+ ]
+ }
+ ]
}
return AccountModel.findOne(query)
const query = {
offset: start,
limit: count,
- order: [ getSort(sort) ]
+ order: getSort(sort)
}
return AccountModel.findAndCountAll(query)
const actor = this.Actor.toFormattedJSON()
const account = {
id: this.id,
- displayName: this.name,
+ displayName: this.getDisplayName(),
+ description: this.description,
createdAt: this.createdAt,
updatedAt: this.updatedAt
}
}
toActivityPubObject () {
- return this.Actor.toActivityPubObject(this.name, 'Account')
+ const obj = this.Actor.toActivityPubObject(this.name, 'Account')
+
+ return Object.assign(obj, {
+ summary: this.description
+ })
}
isOwned () {
return this.Actor.isOwned()
}
+
+ getDisplayName () {
+ return this.name
+ }
}