public ServiceOperationResult TipUser(OctoUser from, OctoUser to, decimal amount, string reason)
        {
            if (amount <= 0)
                return ServiceOperationResult.Fail("Amount must be greater than 0");

            if (from.Money < amount)
                return ServiceOperationResult.Fail("Not enough money");

            from.Money -= amount;
            to.Money += amount;

            var trnx = new Transaction()
            {
                Amount = amount,
                CreditedUser = to,
                DebitedUser = from,
                CreatedAt = DateTimeOffset.Now,
                Code = TransactionCode.Tip,
                Reason = reason ?? "Tip",
            };

            _repo.Insert(trnx);

            return ServiceOperationResult.Ok;
        }
        public ServiceOperationResult AdjustBalance(OctoUser user, decimal amount, string reason)
        {
            if (string.IsNullOrWhiteSpace(reason))
                return ServiceOperationResult.Fail("A reason must be specified");

            if (amount == 0)
                return ServiceOperationResult.Fail("Cannot adjust a users balance by zero");

            if (user.Money + amount < 0)
                return ServiceOperationResult.Fail("Cannot award money that would push user into a negative balance");

            user.Money += amount;

            var trnx = new Transaction()
            {
                Amount = Math.Abs(amount),
                Code = TransactionCode.Adjustment,
                Reason = reason,
                CreatedAt = DateTimeOffset.Now,
            };

            if (amount < 0)
                trnx.DebitedUser = user;
            else
                trnx.CreditedUser = user;

            _repo.Insert(trnx);

            return ServiceOperationResult.Ok;
        }
 public static ItemOwnershipHistory Create(ItemInstance item, OctoUser receiver, string reason)
 {
     return new ItemOwnershipHistory()
     {
         Reason = reason,
         Receiver = receiver,
         ItemInstance = item,
         ReceivedAt = DateTimeOffset.Now,
     };
 }
 public static ItemInstance Create(OctoUser owner, ItemDefinition item, string reason)
 {
     return new ItemInstance()
     {
         Owner = owner,
         Item = item,
         History = new List<ItemOwnershipHistory>()
         {
             new ItemOwnershipHistory()
             {
                 Reason = reason,
                 ReceivedAt = DateTimeOffset.Now,
                 Receiver = owner,
             }
         },
     };
 }