async function updateXP()

in backend/Functions/Main/playerprogression_put/app.js [40:90]


async function updateXP(playerName, experience, wins) {
  const Key = { playerName };
  let current;
  try {
    current = await ddb.get({
      TableName: playerProgressTable,
      Key,
    }).promise();
  } catch (e) {
    console.error(`Error getting player record ${JSON.stringify(e.stack)}`);
    console.error(`get${JSON.stringify(Key)}`);
  }
  let result;
  if (!Object.prototype.hasOwnProperty.call(current, 'Item')) {
    // no item was retrieved - player has no current progress
    const level = await getLevel(experience);
    const parms = {
      TableName: playerProgressTable,
      Item: {
        playerName, experience, level, wins,
      },
    };
    try {
      result = await ddb.put(parms).promise();
    } catch (e) {
      console.error(`error storing ${playerName} - ${experience.toString()}`);
      console.error(`${JSON.stringify(e.stack)}`);
    }
  } else {
    const newxp = current.Item.experience + experience;
    const newwins = current.Item.wins + wins;
    const newlevel = await getLevel(newxp);
    const updateParms = {
      TableName: playerProgressTable,
      Key: { playerName },
      ExpressionAttributeNames: { '#xp': 'experience', '#lvl': 'level', '#wins': 'wins' },
      ExpressionAttributeValues: {
        ':xp': newxp, ':lvl': newlevel, ':wins': newwins, ':curxp': current.Item.experience,
      },
      ConditionExpression: '#xp = :curxp',
      UpdateExpression: 'set #xp = :xp, #lvl = :lvl, #wins = :wins',
    };
    try {
      result = await ddb.update(updateParms).promise();
    } catch (e) {
      console.error(`error updating xp for ${playerName} - ${newxp.toString}`);
      console.error(`Error: ${JSON.stringify(e.stack)}`);
    }
  }
  return result;
}