Lewati ke konten

Middlewares

Normalnya Middleware Gaman itu terletak di folder src/middlewares/** jadi semisal anda memakai autoComposeMiddleware((ctx, next) => next()) itu akan otomatis di register oleh sistem.

workflow middleware

Middleware disini berperan sebagai guard sistem request, middleware akan di jalankan pertama kali saat request masuk, jadi sebelum interceptor lalu handler, middleware akan di jalankan terlebih dahulu.

disini kita memakai composeMiddleware yang berarti tidak akan otomatis di register ke data middlewares jadi anda harus manual meregister ke index.ts

AppMiddleware.ts
import { composeMiddleware } from "@gaman/core"
export default composeMiddleware((ctx, next) => {
return next()
});

setelah itu anda harus meregister manual ke file src/index.ts

index.ts
import { AppMiddleware } from "./middlewares/AppMiddleware.ts"
import { AuthMiddleware } from "./middlewares/AuthMiddleware.ts"
defineBootstrap((app) => {
app.mount(AppMiddleware());
})

atau bisa di register ke dalam router tertentu berikut adalah contohnya:

AppRoutes.ts
import { AppMiddleware } from "./middlewares/AppMiddleware.ts"
import { AuthMiddleware } from "./middlewares/AuthMiddleware.ts"
export default autoComposeRoutes((route) => {
route
.get('/generate-token', Handler)
.middleware(AppMiddleware()) // single middleware
.middleware([AppMiddleware(), AuthMiddleware()]) // multi middleware
route.group('/user', (route) => {
route.post('/create', Handler)
route.get('/profile', Handler)
}).middleware(AppMiddleware()) // single middleware
.middleware([AppMiddleware(), AuthMiddleware()]) // multi middleware
})

jika anda menaruh middleware ke group maka routes di dalamnya akan terkena efeknya juga

disini kita memakai autoComposeMiddleware yang berarti akan otomatis di register ke data middlewares dengan persyaratan harus berada di folder src/middlewares/**

AppMiddleware.ts
import { autoComposeMiddleware } from "@gaman/core"
export default autoComposeMiddleware((ctx, next) => {
return next();
})

ini akan otomatis di register ke dalam data middlewares jadi anda tidak perlu register manual.

disini gaman sudah menyiapkan default config bawaan middleware yang bisa kamu pakai

priority adalah config yang sangat berguna untuk semakin tinggal prioritas nya maka proses akan di jalankan lebih awal dari yang lain

import { Priority } from "@gaman/common"
export default composeMiddleware((ctx, next) => {
return next();
}, {
priority: Priority.NORMAL
})

includes disini iyalah berfungsi untuk ngefilter route atau path mana, yang mau menjalankan middleware

export default composeMiddleware((ctx, next) => {
return next()
}, {
inclues: [
{
path: '/user{/*splat}' // artinya path /user dan setelahnya akan kena middleware
},
{
path: '/blog/*splat' // artinya setelah path /blog/ akan middleware kecuali path /blog sendiri
method: ['GET', "POST"] // jadi kusus method GET dan POST doang
},
"/dashboard" // path /dashboard akan kena middleware
]
})

excludes disini iyalah berfungsi untuk ngefilter route atau path mana, yang tidak akan menjalankan middleware

export default composeMiddleware((ctx, next) => {
return next()
}, {
excludes: [
{
path: '/profile{/*splat}' // artinya path /profile dan setelahnya tidak akan kena middleware
},
{
path: '/setting/*splat' // artinya setelah path /setting/ tidak akan middleware kecuali path /setting sendiri
method: ['GET', "POST"]
},
"/" // path root tidak akan kena middleware
]
})

Config Middleware juga bisa anda setting saat meregister ke dalam route, tetapi hanya composeMiddleware tidak dengan autoComposeMiddleware karna itu dah otomatis jadi global middleware.

Contoh:

index.ts
defineBootstrap((app) => {
app.mount(AppMiddleware({
priority: Priority.HIGH,
includes: ['/dashboard']
}))
})
// AppRoutes.ts
composeRoutes((route) => {
route.get('/', Handler).middleware(AppMiddleware({
excludes: [{
path: '/api/*splat'
}]
}))
})