Kako da Vaš API radi samo prvu smenu radnim danima (NodeJS i .NET Core)?
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-5. 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 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 može da se napiše lepše tako što se izdvoje dve funkcije isWorkingHour() i isWorkingDay():
function isWorkingHour()
{
const currentHour = new Date().getHours();
return currentHour >= 9 && currentHour <= 17;
}
function isWorkingDay()
{
const currentDay = new Date().getDays();
return currentDay >= 0 && currentDay <= 4
}
:warning: Kratka napomena: Dani i sati kreću od nule u JavaScript-u, pa je ponedeljak 0, a petak 4. Nakon ovih izmena, kod izgleda ovako:
if(isWorkingHour() && isWorkingDay())
console.log("We're open!");
else
console.log("We're closed!");
A sada sledi i primer za .NET Core, odnosno C#, gde vreme vadite iz DateTime-a:
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" izgleda ovako:
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!);
:warning: Opet 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.
:warning: Napomena 2: Takođe, 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 bi trebalo da 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 bi izgledao ovako:
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 se može napisati i ovako. Primetićete da ima dosta više postavki, odnosno boilerplate-a:
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 ta 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.
