const allocateSeatForGamer = function()

in infrastructure/cdk/lambdas/allocateGamer/index.js [71:128]


const allocateSeatForGamer = function (gamerUsername, session, sessionControl, callback) {
    let gamerIsAlreadyPlaying = ((sessionControl.PlayingGamers.findIndex((r) => { return (r == gamerUsername) })) != -1 ? true : false);
    let gamerHasAlreadyPlayed = ((sessionControl.FinishedGamers.findIndex((r) => { return (r == gamerUsername) })) != -1 ? true : false);
    if (gamerIsAlreadyPlaying) {
        let message = "Gamer is already playing";
        console.log(message);
        // If game is already playing, let's let he keep playing
        callback(null,"Keep playing.");
    }
    else {
        if (gamerHasAlreadyPlayed && (session.GameType == "SINGLE_TRIAL" || session.GameType == "TIME_CONSTRAINED")) {
            let errorMessage = "Session is " + session.GameType + ". Gamer has already played.";
            console.log(errorMessage);
            let responseError = new Error(errorMessage);
            responseError.code = "GamerCannotPlay";
            callback(responseError, 422);
        } 
        else {
            // Session is (MULTIPLE_TRIAL && gamerHasAlreadyPlayed) || !gamerHasAlreadyPlayed
            console.log("Session is (MULTIPLE_TRIAL && gamerHasAlreadyPlayed) || !gamerHasAlreadyPlayed");
            if (sessionControl.OccupiedSeats == sessionControl.TotalSeats) {
                let errorMessage = "No seats available.";
                console.log(errorMessage);
                let responseError = new Error(errorMessage);
                responseError.code = "NoSeatsAvailable";
                callback(responseError, 422);
            }
            else {
                sessionControl.PlayingGamers.push(gamerUsername);
                if (gamerHasAlreadyPlayed)
                    sessionControl.FinishedGamers = sessionControl.FinishedGamers.filter( (g) => { return g!=gamerUsername });
                let newNumberOfOccupiedSeats = sessionControl.OccupiedSeats + 1;
                let tableName = process.env.SESSION_CONTROL_TABLENAME;
                let params = {
                    "TableName": tableName ,
                    "Key": { "SessionId": session.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, data) {
                    if (err) {
                        let message = "Error in allocating seats.";        
                        console.log(message);
                        console.log(err);
                        callback(new Error(message), 422);
                    }
                    else callback(null, ("Success allocating "+gamerUsername));
                });
            }
        }
    }
};