Backend for the Teso project written in 2022
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
4.5 KiB

3 months ago
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<ActionResult<UserFinance>> 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);
}
}
}
}