From 07ea8a7acf74999ac6b54e8b61e970920f4c92b2 Mon Sep 17 00:00:00 2001 From: t123yh Date: Sun, 27 Aug 2017 22:11:25 +0800 Subject: [PATCH] Add models for rating. --- config-example.json | 3 +- models/rating_calculation.js | 80 ++++++++++++++++++++++++++++++++++++ models/rating_history.js | 80 ++++++++++++++++++++++++++++++++++++ models/user.js | 6 ++- 4 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 models/rating_calculation.js create mode 100644 models/rating_history.js diff --git a/config-example.json b/config-example.json index 8a55fb5..b837917 100644 --- a/config-example.json +++ b/config-example.json @@ -22,7 +22,8 @@ "memory_limit": 256 }, "user": { - "show": true + "show": true, + "rating": 1500 } }, "limit": { diff --git a/models/rating_calculation.js b/models/rating_calculation.js new file mode 100644 index 0000000..f7bda22 --- /dev/null +++ b/models/rating_calculation.js @@ -0,0 +1,80 @@ +/* + * 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'); + +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; + } + + 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; diff --git a/models/rating_history.js b/models/rating_history.js new file mode 100644 index 0000000..baece21 --- /dev/null +++ b/models/rating_history.js @@ -0,0 +1,80 @@ +/* + * 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'); +const User = syzoj.model('user'); +let db = syzoj.db; + +let model = db.define('rating_history', { + rating_calculation_id: { + type: Sequelize.INTEGER, + primaryKey: true, + references: { + model: 'rating_calculation', + key: 'id' + } + }, + user_id: { + type: Sequelize.INTEGER, + primaryKey: true, + references: { + model: 'user', + key: 'id' + } + }, + rating_after: { type: Sequelize.INTEGER }, +}, { + timestamps: false, + tableName: 'rating_history', + indexes: [ + { + fields: ['rating_calculation_id'] + }, + { + fields: ['user_id'] + }, + ] + }); + +let Model = require('./common'); +class RatingHistory extends Model { + static async create(rating_calculation_id, user_id, rating) { + const newRecord = await RatingHistory.model.create({ + rating_calculation_id: rating_calculation_id, + user_id: user_id, + rating_after: rating + }); + await newRecord.loadRelationShips(); + newRecord.user.rating = rating; + await newRecord.user.save(); + return newRecord; + } + + async loadRelationShips() { + this.user = await User.fromID(this.user_id); + } + + getModel() { return model; } +} + +RatingHistory.model = model; + +module.exports = RatingHistory; diff --git a/models/user.js b/models/user.js index 5704fc8..985604f 100644 --- a/models/user.js +++ b/models/user.js @@ -39,7 +39,8 @@ let model = db.define('user', { is_show: { type: Sequelize.BOOLEAN }, public_email: { type: Sequelize.BOOLEAN }, - sex: { type: Sequelize.INTEGER } + sex: { type: Sequelize.INTEGER }, + rating: { type: Sequelize.INTEGER } }, { timestamps: false, tableName: 'user', @@ -70,7 +71,8 @@ class User extends Model { ac_num: 0, submit_num: 0, sex: 0, - is_show: syzoj.config.default.user.show + is_show: syzoj.config.default.user.show, + rating: syzoj.config.default.user.rating }, val))); }