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.
