X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=server%2Fmodels%2Faccount%2Faccount.ts;h=d674d8d22de3402f5a230a0289324bbd3c8739c9;hb=cf7a61b5a2b68fd966c4a355e37e84b048ed296b;hp=b26395fd4baeb7a58ee69c3601ee0147e924f10e;hpb=fadf619ad61a016c1c7fc53de5a8f398a4f77519;p=oweals%2Fpeertube.git diff --git a/server/models/account/account.ts b/server/models/account/account.ts index b26395fd4..d674d8d22 100644 --- a/server/models/account/account.ts +++ b/server/models/account/account.ts @@ -1,54 +1,77 @@ import * as Sequelize from 'sequelize' import { - AfterDestroy, AllowNull, + BeforeDestroy, BelongsTo, Column, CreatedAt, - DataType, Default, + DefaultScope, ForeignKey, HasMany, Is, - IsUUID, Model, Table, UpdatedAt } from 'sequelize-typescript' -import { isUserUsernameValid } from '../../helpers/custom-validators/users' -import { sendDeleteAccount } from '../../lib/activitypub/send' +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 { 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({ + include: [ + { + model: () => ActorModel, + required: true, + include: [ + { + model: () => ServerModel, + required: false + }, + { + model: () => AvatarModel, + required: false + } + ] + } + ] +}) @Table({ tableName: 'account', indexes: [ { - fields: [ 'name' ] - }, - { - fields: [ 'serverId' ] - }, - { - fields: [ 'userId' ], + fields: [ 'actorId' ], unique: true }, { - fields: [ 'applicationId' ], - unique: true + fields: [ 'applicationId' ] }, { - fields: [ 'name', 'serverId', 'applicationId' ], - unique: true + fields: [ 'userId' ] } ] }) export class AccountModel extends Model { + @AllowNull(false) + @Column + name: string + + @AllowNull(true) + @Default(null) + @Is('AccountDescription', value => throwIfNotValid(value, isAccountDescriptionValid, 'description')) + @Column + description: string + @CreatedAt createdAt: Date @@ -100,35 +123,43 @@ 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 sendDeleteAccount(instance, undefined) + return sendDeleteActor(instance.Actor, options.transaction) } return undefined } - static loadApplication () { - return AccountModel.findOne({ - include: [ - { - model: ApplicationModel, - required: true - } - ] - }) - } - static load (id: number) { return AccountModel.findById(id) } static loadByUUID (uuid: string) { const query = { - where: { - uuid - } + include: [ + { + model: ActorModel, + required: true, + where: { + uuid + } + } + ] } return AccountModel.findOne(query) @@ -137,7 +168,6 @@ export class AccountModel extends Model { static loadLocalByName (name: string) { const query = { where: { - name, [ Sequelize.Op.or ]: [ { userId: { @@ -150,23 +180,13 @@ export class AccountModel extends Model { } } ] - } - } - - return AccountModel.findOne(query) - } - - static loadByNameAndHost (name: string, host: string) { - const query = { - where: { - name }, include: [ { - model: ServerModel, + model: ActorModel, required: true, where: { - host + preferredUsername: name } } ] @@ -175,46 +195,70 @@ export class AccountModel extends Model { return AccountModel.findOne(query) } - static loadByUrl (url: string, transaction?: Sequelize.Transaction) { + static loadLocalByNameAndHost (name: string, host: string) { const query = { include: [ { model: ActorModel, required: true, where: { - url - } + preferredUsername: name + }, + include: [ + { + model: ServerModel, + required: true, + where: { + host + } + } + ] } - ], - transaction + ] } return AccountModel.findOne(query) } - static listByFollowersUrls (followersUrls: string[], transaction?: Sequelize.Transaction) { + static loadByUrl (url: string, transaction?: Sequelize.Transaction) { const query = { include: [ { model: ActorModel, required: true, where: { - followersUrl: { - [ Sequelize.Op.in ]: followersUrls - } + url } } ], transaction } - return AccountModel.findAll(query) + 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 () { + toFormattedJSON (): Account { const actor = this.Actor.toFormattedJSON() const account = { id: this.id, + displayName: this.getDisplayName(), + description: this.description, createdAt: this.createdAt, updatedAt: this.updatedAt } @@ -223,10 +267,18 @@ export class AccountModel extends Model { } toActivityPubObject () { - return this.Actor.toActivityPubObject(this.name, this.uuid, '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 + } }