X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fmodels%2Fserver%2Fserver.ts;h=25d9924fb33e7f91b8fc1f8bb6be01fa002ea8cb;hb=16c016e8b1d5ca46343d3363f9a49e24c5d7c944;hp=75cd5f929bfe49c0e251a9b1961a13f689302c11;hpb=39445ead45aaaea801ec09991b8dd2464f722e47;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/server/server.ts b/server/models/server/server.ts index 75cd5f929..25d9924fb 100644 --- a/server/models/server/server.ts +++ b/server/models/server/server.ts @@ -1,124 +1,90 @@ -import * as Sequelize from 'sequelize' -import { isHostValid, logger } from '../../helpers' -import { FRIEND_SCORE, 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 { MServer, MServerFormattable } from '@server/types/models/server' +import { AttributesOnly } from '@shared/core-utils' +import { isHostValid } from '../../helpers/custom-validators/servers' +import { ActorModel } from '../actor/actor' +import { throwIfNotValid } from '../utils' +import { ServerBlocklistModel } from './server-blocklist' + +@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: FRIEND_SCORE.BASE, - allowNull: false, - validate: { - isInt: true, - max: FRIEND_SCORE.MAX - } - } - }, - { - indexes: [ - { - fields: [ 'host' ], - unique: true - }, - { - fields: [ 'score' ] - } - ] + fields: [ 'host' ], + unique: true } - ) - - const classMethods = [ - listBadServers ] - addMethodsToModel(Server, classMethods) - - return Server -} +}) +export class ServerModel extends Model>> { -// ------------------------------ Statics ------------------------------ + @AllowNull(false) + @Is('Host', value => throwIfNotValid(value, isHostValid, 'valid host')) + @Column + host: string -updateServersScoreAndRemoveBadOnes = function (goodServers: number[], badServers: number[]) { - logger.info('Updating %d good servers and %d bad servers scores.', goodServers.length, badServers.length) + @AllowNull(false) + @Default(false) + @Column + redundancyAllowed: boolean - if (goodServers.length !== 0) { - incrementScores(goodServers, SERVERS_SCORE.BONUS).catch(err => { - logger.error('Cannot increment scores of good servers.', err) - }) - } + @CreatedAt + createdAt: Date - if (badServers.length !== 0) { - incrementScores(badServers, SERVERS_SCORE.PENALTY) - .then(() => removeBadServers()) - .catch(err => { - if (err) logger.error('Cannot decrement scores of bad servers.', err) - }) - } -} + @UpdatedAt + updatedAt: Date -// --------------------------------------------------------------------------- - -// Remove servers with a score of 0 (too many requests where they were unreachable) -async function removeBadServers () { - try { - const servers = await listBadServers() - - const serversRemovePromises = servers.map(server => server.destroy()) - await Promise.all(serversRemovePromises) + @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): Promise { + const query = { + where: { + id + } + } - const numberOfServersRemoved = servers.length + return ServerModel.findOne(query) + } - 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) - } -} -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 - } - }, - // In this case score is a literal and not an integer so we do not validate it - validate: false + static async loadOrCreateByHost (host: string) { + let server = await ServerModel.loadByHost(host) + if (!server) server = await ServerModel.create({ host }) + + return server } - 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) }