Browse Source

Add models for rating.

master
t123yh 7 years ago
parent
commit
07ea8a7acf
  1. 3
      config-example.json
  2. 80
      models/rating_calculation.js
  3. 80
      models/rating_history.js
  4. 6
      models/user.js

3
config-example.json

@ -22,7 +22,8 @@
"memory_limit": 256 "memory_limit": 256
}, },
"user": { "user": {
"show": true "show": true,
"rating": 1500
} }
}, },
"limit": { "limit": {

80
models/rating_calculation.js

@ -0,0 +1,80 @@
/*
* This file is part of SYZOJ.
*
* Copyright (c) 2017 t123yh <t123yh@outlook.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
'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;

80
models/rating_history.js

@ -0,0 +1,80 @@
/*
* This file is part of SYZOJ.
*
* Copyright (c) 2017 t123yh <t123yh@outlook.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
'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;

6
models/user.js

@ -39,7 +39,8 @@ let model = db.define('user', {
is_show: { type: Sequelize.BOOLEAN }, is_show: { type: Sequelize.BOOLEAN },
public_email: { type: Sequelize.BOOLEAN }, public_email: { type: Sequelize.BOOLEAN },
sex: { type: Sequelize.INTEGER } sex: { type: Sequelize.INTEGER },
rating: { type: Sequelize.INTEGER }
}, { }, {
timestamps: false, timestamps: false,
tableName: 'user', tableName: 'user',
@ -70,7 +71,8 @@ class User extends Model {
ac_num: 0, ac_num: 0,
submit_num: 0, submit_num: 0,
sex: 0, sex: 0,
is_show: syzoj.config.default.user.show is_show: syzoj.config.default.user.show,
rating: syzoj.config.default.user.rating
}, val))); }, val)));
} }

Loading…
Cancel
Save