in infrastructure/cdk/lambdas/scoreboard/index.js [70:123]
const deallocateUsers = function (zeroeds, sessionId, callback) {
if (!zeroeds) callback(null,"Nothing to do");
else {
let sessionControlTable = process.env.SESSION_CONTROL_TABLENAME;
let readSessionControlParam = {
"TableName": sessionControlTable,
"Key": { "SessionId": sessionId }
};
DynamoDB.get(readSessionControlParam, function (err, getData) {
if (err) callback(err);
else {
let sessionControl = getData.Item;
// update PlayingGamers state
sessionControl.PlayingGamers = sessionControl.PlayingGamers.filter(
(gamer) => {
return "undefined" == typeof(zeroeds.find( (zeroedRecord) => { return gamer == zeroedRecord.Nickname } ));
}
);
// update FinishedGamers state - Implemented in a way to prevent deallocation failures
// (1) find those who are not in the list of already finished gamers
let zeroedToBeAdded = zeroeds.filter(
(zeroedRecord) => {
return "undefined" == typeof(sessionControl.FinishedGamers.find( (nickname) => { return nickname == zeroedRecord.Nickname } ));
}
);
// (2) Add them to the list of finished gamers
sessionControl.FinishedGamers = sessionControl.FinishedGamers.concat( zeroedToBeAdded.map( (zeroedRecord) => { return zeroedRecord.Nickname } ) );
let newNumberOfOccupiedSeats = sessionControl.PlayingGamers.length;
let params = {
"TableName": sessionControlTable,
"Key": { "SessionId": sessionControl.SessionId },
"UpdateExpression": "SET OccupiedSeats = :n, PlayingGamers = :p, FinishedGamers = :f",
"ConditionExpression": "OccupiedSeats = :o",
'ExpressionAttributeValues': {
":n": newNumberOfOccupiedSeats,
":p": sessionControl.PlayingGamers,
":o": sessionControl.OccupiedSeats,
":f": sessionControl.FinishedGamers
}
};
DynamoDB.update(params, function (err, _) {
if (err) {
let message = "Error in deallocating users";
console.log(message);
console.log(zeroeds);
console.log(err);
callback(new Error(message),err);
}
else callback(null, "Success deallocating "+ zeroeds.length +" users.");
});
}
});
}
};