using Knoks.Api.Controllers.Base;
using Knoks.Api.Entities;
using Knoks.Api.Filters;
using Knoks.Core.Data.Interfaces;
using Knoks.Core.Entities;
using Knoks.Core.Entities.Args;
using Knoks.Core.Logic.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
using System.Threading.Tasks;
namespace Knoks.Api.Controllers
{
[Route("v1/[controller]")]
public class KnokController : UserController
{
#region Fields
private readonly IKnokManager _knokManager;
private readonly IAccountTransactionManager _accountTransManager;
private readonly IUserManager _userManager;
private readonly IAccountDao _accountDao;
private readonly IKnokSettings _settings;
private readonly IExchangeManager _exchangeManager;
private readonly IKnokPricelManager _knokPriceManager;
#endregion
///
/// ctor
///
///
///
///
///
///
///
///
public KnokController(IKnokManager knokManager, IAccountTransactionManager accountTransManager, IUserManager userManager,
IAccountDao accountDao, IExchangeManager exchangeManager, IKnokSettings settings, IKnokPricelManager knokPriceManager)
{
_knokManager = knokManager;
_accountTransManager = accountTransManager;
_userManager = userManager;
_accountDao = accountDao;
_exchangeManager = exchangeManager;
_knokPriceManager = knokPriceManager;
_settings = settings;
}
[HttpPost("GetKnokPrice")]
[ApiValidation]
public async Task KnokPriceCalc([FromBody]CreateKnokArgs args)
{
return await _knokPriceManager.TotalPrice(args, UserId);
}
[HttpPost("CreateKnok")]
[ApiValidation]
public async Task CreateKnok([FromBody]CreateKnokArgs args)
{
//Get choosen pair rate and save it to live chart data for the initial rate chart drawing
var tickerData = await this._exchangeManager.GetTickerData(args.ExchangeId, args.Currency1, args.Currency2);
var currentPrice = tickerData?.Close ?? 0;
//Create knok
var knokRate = _knokManager.KnokRatingCalc(args);
args.Rate = knokRate.Total;
args.PotentialProfitValue = knokRate.PotentialProfitValue / 100;
args.PotentialProfit = knokRate.PotentialProfit;
var result = await _knokManager.Process(args, currentPrice);
//Publish knok
var userAccounts = await _accountDao.GetUserAccounts(UserId);
return await _knokManager.PublishKnok(result.KnokId.Value, userAccounts.User, userAccounts.Accounts.FirstOrDefault(), knokRate.Price, args);
}
[HttpPost("ValidateKnok")]
public async Task> ValidateKnok([FromBody]CreateKnokArgs args)
{
return new ApiObject(await _knokManager.Validate(args));
}
[HttpPost("RateKnok")]
public ApiObject RateKnok([FromBody]CreateKnokArgs args)
{
return new ApiObject(_knokManager.KnokRatingCalc(args));
}
[HttpGet("{knokId}")]
public Task GetKnok([FromRoute]int knokId)
{
return _knokManager.GetKnok(knokId, ContextUserId);
}
[HttpGet("GetKnok/{knokId}")]
public async Task GetKnokFull([FromRoute]int knokId, [FromQuery] int userId)
{
return await _knokManager.GetKnokFull(knokId, userId);
}
[HttpGet("{knokId:int}/files/{*fileName}")]
[AllowAnonymous]
public FileStreamResult GetFiles([FromRoute]int knokId, [FromRoute] string fileName)
{
var result = _knokManager.GetFile(knokId, fileName);
if (result.ContentType == null)
{
if (new Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider().TryGetContentType(fileName, out var temp))
{
result.ContentType = temp;
}
}
return File(result.File, result.ContentType, /*result.FileDownloadName, */result.LastModified, null);// "image/png");
//return File(result.File, result.ContentType, result.FileDownloadName, result.LastModified, null);// "image/png");
//TODO: check that content type is not added twice
}
[HttpGet("feed")]
public async Task> GetPublicKnoks()
{
return await GetPublicKnoksPost(new KnokFeedArgs() { UserId = this.ContextUserId.Value });
}
[HttpPost("track")]
public async Task> GetOngoingKnoks([FromBody] KnokOngoingArgs args)
{
return new ApiArray(await _knokManager.GetAliveKnoks(args));
}
[HttpPost("currentlypublished")]
public async Task> GetCurrentlyPublishedKnoks([FromBody] KnokCurrentlyPublishedArgs args)
{
return new ApiArray(await _knokManager.GetCurrentlyPublishedKnoks(args, UserId));
}
[HttpPost("feed")]
public async Task> GetPublicKnoksPost([FromBody] KnokFeedArgs args)
{
return ApiArray(await _knokManager.GetPublicKnoks(args));
}
[HttpGet("ownfeed")]
public async Task GetOwnKnokData()
{
return await _knokManager.GetOwnData(this.UserId);
}
[HttpPost("purchase/{knokId}")]
public async Task> PurchaseKnok([FromRoute]int knokId)
{
var userAccounts = await _accountDao.GetUserAccounts(UserId);
await _knokManager.PurchaseKnok(knokId, userAccounts.User, userAccounts.Accounts.FirstOrDefault());
return new ApiObject(true);
}
[HttpGet("knokser/{knokserId}")]
public async Task GetKnokserProfile([FromRoute]long knokserId)
{
return await _knokManager.GetKnokserProfile(knokserId);
}
[HttpPost("ended")]
public async Task> GetEndedKnoks([FromBody] KnokEndedArgs args)
{
return new ApiArray(await _knokManager.GetEndedKnoks(args));
}
[HttpPost("pastpublished")]
public async Task> GetPastPublishedKnoks([FromBody] KnokPastPublishedArgs args)
{
return new ApiArray(await _knokManager.GetPastPublishedKnoks(args, UserId));
}
}
}