Logo image

Kako da Vaš API radi samo prvu smenu radnim danima (NodeJS i .NET Core)?

Često kada pravite API-je ne razmišljate o tome da li i oni imaju dušu. Pod uslovnom da su ispravni, oni rade 24/7/365, i onaj jedan dodatni dan kada je godina prestupna, a da ne traže ni povišicu, ni lekarsko, a ne plaćaju ni doprinose državi.

Kako to ispraviti? Kako da API-ji rade 8 časova dnevno, i da ne rade subotom i nedeljom? Sad ćete da vidite.

Očitavanje trenutnog sata i dana

Recimo da radite od 9-17. Očekuje se da kad radite Vi - radi i API. Radi demonstracije, koristiću NodeJS uz Express i .NET Core u C#.

Evo primera za vanilla NodeJS:

const currentHour = new Date().getHours();
const currentDay = new Date().getDays();
if(currentHour >= 9 && currentHour <= 17 && currentDay >= 0 && currentDay <= 5)
    console.log("We're open!");
else
    console.log("We're closed!);

Ako ste fan Clean Code-a, što donekle trebate biti ali bez preterivanja, ovo se može napisati i ovako:

function isWorkingHour()
{
    const currentHour = new Date().getHours();
    return currentHour >= 9 && currentHour <= 17;
}

function isWorkingDay()
{
    const currentDay = new Date().getDays();
    return currentDay >= 0 && currentDay <= 4
}

if(isWorkingHour() && isWorkingDay())
    console.log("We're open!");
else
    console.log("We're closed!");

⚠️: Napomena: Dani i sati kreću od nule u JavaScript-u, pa je ponedeljak 0, a petak 4.

A sada sledi i primer za .NET Core, odnosno C#:

int currentHour = DateTime.Today.Hour;
int currentDay = DateTime.Today.DayOfWeek;

if(currentHour >= 9 && currentHour <= 17 && currentDay >= 1 && currentDay <= 5)
    Console.WriteLine("We're open!");
else
    Console.WriteLine("We're closed!);

Sličan primer, ali uz "Clean code":

bool IsWorkingHour()
{
    int currentHour = DateTime.Today.Hour;
    return currentHour >= 9 && currentHour <= 17;
}

bool IsWorkingDay()
{
    int currentDay = (int)DateTime.Today.DayOfWeek;
    return currentDay >= 1 && currentDay <= 5;
}

if(IsWorkingHour() && IsWorkingDay())
    Console.WriteLine("We're open!");
else
    Console.WriteLine("We're closed!);

⚠️ Napomena: Kao i u JavaScript-u, dani i sati kreću od nule i u C#, pa je ponedeljak 0, a petak 4. Takođe, kad se cast-uje DayOfWeek u int, nedelja je 0, a subota 6.

⚠️ Napomena 2: Ako koristite Typescript, što inače preporučujem, mada nekad može da smara ako ne znate ispravan tip ili kad dobijete kilometarsku error poruku, zapamtite da je boolean u TypeScript-u bool u C#.

I dobro, sad znamo kako se očitava trenutni sat i dan, kako to sada da ubacimo u naš API?

Odmorite Vaš API

Svaki API podržava Middleware princip tokom puta od zahteva do odgovora klijentu. Dok vi možete da lokalizujete dejstvo Vašeg middleware-a, u skladu sa principom osmočasovnog radnog vremena, ja predlažem da se ovo postavi na globalnom nivou, ili što bliže vrhu.

Primer za NodeJS:

function workForEightHours(request, response, next)
{
    if(isWorkingHour() && isWorkingDay())
        next();
    else
        response.status(418).json({
            message: "We're not currently working, please send your request from Monday to Friday between 9 and 17."
        })
}

app.use(workForEightHours);

Primer za .NET Core:

public class WorkForEightHours
{
    private readonly RequestDelegate _next;

    public WorkForEightHours(RequestDelegate next)
    {
        this._next = next;
    }

    bool IsWorkingHour()
    {
        int currentHour = DateTime.Today.Hour;
        return currentHour >= 9 && currentHour <= 17;
    }

    bool IsWorkingDay()
    {
        int currentDay = (int)DateTime.Today.DayOfWeek;
        return currentDay >= 1 && currentDay <= 5;
    }

    public async Task Invoke(HttpContext context)
    {
        if(this.IsWorkingHour() && this.IsWorkingDay())
        {
            await this._next.Invoke(context);
        }
        else
        {
            throw new Exception("Please send your request between Monday and Friday during 9-17");
        }
    }
}

A sad da ovo registrujete u Program.cs:

app.UseMiddleware<WorkForEightHours>();

Sada i Vaš API može da ode na odmor posle okončanja radnog vremena. Jedna od dodatnih prednosti ovog principa je i taj da ćete imati manju potrošnju resursa, jer API ne radi non-stop, što odmah dovodi i do manjih troškova, što onda dovodi do toga da imate više finansija kojima možete povećati platu radnicima, poboljšati radne uslove i slično.