using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Net.Http.Headers; using Teso_API.Methods.Controllers; using Teso_API.Models; namespace Teso_API.Controllers { [AllowAnonymous, Route("coins")] [ApiController] public class CoinController : ControllerBase { private readonly TESOContext _context; public CoinController(TESOContext context) { _context = context; } [Authorize] [Route("purchase_silver"), HttpPost] public async Task> PurchaseSilver(SilverPurchaseRequest request) { var accessToken = Request.Headers[HeaderNames.Authorization]; string token = accessToken; token = token.Substring(6).Trim(); var handler = new JwtSecurityTokenHandler(); var jwtToken = handler.ReadToken(token) as JwtSecurityToken; string userID = jwtToken.Claims.First(claim => claim.Type == "userGUID").Value; UserFinance coin = await _context.UserFinances.AsQueryable().Where(u => u.UserGUID == userID).FirstOrDefaultAsync(); try { if (request.method == "gold") { SilverPurchaseRate requestItem = ServerLocation.purchaseRates.Where(c => c.silverCoin == request.coinamount).FirstOrDefault(); int silver = requestItem.silverCoin; int gold = requestItem.goldCoin.Value; if (coin != null && (coin.Gold - gold) >= 0) { coin.Gold -= gold; coin.Silver += silver; UserTransaction transactionCredit = new UserTransaction { CoinAmount =silver, CoinType = await _context.CoinTypes.AsQueryable().Where(c => c.TypeName.ToLower().Contains("silver")).Select(c => c.TypeCode).FirstOrDefaultAsync(), Comments = "silver coins purchase", RealCash = 0, Timestamp = DateTime.Now, TransactionType = await _context.TransactionTypes.AsQueryable().Where(t => t.TypeName.ToLower().Contains("silver credit")).Select(t => t.TypeCode).FirstOrDefaultAsync(), UserGUID = userID, TransactionID = String.Format("{0:d9}", (DateTime.Now.Ticks / 10) % 10000000) + " - Credit" }; UserTransaction transactionDebit = new UserTransaction { CoinAmount = gold, CoinType = await _context.CoinTypes.AsQueryable().Where(c => c.TypeName.ToLower().Contains("gold")).Select(c => c.TypeCode).FirstOrDefaultAsync(), Comments = "silver coins purchase", RealCash = 0, Timestamp = DateTime.Now, TransactionType = await _context.TransactionTypes.AsQueryable().Where(t => t.TypeName.ToLower().Contains("gold debit")).Select(t => t.TypeCode).FirstOrDefaultAsync(), UserGUID = userID, TransactionID = String.Format("{0:d9}", (DateTime.Now.Ticks / 10) % 10000000) + " - Debit" }; bool possible = await SilverBankOperations.WithdrawFromBank(silver, _context); if (possible) { _context.UserTransactions.AddRange(transactionCredit, transactionDebit); await _context.SaveChangesAsync(); return coin; } else { return StatusCode(500); } } else { return StatusCode(300); } } else if (request.method == "realcash") { return StatusCode(1); } return StatusCode(1); } catch(Exception ex) { return StatusCode(500); } } } }