X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fserver%2Fserver.ts;h=8b07115f1f810a43c0403f7ef7b75b3702ff64a0;hb=a30a136c9896c656cab98d2c92cde32c534dc098;hp=ebd216b082c81ed1103b61d6332b542bd1ac5fe3;hpb=c60774b05b12d262ed27d8efeb0905ac283eeebb;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/server/server.ts b/server/models/server/server.ts index ebd216b08..8b07115f1 100644 --- a/server/models/server/server.ts +++ b/server/models/server/server.ts @@ -1,124 +1,83 @@ -import * as Sequelize from 'sequelize' -import { isHostValid, logger } from '../../helpers' -import { SERVERS_SCORE } from '../../initializers' -import { addMethodsToModel } from '../utils' -import { ServerAttributes, ServerInstance, ServerMethods } from './server-interface' - -let Server: Sequelize.Model -let updateServersScoreAndRemoveBadOnes: ServerMethods.UpdateServersScoreAndRemoveBadOnes - -export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { - Server = sequelize.define('Server', +import { AllowNull, Column, CreatedAt, Default, HasMany, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' +import { isHostValid } from '../../helpers/custom-validators/servers' +import { ActorModel } from '../activitypub/actor' +import { throwIfNotValid } from '../utils' +import { ServerBlocklistModel } from './server-blocklist' +import * as Bluebird from 'bluebird' +import { MServer, MServerFormattable } from '@server/typings/models/server' + +@Table({ + tableName: 'server', + indexes: [ { - host: { - type: DataTypes.STRING, - allowNull: false, - validate: { - isHost: value => { - const res = isHostValid(value) - if (res === false) throw new Error('Host not valid.') - } - } - }, - score: { - type: DataTypes.INTEGER, - defaultValue: SERVERS_SCORE.BASE, - allowNull: false, - validate: { - isInt: true, - max: SERVERS_SCORE.MAX - } - } - }, - { - indexes: [ - { - fields: [ 'host' ], - unique: true - }, - { - fields: [ 'score' ] - } - ] + fields: [ 'host' ], + unique: true } - ) - - const classMethods = [ - updateServersScoreAndRemoveBadOnes ] - addMethodsToModel(Server, classMethods) - - return Server -} - -// ------------------------------ Statics ------------------------------ +}) +export class ServerModel extends Model { -updateServersScoreAndRemoveBadOnes = function (goodServers: number[], badServers: number[]) { - logger.info('Updating %d good servers and %d bad servers scores.', goodServers.length, badServers.length) - - if (goodServers.length !== 0) { - incrementScores(goodServers, SERVERS_SCORE.BONUS).catch(err => { - logger.error('Cannot increment scores of good servers.', err) - }) - } - - if (badServers.length !== 0) { - incrementScores(badServers, SERVERS_SCORE.PENALTY) - .then(() => removeBadServers()) - .catch(err => { - if (err) logger.error('Cannot decrement scores of bad servers.', err) - }) - } -} + @AllowNull(false) + @Is('Host', value => throwIfNotValid(value, isHostValid, 'valid host')) + @Column + host: string -// --------------------------------------------------------------------------- + @AllowNull(false) + @Default(false) + @Column + redundancyAllowed: boolean -// Remove servers with a score of 0 (too many requests where they were unreachable) -async function removeBadServers () { - try { - const servers = await listBadServers() + @CreatedAt + createdAt: Date - const serversRemovePromises = servers.map(server => server.destroy()) - await Promise.all(serversRemovePromises) + @UpdatedAt + updatedAt: Date - const numberOfServersRemoved = servers.length - - if (numberOfServersRemoved) { - logger.info('Removed %d servers.', numberOfServersRemoved) - } else { - logger.info('No need to remove bad servers.') + @HasMany(() => ActorModel, { + foreignKey: { + name: 'serverId', + allowNull: true + }, + onDelete: 'CASCADE', + hooks: true + }) + Actors: ActorModel[] + + @HasMany(() => ServerBlocklistModel, { + foreignKey: { + allowNull: false + }, + onDelete: 'CASCADE' + }) + BlockedByAccounts: ServerBlocklistModel[] + + static load (id: number): Bluebird { + const query = { + where: { + id + } } - } catch (err) { - logger.error('Cannot remove bad servers.', err) - } -} -function incrementScores (ids: number[], value: number) { - const update = { - score: Sequelize.literal('score +' + value) + return ServerModel.findOne(query) } - const options = { - where: { - id: { - [Sequelize.Op.in]: ids + static loadByHost (host: string): Bluebird { + const query = { + where: { + host } - }, - // In this case score is a literal and not an integer so we do not validate it - validate: false + } + + return ServerModel.findOne(query) } - return Server.update(update, options) -} + isBlocked () { + return this.BlockedByAccounts && this.BlockedByAccounts.length !== 0 + } -function listBadServers () { - const query = { - where: { - score: { - [Sequelize.Op.lte]: 0 - } + toFormattedJSON (this: MServerFormattable) { + return { + host: this.host } } - - return Server.findAll(query) }