feat: moved to C# thanks to deepseek
This commit is contained in:
1 parent
ab81a1c4be
commit
29ed46aa7f
34 files changed
+1583
-14
No files matched your search
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user