/* * This file is part of SYZOJ. * * Copyright (c) 2017 t123yh * * SYZOJ is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * SYZOJ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public * License along with SYZOJ. If not, see . */ 'use strict'; let Sequelize = require('sequelize'); let db = syzoj.db; const User = syzoj.model('user'); const Contest = syzoj.model('contest'); let model = db.define('rating_calculation', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, contest_id: { type: Sequelize.INTEGER, references: { model: 'contest', key: 'id' } } }, { timestamps: false, tableName: 'rating_calculation', indexes: [ { fields: ['contest_id'] }, ] }); let Model = require('./common'); class RatingCalculation extends Model { static async create(contest_id, newRatingList) { const newItem = await RatingCalculation.model.create({ contest_id: contest_id }); const RatingHistory = syzoj.model('rating_history'); for (const val of newRatingList) { await RatingHistory.create(newItem.id, val.user_id, val.rating); } return newItem; } async loadRelationships() { this.contest = await Contest.fromID(this.contest_id); } getModel() { return model; } async delete() { const RatingHistory = syzoj.model('rating_history'); const histories = await RatingHistory.query(null, { rating_calculation_id: this.rating_calculation_id }); for (const history of histories) { await history.loadRelationships(); const user = history.user; await history.destroy(); const ratingItem = (await RatingHistory.findOne({ where: { user_id: user.id }, order: 'rating_calculation_id DESC' })); user.rating = ratingItem ? ratingItem.rating_after : syzoj.config.default.user.rating; await user.save(); } await this.destroy(); } } RatingCalculation.model = model; module.exports = RatingCalculation;