const deallocateUsers = function()

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.");
                });
            }
        });
    }
};