Flint DartFlint Dart

🛡 Middleware

Middleware in Flint Dart allows you to run code before a request reaches the route handler. You can use it for tasks like authentication, validation, logging, etc.

Example: Auth Middleware

import 'package:flint_dart/flint_dart.dart';

class AuthMiddleware extends Middleware {
  @override
  Handler handle(Handler next) {
    return (Request req, Response res) async {
      final token = req.bearerToken;
      if (token == null || token != "expected_token") {
       return res.status(401).send("Unauthorized");
      }
      return await next(req, res);
    };
  }
}

Example: Validation Middleware

import 'package:flint_dart/flint_dart.dart';

class ValidationMiddleware extends Middleware {
  final Map<String, String> rules;

  ValidationMiddleware(this.rules);

  @override
  Handler handle(Handler next) {
    return (Request req, Response res) async {
      try {
        final data = await req.json();
        await Validator.validate(data, rules);
      return  await next(req, res);
      } catch (e) {
     return   res.status(400).json({'error': e.toString()});
      }
    };
  }
}

Using Middleware for a Single Route

You can wrap a specific route handler with middleware by calling its .handle() method.

import 'package:flint_dart/flint_dart.dart';
import 'package:sample/src/middlewares/auth_middleware.dart';
import '../controllers/user_controller.dart';

void registerUserRoutes(Flint app) {
  final controller = UserController();

  app.get('/', controller.index);
  app.get('/:id', controller.show);
  app.post('/', controller.create);
  app.put('/:id', AuthMiddleware().handle(controller.update));
  app.delete('/:id', AuthMiddleware().handle(controller.delete));
}

Using Middleware for a Group of Routes

You can also apply middleware to an entire route group when mounting it.

import 'package:flint_dart/flint_dart.dart';
import 'package:sample/src/middlewares/auth_middleware.dart';
import 'package:sample/src/routes/auth_routes.dart';
import 'package:sample/src/routes/user_routes.dart';

void main() {
  final app = Flint();

  app.get('/', (req, res) async {
     return res.send('Hello from Flint Dart!');
  });

  app.mount("/users", registerUserRoutes, middlewares: [
    AuthMiddleware(),
  ]);

  app.mount("/auth", authRoutes);

  app.listen(3000);
}

Chaining Middleware with .useMiddleware()

Flint Dart also lets you attach middleware directly to a specific route using the .useMiddleware() method. You can chain multiple middleware functions, and they will run in the order they were added.

import 'package:flint_dart/flint_dart.dart';
import 'package:sample/src/middleware/auth_middleware.dart';

void main() {
  final app = Flint();

  app.get('/profile', (req, res) async {
   return res.json({'msg': 'This is a protected route'});
  }).useMiddleware(AuthMiddleware());

  app.listen(3000);
}

✅ In this example, the AuthMiddleware is applied twice for demonstration. In real use, you can mix and match multiple middleware (e.g., AuthMiddleware, LoggingMiddleware,RateLimiterMiddleware) to build a secure and layered request pipeline.