ql-stats-models
Version:
Document schemas for Quake Live Statistics and Ranks
101 lines (84 loc) • 3.44 kB
JavaScript
var Promise = require('bluebird'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
module.exports = function (db) {
var PlayerMatchStats,
playerMatchStatsSchema = new Schema({
game_rank: {
before: {},
after: {}
},
player: {type: mongoose.Schema.Types.ObjectId, ref: 'Player', required: true},
match: {type: mongoose.Schema.Types.ObjectId, ref: 'MatchReport', required: true},
game_stats: {type: mongoose.Schema.Types.ObjectId, ref: 'GameStats', required: true},
game_type: String,
aborted: Boolean,
match_guid: {type: String, required: true, index: true},
steam_id: {type: String, required: true, index: true},
nick: String,
warmup: {type: Boolean, required: true },
team: Number,
// Rank
rank: Number,
team_rank: Number,
tied_rank: Number,
tied_team_rank: Number
});
playerMatchStatsSchema.statics.findByMatchGuid = function (guids) {
return PlayerMatchStats.find()
.where('match_guid')
.in(guids)
.populate('player match game_stats')
.exec();
};
playerMatchStatsSchema.statics.findBySteamId = function (steamId) {
return PlayerMatchStats.find()
.where('steam_id', steamId)
.exec();
};
playerMatchStatsSchema.statics.findBySteamIdAndMatchGuid = function (steam_id, match_guid) {
return PlayerMatchStats.findOne()
.where('steam_id', steam_id)
.where('match_guid', match_guid)
.exec()
};
playerMatchStatsSchema.statics.createWithPlayerStats = function (playerStats) {
var steam_id = playerStats.DATA.STEAM_ID,
match_guid = playerStats.DATA.MATCH_GUID,
Player = db.model('Player'),
GameStats = db.model('GameStats'),
MatchReport = db.model('MatchReport');
function createPlayerMatchStats (player, match, gameStats) {
var playerMatchStats = new PlayerMatchStats({
steam_id: steam_id,
match_guid: match_guid,
player: player,
match: match,
game_stats: gameStats,
game_rank: {
before: {}
},
game_type: match.game_type,
aborted: playerStats.DATA.ABORTED,
nick: playerStats.DATA.NAME,
warmup: playerStats.DATA.WARMUP,
rank: playerStats.DATA.RANK,
team_rank: playerStats.DATA.RANK,
tied_rank: playerStats.DATA.TIED_RANK || 0,
tied_team_rank: playerStats.DATA.TIAD_TEAM_RANK || 0
});
return playerMatchStats.save();
}
return Promise.all([
Player.findBySteamId(steam_id),
MatchReport.findByMatchGuid(match_guid),
GameStats.createWithPlayerStats(playerStats)
])
.spread(createPlayerMatchStats);
};
PlayerMatchStats = db.model('PlayerMatchStats', playerMatchStatsSchema);
PlayerMatchStats.schema.path('warmup').validate(function (value) {
return value === false;
}, 'Warmup needs to be set to false.');
return PlayerMatchStats;
};