X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fserver%2Fserver.ts;h=25d9924fb33e7f91b8fc1f8bb6be01fa002ea8cb;hb=5ec3cbdf22fc88ebe57f370fc0bc0e3df7453458;hp=edfd8010b9f5e6b8fd67ae36871c7c6366b569ac;hpb=3fd3ab2d34d512b160a5e6084d7609be7b4f4452;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/server/server.ts b/server/models/server/server.ts index edfd8010b..25d9924fb 100644 --- a/server/models/server/server.ts +++ b/server/models/server/server.ts @@ -1,9 +1,10 @@ -import * as Sequelize from 'sequelize' -import { AllowNull, Column, CreatedAt, Default, Is, IsInt, Max, Model, Table, UpdatedAt } from 'sequelize-typescript' -import { logger } from '../../helpers' +import { AllowNull, Column, CreatedAt, Default, HasMany, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' +import { MServer, MServerFormattable } from '@server/types/models/server' +import { AttributesOnly } from '@shared/core-utils' import { isHostValid } from '../../helpers/custom-validators/servers' -import { SERVERS_SCORE } from '../../initializers' +import { ActorModel } from '../actor/actor' import { throwIfNotValid } from '../utils' +import { ServerBlocklistModel } from './server-blocklist' @Table({ tableName: 'server', @@ -11,13 +12,10 @@ import { throwIfNotValid } from '../utils' { fields: [ 'host' ], unique: true - }, - { - fields: [ 'score' ] } ] }) -export class ServerModel extends Model { +export class ServerModel extends Model>> { @AllowNull(false) @Is('Host', value => throwIfNotValid(value, isHostValid, 'valid host')) @@ -25,11 +23,9 @@ export class ServerModel extends Model { host: string @AllowNull(false) - @Default(SERVERS_SCORE.BASE) - @IsInt - @Max(SERVERS_SCORE.MAX) + @Default(false) @Column - score: number + redundancyAllowed: boolean @CreatedAt createdAt: Date @@ -37,73 +33,58 @@ export class ServerModel extends Model { @UpdatedAt updatedAt: Date - static updateServersScoreAndRemoveBadOnes (goodServers: number[], badServers: number[]) { - logger.info('Updating %d good servers and %d bad servers scores.', goodServers.length, badServers.length) + @HasMany(() => ActorModel, { + foreignKey: { + name: 'serverId', + allowNull: true + }, + onDelete: 'CASCADE', + hooks: true + }) + Actors: ActorModel[] + + @HasMany(() => ServerBlocklistModel, { + foreignKey: { + allowNull: false + }, + onDelete: 'CASCADE' + }) + BlockedByAccounts: ServerBlocklistModel[] - if (goodServers.length !== 0) { - ServerModel.incrementScores(goodServers, SERVERS_SCORE.BONUS) - .catch(err => { - logger.error('Cannot increment scores of good servers.', err) - }) + static load (id: number): Promise { + const query = { + where: { + id + } } - if (badServers.length !== 0) { - ServerModel.incrementScores(badServers, SERVERS_SCORE.PENALTY) - .then(() => ServerModel.removeBadServers()) - .catch(err => { - if (err) logger.error('Cannot decrement scores of bad servers.', err) - }) - - } + return ServerModel.findOne(query) } - // Remove servers with a score of 0 (too many requests where they were unreachable) - private static async removeBadServers () { - try { - const servers = await ServerModel.listBadServers() - - const serversRemovePromises = servers.map(server => server.destroy()) - await Promise.all(serversRemovePromises) - - const numberOfServersRemoved = servers.length - - if (numberOfServersRemoved) { - logger.info('Removed %d servers.', numberOfServersRemoved) - } else { - logger.info('No need to remove bad servers.') + static loadByHost (host: string): Promise { + const query = { + where: { + host } - } catch (err) { - logger.error('Cannot remove bad servers.', err) } + + return ServerModel.findOne(query) } - private static incrementScores (ids: number[], value: number) { - const update = { - score: Sequelize.literal('score +' + value) - } + static async loadOrCreateByHost (host: string) { + let server = await ServerModel.loadByHost(host) + if (!server) server = await ServerModel.create({ host }) - const options = { - where: { - id: { - [Sequelize.Op.in]: ids - } - }, - // In this case score is a literal and not an integer so we do not validate it - validate: false - } + return server + } - return ServerModel.update(update, options) + isBlocked () { + return this.BlockedByAccounts && this.BlockedByAccounts.length !== 0 } - private static listBadServers () { - const query = { - where: { - score: { - [Sequelize.Op.lte]: 0 - } - } + toFormattedJSON (this: MServerFormattable) { + return { + host: this.host } - - return ServerModel.findAll(query) } }