X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Faccount%2Faccount.ts;h=3ff59887d4ab93d6d04fddfb1959c23a9d7bbee3;hb=8fffe21a7bc96d08b229293d66ddba576e609790;hp=d3503aaa385a4b55ddd5aa70a9e551368319ae42;hpb=c5911fd347c76e8bdc05ea9f3ee9efed4a58c236;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/account/account.ts b/server/models/account/account.ts index d3503aaa3..3ff59887d 100644 --- a/server/models/account/account.ts +++ b/server/models/account/account.ts @@ -1,10 +1,11 @@ import * as Sequelize from 'sequelize' import { - AfterDestroy, AllowNull, + BeforeDestroy, BelongsTo, Column, CreatedAt, + Default, DefaultScope, ForeignKey, HasMany, @@ -14,13 +15,16 @@ import { UpdatedAt } from 'sequelize-typescript' import { Account } from '../../../shared/models/actors' -import { isUserUsernameValid } from '../../helpers/custom-validators/users' +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 { throwIfNotValid } from '../utils' +import { getSort, throwIfNotValid } from '../utils' import { VideoChannelModel } from '../video/video-channel' +import { VideoCommentModel } from '../video/video-comment' import { UserModel } from './user' @DefaultScope({ @@ -32,6 +36,10 @@ import { UserModel } from './user' { model: () => ServerModel, required: false + }, + { + model: () => AvatarModel, + required: false } ] } @@ -43,10 +51,15 @@ import { UserModel } from './user' export class AccountModel extends Model { @AllowNull(false) - @Is('AccountName', value => throwIfNotValid(value, isUserUsernameValid, 'account name')) @Column name: string + @AllowNull(true) + @Default(null) + @Is('AccountDescription', value => throwIfNotValid(value, isAccountDescriptionValid, 'description')) + @Column + description: string + @CreatedAt createdAt: Date @@ -87,7 +100,7 @@ export class AccountModel extends Model { }, onDelete: 'cascade' }) - Account: ApplicationModel + Application: ApplicationModel @HasMany(() => VideoChannelModel, { foreignKey: { @@ -98,10 +111,24 @@ export class AccountModel extends Model { }) 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 @@ -130,7 +157,6 @@ export class AccountModel extends Model { static loadLocalByName (name: string) { const query = { where: { - name, [ Sequelize.Op.or ]: [ { userId: { @@ -143,7 +169,41 @@ export class AccountModel extends Model { } } ] - } + }, + 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) @@ -166,12 +226,28 @@ export class AccountModel extends Model { return AccountModel.findOne(query) } + static listForApi (start: number, count: number, sort: string) { + const query = { + offset: start, + limit: count, + order: getSort(sort) + } + + return AccountModel.findAndCountAll(query) + .then(({ rows, count }) => { + return { + data: rows, + total: count + } + }) + } + toFormattedJSON (): Account { const actor = this.Actor.toFormattedJSON() const account = { id: this.id, - name: this.Actor.preferredUsername, - displayName: this.name, + displayName: this.getDisplayName(), + description: this.description, createdAt: this.createdAt, updatedAt: this.updatedAt } @@ -180,10 +256,18 @@ export class AccountModel extends Model { } 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 + } }