Faire une routine de vérification
Dans un projet, il va très souvent arriver de vouloir faire une succession de vérifications à plusieurs endroits.
L'exemple le plus parlant serait une authentification. Vous allez en premier récupérer un token, puis le déchiffrer et enfin vérifier que l'utilisateur existe.
C'est pour ce genre de choses que @duplojs/http introduit le ✨process✨.
import { ResponseContract, useProcessBuilder } from "@duplojs/http";
import { DPE, E, O, pipe } from "@duplojs/utils";
import { checkToken } from "./checkToken";
import { userExist } from "./checker";
export const authenticationProcess = useProcessBuilder()
.extract({
headers: {
authorization: DPE.string(),
},
})
.cut(
ResponseContract.unauthorized("token.invalid"),
({ authorization }, { response, output }) => pipe(
authorization,
checkToken,
E.whenIsRight(
({ userId }) => output({ authenticatedUserId: userId }),
),
E.whenIsLeft(() => response("token.invalid")),
),
)
.check(
userExist,
{
input: O.getProperty("authenticatedUserId"),
result: "user.find",
otherwise: ResponseContract.notFound("token.user.notfound"),
indexing: "user",
},
)
.exports(["user"]);La méthode exports met fin à la création d'un process et vous propose de mettre à disposition ses valeurs pour les routes ou processes qui l'implémenteront.
INFO
Le code ci-dessus utilise les fonctions de @duplojs/utils. Si certaines parties vous paraissent obscures, n'hésitez pas à checker la documentation.
Implémentation d'un process dans une route
import { ResponseContract, useRouteBuilder } from "@duplojs/http";
import { authenticationProcess } from "./process";
import { userSchema } from "./schema";
useRouteBuilder("GET", "/some-action")
.exec(authenticationProcess, { imports: ["user"] })
.handler(
ResponseContract.ok("some-information.send", userSchema),
({ user }, { response }) => response("some-information.send", user),
);Pour implémenter un process dans une route, il vous suffit d'appeler la méthode exec du builder. Vous pouvez configurer l'implémentation en sélectionnant, par exemple, les variables que vous souhaitez importer du process dans votre route.
Aller plus vite
Vous pouvez créer votre propre builder avec des process pré-implémentés en tant que préflight.
import { usePreflightBuilder } from "@duplojs/http";
import { authenticationProcess } from "./process";
export const useAuthenticatedRouteBuilder = usePreflightBuilder()
.exec(authenticationProcess, { imports: ["user"] })
.useRouteBuilder;Il ne reste plus qu'à créer vos routes avec...
import { ResponseContract } from "@duplojs/http";
import { useAuthenticatedRouteBuilder } from "./authenticatedRouteBuilder";
import { userSchema } from "./schema";
useAuthenticatedRouteBuilder("GET", "/some-action")
.handler(
ResponseContract.ok("some-information.send", userSchema),
({ user }, { response }) => response("some-information.send", user),
);