X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fserver%2Fserver.ts;h=c43146156efad09d366c76df309695ac01ac8f0d;hb=60650c77c8a2a98e92d869b237ae4900f369a8fc;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..c43146156 100644 --- a/server/models/server/server.ts +++ b/server/models/server/server.ts @@ -1,124 +1,26 @@ -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' +import { AllowNull, Column, CreatedAt, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' +import { isHostValid } from '../../helpers/custom-validators/servers' +import { throwIfNotValid } from '../utils' -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 - } - } - }, +@Table({ + tableName: 'server', + indexes: [ { - indexes: [ - { - fields: [ 'host' ], - unique: true - }, - { - fields: [ 'score' ] - } - ] + fields: [ 'host' ], + unique: true } - ) - - const classMethods = [ - listBadServers ] - addMethodsToModel(Server, classMethods) - - return Server -} - -// ------------------------------ Statics ------------------------------ - -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) - }) - } -} - -// --------------------------------------------------------------------------- +}) +export class ServerModel extends Model { -// Remove servers with a score of 0 (too many requests where they were unreachable) -async function removeBadServers () { - try { - const servers = await listBadServers() + @AllowNull(false) + @Is('Host', value => throwIfNotValid(value, isHostValid, 'valid host')) + @Column + host: string - 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.') - } - } catch (err) { - logger.error('Cannot remove bad servers.', err) - } -} - -function incrementScores (ids: number[], value: number) { - const update = { - score: Sequelize.literal('score +' + value) - } - - 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.update(update, options) -} - -function listBadServers () { - const query = { - where: { - score: { - [Sequelize.Op.lte]: 0 - } - } - } + @CreatedAt + createdAt: Date - return Server.findAll(query) + @UpdatedAt + updatedAt: Date }