148 lines
4.3 KiB
C#
148 lines
4.3 KiB
C#
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Newtonsoft.Json;
|
|
using pointMaster.Data;
|
|
|
|
namespace pointMaster.Controllers
|
|
{
|
|
[Authorize(Policy = Roles.Editor)]
|
|
[ApiController]
|
|
[Route("api")]
|
|
public class StatsApiController : ControllerBase
|
|
{
|
|
readonly DataContext dataContext;
|
|
|
|
public StatsApiController(DataContext dataContext)
|
|
{
|
|
this.dataContext = dataContext;
|
|
}
|
|
|
|
[HttpGet("GetPointsOverTime")]
|
|
public async Task<object> GetList()
|
|
{
|
|
var pointData = await dataContext.Points.Include(x => x.Patrulje).Include(x => x.Poster).ToListAsync();
|
|
|
|
var pointGrouped = pointData.OrderBy(x => x.DateCreated).GroupBy(x => x.Patrulje.Name).ToList();
|
|
|
|
var retval = new List<PointChartModel>();
|
|
|
|
var lastChange = DateTime.Now.ToString("MM/d/yyyy H:m:s").Replace('.', ':');
|
|
|
|
foreach (var group in pointGrouped)
|
|
{
|
|
var data = new List<PointChartDataModel>();
|
|
|
|
var total = 0;
|
|
foreach (var point in group)
|
|
{
|
|
var date = DateTime.Parse(point.DateCreated.ToString());
|
|
|
|
total += point.Points + point.Turnout;
|
|
|
|
data.Add(new PointChartDataModel
|
|
{
|
|
x = date.ToString("MM/d/yyyy H:m:s").Replace('.', ':'),
|
|
y = total
|
|
});
|
|
}
|
|
|
|
data.Add(new PointChartDataModel
|
|
{
|
|
x = lastChange,
|
|
y = total
|
|
});
|
|
|
|
retval.Add(new PointChartModel
|
|
{
|
|
Name = group.Key,
|
|
Data = data
|
|
});
|
|
}
|
|
|
|
var rval = JsonConvert.SerializeObject(retval, new JsonSerializerSettings()
|
|
{
|
|
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
|
|
|
|
});
|
|
|
|
return Ok(rval);
|
|
}
|
|
|
|
[Route("getstats")]
|
|
public async Task<IActionResult> GetStats()
|
|
{
|
|
var vm = new List<StatModel>();
|
|
|
|
var pointData = await dataContext.Points.ToListAsync();
|
|
var patruljeData = await dataContext.Patruljer.ToListAsync();
|
|
var postData = await dataContext.Poster.ToListAsync();
|
|
|
|
vm.Add(new StatModel
|
|
{
|
|
Title = "Points givet ialt",
|
|
Value = pointData.Sum(x => x.Points + x.Turnout).ToString()
|
|
});
|
|
|
|
vm.Add(new StatModel
|
|
{
|
|
Title = "Antal patruljer",
|
|
Value = patruljeData.Count().ToString()
|
|
});
|
|
|
|
vm.Add(new StatModel
|
|
{
|
|
Title = "Antal poster",
|
|
Value = postData.Count().ToString()
|
|
});
|
|
|
|
return Ok(JsonConvert.SerializeObject(vm));
|
|
}
|
|
|
|
[Route("pointratio")]
|
|
public async Task<IActionResult> GetPointRatio()
|
|
{
|
|
var vm = new PointRatioModel();
|
|
|
|
vm.Names = new List<string>();
|
|
vm.Data = new List<int>();
|
|
|
|
var data = await dataContext.Patruljer.Include(x => x.Points).ToListAsync();
|
|
|
|
foreach (var patrulje in data)
|
|
{
|
|
vm.Names.Add(patrulje.Name);
|
|
vm.Data.Add(patrulje.Points.Sum(x => x.Points + x.Turnout));
|
|
}
|
|
|
|
return Ok(JsonConvert.SerializeObject(vm));
|
|
}
|
|
|
|
public class PointChartModel
|
|
{
|
|
[JsonProperty("name")]
|
|
public string Name { get; set; } = null!;
|
|
[JsonProperty("data")]
|
|
public List<PointChartDataModel> Data { get; set; } = null!;
|
|
}
|
|
public class PointChartDataModel
|
|
{
|
|
public string x { get; set; } = null!;
|
|
public int y { get; set; }
|
|
}
|
|
|
|
public class StatModel
|
|
{
|
|
public string Title { get; set; } = null!;
|
|
public string Value { get; set; } = null!;
|
|
}
|
|
|
|
public class PointRatioModel
|
|
{
|
|
[JsonProperty("names")]
|
|
public List<string> Names { get; set; } = null!;
|
|
[JsonProperty("data")]
|
|
public List<int> Data { get; set; } = null!;
|
|
}
|
|
}
|
|
} |