Milabowl
Sam - 2 min read

Tech update - omskriving av rules engine đŸ€–

Backend prosesseringen til Milabowl bĂŠrer mye preg av teknsik gjeld og dĂ„rlig struktur som fĂžlge av mange snarveier nĂ„r man gikk fra live applikasjon i Azure til Github Pages. En omfattende omskrivning nĂŠrmer seg nĂ„ slutten. Hovedfokuset er Ă„ senke terskelen for Ă„ legge til nye regler. Dette blir gjort ved Ă„ ta i bruk en helt ny rules engine, “MilaEngineâ€đŸ§™đŸŒâ€â™‚ïž. Det eneste man trenger for Ă„ legge til en ny regel er Ă„ implementere IMilaRule interfacet, deretter skjer alt automagisk:

public record MilaRuleResult(string RuleName, string RuleShortName, decimal Points);

public interface IMilaRule
{
    MilaRuleResult Calculate(MilaGameWeekState userGameWeek);
}

Alle implementasjoner vil automatisk bli plukket opp av .NET sin DI container, og automatisk kalkulert og lagt inn i game_state.json. Frontendend vil ogsÄ bli oppdatert til Ä automatisk plukke opp alle nye regler, og rendre nye regler. For Ä forenkle enda mer kan man implementere den abstrakte klassen MilaRule. Man mÄ da sette et ShortName (som vil dukke opp i tabellene i front end), og en metode for Ä beregne poeng. Regelen vil dukke opp med samme navn som klassen i JSON resultatet.

public abstract class MilaRule : IMilaRule
{
    protected abstract string ShortName { get; }
    protected abstract decimal CalculatePoints(MilaGameWeekState userGameWeek);

    public MilaRuleResult Calculate(MilaGameWeekState userGameWeek)
    {
        return new MilaRuleResult(GetType().Name, ShortName, CalculatePoints(userGameWeek));
    }
}

For Ä vise hvor enkelt det blir Ä legge til en ny regel kan vi se pÄ implementasjonen av regelen for gult kort:

public class YellowCards : MilaRule
{
    protected override string ShortName => "YC";

    protected override decimal CalculatePoints(MilaGameWeekState userGameWeek)
    {
        return userGameWeek.User.Lineup
            .Where(pe => pe.YellowCards == 1)
            .Sum(pe => pe.Multiplier);
    }
}

For Ă„ sikre at nye regler fungerer som tenkt vil byggen feile ❌ om man ikke har lagt til minst en test pr. regel.

I tillegg til Ä gjÞre det enklere Ä legge til nye regler, vil prosesseringene gÄ mye raskere og favhengigheten til SQL databasen i bunn blir fjernet. Planen er Ä ta nÄvÊrende lÞsning for import av data til SQL, lage et eget prosjekt og rename det til Milalytics, sÄ man fortsatt har mulighet Ä analysere FPL / Mila data med SQL (spesielt handy rundt MilaAwards).

NB: Navn pÄ klasser og interfaces er fortsatt i endring

Tech
Home Standings Team Blog