diff --git a/Modules/ExchangeModule.cs b/Modules/ExchangeModule.cs index 8a4b0c40062b0f8822e1e397b07b06a5f1dd7b56..5b2b1b739dc16b0404d85fb356692d568a6081fc 100644 --- a/Modules/ExchangeModule.cs +++ b/Modules/ExchangeModule.cs @@ -1,10 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; - +using System.Text; using Microsoft.EntityFrameworkCore; using Nancy; +using Nancy.Responses; using Newtonsoft.Json; @@ -418,26 +419,101 @@ namespace FIORest.Modules public int? BidCount { get; set; } public double? Bid { get; set; } public int? Demand { get; set; } + + public string CsvRow() + { + var builder = new StringBuilder(); + builder.Append('"'); + builder.Append(MaterialTicker); + builder.Append("\",\""); + builder.Append(ExchangeCode); + builder.Append("\",\""); + builder.Append(MMBuy?.ToString() ?? ""); + builder.Append("\",\""); + builder.Append(MMSell?.ToString() ?? ""); + builder.Append("\",\""); + builder.Append(PriceAverage?.ToString() ?? ""); + builder.Append("\",\""); + builder.Append(AskCount?.ToString() ?? ""); + builder.Append("\",\""); + builder.Append(Ask?.ToString() ?? ""); + builder.Append("\",\""); + builder.Append(Supply?.ToString() ?? ""); + builder.Append("\",\""); + builder.Append(BidCount?.ToString() ?? ""); + builder.Append("\",\""); + builder.Append(Bid?.ToString() ?? ""); + builder.Append("\",\""); + builder.Append(Demand?.ToString() ?? ""); + builder.Append('"'); + return builder.ToString(); + } + + public static string CsvHeader() + { + var builder = new StringBuilder(); + builder.Append('"'); + builder.Append(nameof(MaterialTicker)); + builder.Append("\",\""); + builder.Append(nameof(ExchangeCode)); + builder.Append("\",\""); + builder.Append(nameof(MMBuy)); + builder.Append("\",\""); + builder.Append(nameof(MMSell)); + builder.Append("\",\""); + builder.Append(nameof(PriceAverage)); + builder.Append("\",\""); + builder.Append(nameof(AskCount)); + builder.Append("\",\""); + builder.Append(nameof(Ask)); + builder.Append("\",\""); + builder.Append(nameof(Supply)); + builder.Append("\",\""); + builder.Append(nameof(BidCount)); + builder.Append("\",\""); + builder.Append(nameof(Bid)); + builder.Append("\",\""); + builder.Append(nameof(Demand)); + builder.Append('"'); + return builder.ToString(); + } } private Response GetAll() { using(var DB = PRUNDataContext.GetNewContext()) { - return JsonConvert.SerializeObject(DB.CXDataModels.OrderBy(c => c.MaterialTicker).ThenBy(c => c.ExchangeCode).Select(c => new MinifiedCXDataModel() + var minified = + DB.CXDataModels + .OrderBy(c => c.MaterialTicker) + .ThenBy(c => c.ExchangeCode) + .Select(c => new MinifiedCXDataModel() + { + MaterialTicker = c.MaterialTicker, + ExchangeCode = c.ExchangeCode, + MMBuy = c.MMBuy, + MMSell = c.MMSell, + PriceAverage = c.PriceAverage.RoundToDecimalPlaces(2), + AskCount = c.AskCount, + Ask = c.Ask.RoundToDecimalPlaces(2), + Supply = c.Supply, + BidCount = c.BidCount, + Bid = c.Bid.RoundToDecimalPlaces(2), + Demand = c.Demand + }); + + Response response; + if (Request.Headers.Accept.FirstOrDefault()?.Item1 == "text/csv") + { + response = new TextResponse(string.Join("\n", new [] {MinifiedCXDataModel.CsvHeader()}.Concat(minified.Select(m => m.CsvRow())))); + response.Headers["Content-Type"] = "text/csv"; + } + else { - MaterialTicker = c.MaterialTicker, - ExchangeCode = c.ExchangeCode, - MMBuy = c.MMBuy, - MMSell = c.MMSell, - PriceAverage = c.PriceAverage.RoundToDecimalPlaces(2), - AskCount = c.AskCount, - Ask = c.Ask.RoundToDecimalPlaces(2), - Supply = c.Supply, - BidCount = c.BidCount, - Bid = c.Bid.RoundToDecimalPlaces(2), - Demand = c.Demand - }).ToList()); + response = new TextResponse(JsonConvert.SerializeObject(minified)); + response.Headers["Content-Type"] = "application/json"; + } + return response; } }