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.
110 lines
4.5 KiB
110 lines
4.5 KiB
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);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|