feat: moved to C# thanks to deepseek

This commit is contained in:
didier committed 2026-07-12 21:01:09 -04:00
1 parent ab81a1c4be
commit 29ed46aa7f
34 files changed
+1583 -14

No files matched your search

+45
View File
@@ -0,0 +1,45 @@
using Microsoft.AspNetCore.Mvc;
using Phenix.Services;
namespace Phenix.Controllers;
[Route("/api")]
public class ApiController : Controller
{
private readonly IGameService _games;
public ApiController(IGameService games)
{
_games = games;
}
[HttpGet("results/{year}.json")]
public async Task<IActionResult> ResultsJson(int year)
{
var games = await _games.GetAllGames();
var results = games
.Where(g => g.Year == year)
.Select(g => new Dictionary<string, object?>
{
["id"] = g.Id,
["date"] = g.Date,
["time"] = g.Time,
["home"] = g.Home,
["away"] = g.Away,
["year"] = g.Year,
[g.Home] = g.HomeScore,
[g.Away] = g.AwayScore,
["practice"] = g.Practice,
["rain"] = g.Rain,
});
return Json(results);
}
[HttpGet("available-years.json")]
public async Task<IActionResult> AvailableYearsJson()
{
var games = await _games.GetAllGames();
var years = games.Select(g => g.Year).Distinct().OrderByDescending(y => y);
return Json(years);
}
}
+22
View File
@@ -0,0 +1,22 @@
using Microsoft.AspNetCore.Mvc;
using Phenix.Services;
namespace Phenix.Controllers;
public class HomeController : Controller
{
[HttpGet("/")]
public IActionResult Index() => View();
[HttpGet("/calendrier")]
public IActionResult Calendrier() => View();
[HttpGet("/nouvelles")]
public IActionResult Nouvelles() => View();
[HttpGet("/contact")]
public IActionResult Contact() => View();
[HttpGet("/reglement")]
public IActionResult Reglement() => View();
}
+141
View File
@@ -0,0 +1,141 @@
using Microsoft.AspNetCore.Mvc;
using Phenix.Services;
namespace Phenix.Controllers;
[Route("/membre")]
public class MembreController : Controller
{
private readonly IGameService _games;
private readonly LoginService _login;
private const string SessionCookie = "phenix-session";
private const string SessionSignCookie = "phenix-session-sign";
public MembreController(IGameService games, LoginService login)
{
_games = games;
_login = login;
}
[HttpGet("")]
public IActionResult Index()
{
ViewBag.IsLoggedIn = IsLoggedIn();
return View();
}
[HttpGet("/login")]
public IActionResult Login(string? username, string? password)
{
if (username is null || password is null || !_login.ValidateCredentials(username, password))
return StatusCode(403);
var expiresAt = DateTimeOffset.UtcNow.AddDays(90).ToUnixTimeSeconds();
Response.Cookies.Append(SessionCookie, expiresAt.ToString(), new CookieOptions
{
MaxAge = TimeSpan.FromDays(90),
});
Response.Cookies.Append(SessionSignCookie, _login.SignSession(expiresAt), new CookieOptions
{
MaxAge = TimeSpan.FromDays(90),
});
return Redirect("/membre/games-editor/today");
}
[HttpGet("games-editor/today")]
public async Task<IActionResult> GamesEditorToday()
{
if (!IsLoggedIn()) return Redirect("/membre");
var games = await _games.GetAllGames();
var today = DateOnly.FromDateTime(TimeZoneInfo.ConvertTime(
DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("America/New_York")));
var lastGameDay = games
.Where(g => DateOnly.Parse(g.Date) <= today)
.Select(g => g.Date)
.OrderByDescending(d => d)
.FirstOrDefault();
ViewBag.SelectedYear = (int?)null;
ViewBag.IsToday = true;
ViewBag.Years = games.Select(g => g.Year).Distinct().OrderByDescending(y => y).ToList();
ViewBag.Games = games.Where(g => g.Date == lastGameDay).ToList();
return PartialView("GamesEditor");
}
[HttpGet("games-editor/{year:int}")]
public async Task<IActionResult> GamesEditorByYear(int year)
{
if (!IsLoggedIn()) return Redirect("/membre");
var games = await _games.GetAllGames();
ViewBag.SelectedYear = year;
ViewBag.IsToday = false;
ViewBag.Years = games.Select(g => g.Year).Distinct().OrderByDescending(y => y).ToList();
ViewBag.Games = games.Where(g => g.Year == year).ToList();
return PartialView("GamesEditor");
}
[HttpGet("new-game-editor")]
public IActionResult NewGameEditor()
{
if (!IsLoggedIn()) return Redirect("/membre");
return PartialView();
}
[HttpPost("new-game")]
public async Task<IActionResult> NewGame(string gameDate, string gameTime, string homeTeam, string awayTeam)
{
if (!IsLoggedIn()) return Redirect("/membre");
var (game, error) = await _games.CreateNewGame(gameDate, gameTime, homeTeam, awayTeam);
if (error != "")
{
ViewBag.Error = error;
return StatusCode(500, PartialView("NewGameError"));
}
Response.Headers["game-id"] = game!.Id;
return PartialView("SingleGameEditor", game);
}
[HttpDelete("games/{gameId}")]
public async Task<IActionResult> DeleteGame(string gameId)
{
if (!IsLoggedIn()) return Redirect("/membre");
var ok = await _games.DeleteGameById(gameId);
return Content(ok ? "true" : "false");
}
[HttpPost("games/{gameId}")]
public async Task<IActionResult> UpdateGame(string gameId, int? awayScore, int? homeScore, string? gameType)
{
if (!IsLoggedIn()) return Redirect("/membre");
var success = await _games.UpdateGame(gameId, homeScore, awayScore,
rain: gameType == "rain", practice: gameType == "practice");
return Content(success
? "<i class=\"fa fa-floppy-o\" aria-hidden=\"true\"></i>"
: "<i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\"></i>");
}
[HttpPost("games/{gameId}/switch")]
public async Task<IActionResult> SwitchVisitors(string gameId)
{
if (!IsLoggedIn()) return Redirect("/membre");
var success = await _games.SwitchVisitors(gameId);
if (!success)
return Content("<i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\"></i>");
var game = await _games.GetGameById(gameId);
Response.Headers["game-id"] = gameId;
return PartialView("SingleGameEditor", game);
}
private bool IsLoggedIn()
{
Request.Cookies.TryGetValue(SessionCookie, out var expires);
Request.Cookies.TryGetValue(SessionSignCookie, out var sig);
return _login.VerifySession(expires, sig);
}
}