Files
timelog/backendCS/routes/Gettopten.cs
T
2024-12-09 18:43:03 +02:00

99 lines
3.0 KiB
C#

using System.Net;
using MySql.Data.MySqlClient;
using Newtonsoft.Json;
namespace TimelogBackend;
public class TopTen
{
public object? User { get; set; }
public object? Date { get; set; }
public object? Project { get; set; }
public object? FName { get; set; }
public object? LName { get; set; }
public object? Name { get; set; }
public object? TotalTime { get; set; }
}
public class Gettopten : Route
{
private static List<TopTen> ExtractDataFromDB(MySqlCommand cmd)
{
using MySqlConnection conn = new(connectionString);
cmd.Connection = conn;
conn.Open();
// Execute the query and read the results
MySqlDataReader reader = cmd.ExecuteReader();
List<TopTen> entries = [];
while (reader.Read())
{
entries.Add(
new TopTen
{
User = reader["user"],
Date = reader["date"],
Project = reader["project"],
FName = reader["f_name"],
LName = reader["l_name"],
Name = reader["name"],
TotalTime = reader["total_time"],
}
);
}
return entries;
}
private static void ValidateQueryStrings(string from, string to, string filterBy)
{
if (!string.IsNullOrEmpty(to) && !string.IsNullOrEmpty(from))
{
ValidateDate(to);
ValidateDate(from);
}
else
{
throw new Exception("Empty date format");
}
if (string.IsNullOrEmpty(filterBy))
{
throw new Exception("Empty filterby");
}
if (filterBy != "user" && filterBy != "project")
{
throw new Exception("Incorrect filterby");
}
}
public static void HandleRequest(HttpListenerRequest request, HttpListenerResponse response)
{
try
{
var queryString = request.QueryString;
string? from = queryString["from"] ?? "";
string? to = queryString["to"] ?? "";
string? filterBy = queryString["filterBy"] ?? "";
ValidateQueryStrings(from, to, filterBy);
string query =
@"SELECT t.user,t.date,t.project,u.f_name,u.l_name,p.name,SUM(t.time) as total_time
FROM Timelog t
INNER JOIN Project p ON p.id=t.project
INNER JOIN User u ON u.id=t.user
WHERE t.date BETWEEN @from AND @to
GROUP BY "
+ filterBy
+ " ORDER BY total_time DESC LIMIT 10;";
MySqlCommand cmd = new(query);
cmd.Parameters.AddWithValue("@from", from);
cmd.Parameters.AddWithValue("@to", to);
var entries = ExtractDataFromDB(cmd);
string jsonResponse = JsonConvert.SerializeObject(entries);
SendSuccess(response, jsonResponse);
}
catch (Exception ex)
{
SendError(response, ex);
}
}
}