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 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 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 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 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 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 ? "" : ""); } [HttpPost("games/{gameId}/switch")] public async Task SwitchVisitors(string gameId) { if (!IsLoggedIn()) return Redirect("/membre"); var success = await _games.SwitchVisitors(gameId); if (!success) return Content(""); 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); } }