Middleware

Middleware ها قبل از رسیدن درخواست به controller اجرا می‌شوند. می‌توانند درخواست را تغییر دهند، پارامترها اضافه کنند، یا پاسخ را متوقف کنند.

ساخت یک Middleware

import 'package:finch/finch_route.dart';

class AuthMiddleware extends Middleware {
  @override
  Future<MiddlewareResult> handle(FinchRequest rq) async {
    var token = rq.headers['authorization']?.first ?? '';

    if (token.isEmpty) {
      return MiddlewareResult.stop(
        rq.renderData(
          data: {'error': 'احراز هویت لازم است'},
          statusCode: 401,
        ),
      );
    }

    var user = await UserService.verifyToken(token);
    if (user == null) {
      return MiddlewareResult.stop(
        rq.renderData(
          data: {'error': 'توکن نامعتبر است'},
          statusCode: 401,
        ),
      );
    }

    // اضافه کردن user به پارامترهای درخواست
    rq.addParam('currentUser', user);
    return MiddlewareResult.next();
  }
}

مقادیر بازگشتی MiddlewareResult

مقدار رفتار
MiddlewareResult.next() ادامه پردازش به middleware/controller بعدی
MiddlewareResult.stop(response) توقف پردازش و بازگرداندن پاسخ

اتصال Middleware به Route

در constructor

router.get(
  '/dashboard',
  DashboardController().index,
  middlewares: [AuthMiddleware()],
);

به صورت fluent

router
    .get('/dashboard', DashboardController().index)
    .middleware(AuthMiddleware());

Middleware برای Route والد

router.group('/api', (r) {
  r.get('/users', UserController().index);
  r.post('/users', UserController().store);
}).middleware(ApiAuthMiddleware());

دسترسی به درخواست در Controller

Future<String> index() async {
  var user = rq.getParam<User>('currentUser');
  // استفاده از user...
}