public object PostTransfer(long id, [FromBody] JObject transferInfo)
        {
            if (!IsValidInt(transferInfo["amount"]))
            {
                return(BadRequest("Invalid information for a new transaction."));
            }
            int transferAmount = transferInfo["amount"].ToObject <int>();

            try
            {
                var transfer = _database.TransferPoints(id, transferAmount);
                return(new
                {
                    Id = transfer.TransferId,
                    transfer.UserId,
                    transfer.Amount
                });
            }
            catch (InsufficientPointsException)
            {
                return(BadRequest("There is not enough points for this user."));
            }
            catch (InvalidOperationException)
            {
                return(NotFound("User not found."));
            }
        }
        public void TransferPointsInsufficientPointsTest()
        {
            var loyalty = new LoyaltyManager(_context);
            var user    = loyalty.CreateUser("George", "Clooney", "*****@*****.**");

            Assert.AreEqual(0, user.Points);

            loyalty.TransferPoints(user.UserId, -10);
            var queriedUser = loyalty.GetUser(user.UserId);

            Assert.AreEqual(10, user.Points);
        }
        public void TransferPointsTest()
        {
            var loyalty = new LoyaltyManager(_context);
            var user    = loyalty.CreateUser("George", "Orwell", "*****@*****.**");

            Assert.AreEqual(0, user.Points);

            var transfer    = loyalty.TransferPoints(user.UserId, 10);
            var queriedUser = loyalty.GetUser(user.UserId);

            Assert.AreEqual(10, user.Points);
            Assert.AreEqual(10, transfer.Amount);

            var queriedTransfer = loyalty.EnumerateTransfers(user.UserId).Last();

            Assert.AreEqual(transfer.TransferId, queriedTransfer.TransferId);
            Assert.AreEqual(10, queriedTransfer.Amount);
        }