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)); } } }