X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fserver%2Fserver.ts;h=a5e05f460fffcfe90c8026321f6df023c513b121;hb=5e47f6ab984a7d00782e4c7030afffa1ba480add;hp=fcd7be090ee7500fac670288826b7f49cd9c447b;hpb=d4f1e94c89336255537b0b82913591f00e716201;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/server/server.ts b/server/models/server/server.ts index fcd7be090..a5e05f460 100644 --- a/server/models/server/server.ts +++ b/server/models/server/server.ts @@ -1,124 +1,104 @@ -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', - { - 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 - } - } - }, +import { Transaction } from 'sequelize' +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/typescript-utils' +import { isHostValid } from '../../helpers/custom-validators/servers' +import { ActorModel } from '../actor/actor' +import { buildSQLAttributes, throwIfNotValid } from '../shared' +import { ServerBlocklistModel } from './server-blocklist' + +@Table({ + tableName: 'server', + indexes: [ { - indexes: [ - { - fields: [ 'host' ], - unique: true - }, - { - fields: [ 'score' ] - } - ] + fields: [ 'host' ], + unique: true } - ) - - const classMethods = [ - updateServersScoreAndRemoveBadOnes ] - addMethodsToModel(Server, classMethods) +}) +export class ServerModel extends Model>> { - return Server -} + @AllowNull(false) + @Is('Host', value => throwIfNotValid(value, isHostValid, 'valid host')) + @Column + host: string -// ------------------------------ Statics ------------------------------ + @AllowNull(false) + @Default(false) + @Column + redundancyAllowed: boolean -updateServersScoreAndRemoveBadOnes = function (goodServers: number[], badServers: number[]) { - logger.info('Updating %d good servers and %d bad servers scores.', goodServers.length, badServers.length) + @CreatedAt + createdAt: Date - if (goodServers.length !== 0) { - incrementScores(goodServers, SERVERS_SCORE.BONUS).catch(err => { - logger.error('Cannot increment scores of good servers.', err) - }) - } + @UpdatedAt + updatedAt: 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) - }) - } -} - -// --------------------------------------------------------------------------- + @HasMany(() => ActorModel, { + foreignKey: { + name: 'serverId', + allowNull: true + }, + onDelete: 'CASCADE', + hooks: true + }) + Actors: ActorModel[] + + @HasMany(() => ServerBlocklistModel, { + foreignKey: { + allowNull: false + }, + onDelete: 'CASCADE' + }) + BlockedBy: ServerBlocklistModel[] -// 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) + static getSQLAttributes (tableName: string, aliasPrefix = '') { + return buildSQLAttributes({ + model: this, + tableName, + aliasPrefix + }) + } - const numberOfServersRemoved = servers.length + // --------------------------------------------------------------------------- - if (numberOfServersRemoved) { - logger.info('Removed %d servers.', numberOfServersRemoved) - } else { - logger.info('No need to remove bad servers.') + static load (id: number, transaction?: Transaction): Promise { + const query = { + where: { + id + }, + transaction } - } 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): Promise { + 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) -} + static async loadOrCreateByHost (host: string) { + let server = await ServerModel.loadByHost(host) + if (!server) server = await ServerModel.create({ host }) -function listBadServers () { - const query = { - where: { - score: { - [Sequelize.Op.lte]: 0 - } - } + return server } - return Server.findAll(query) + isBlocked () { + return this.BlockedBy && this.BlockedBy.length !== 0 + } + + toFormattedJSON (this: MServerFormattable) { + return { + host: this.host + } + } }