|
1 | 1 | import 'package:dart_frog/dart_frog.dart';
|
2 | 2 | import 'package:flutter_news_app_api_server_full_source_code/src/middlewares/authorization_middleware.dart';
|
| 3 | +import 'package:flutter_news_app_api_server_full_source_code/src/middlewares/configured_rate_limiter.dart'; |
3 | 4 | import 'package:flutter_news_app_api_server_full_source_code/src/middlewares/ownership_check_middleware.dart';
|
4 | 5 | import 'package:flutter_news_app_api_server_full_source_code/src/rbac/permissions.dart';
|
5 | 6 |
|
6 | 7 | /// Middleware for the user settings endpoint.
|
7 | 8 | ///
|
8 | 9 | /// This chain ensures that:
|
9 | 10 | /// 1. The user is authenticated (handled by the parent `users` middleware).
|
10 |
| -/// 2. The correct permission (`userAppSettings...`) is required. |
11 |
| -/// 3. The user has that permission. |
12 |
| -/// 4. The user is the owner of the settings resource. |
| 11 | +/// 2. Rate limiting is applied. |
| 12 | +/// 3. The correct permission (`userAppSettings...`) is required. |
| 13 | +/// 4. The user has that permission. |
| 14 | +/// 5. The user is the owner of the settings resource. |
13 | 15 | Handler middleware(Handler handler) {
|
14 | 16 | return handler
|
15 | 17 | // Final check: ensure the authenticated user owns this resource.
|
16 | 18 | .use(userOwnershipMiddleware())
|
17 | 19 | // Check if the user has the required permission.
|
18 | 20 | .use(authorizationMiddleware())
|
19 |
| - // Provide the specific permission required for this route. |
20 |
| - .use(_permissionSetter()); |
| 21 | + // Apply rate limiting and provide the specific permission for this route. |
| 22 | + .use(_rateAndPermissionSetter()); |
21 | 23 | }
|
22 | 24 |
|
23 |
| -Middleware _permissionSetter() { |
| 25 | +Middleware _rateAndPermissionSetter() { |
24 | 26 | return (handler) {
|
25 | 27 | return (context) {
|
26 | 28 | final String permission;
|
| 29 | + final Middleware rateLimiter; |
| 30 | + |
27 | 31 | switch (context.request.method) {
|
28 | 32 | case HttpMethod.get:
|
29 | 33 | permission = Permissions.userAppSettingsReadOwned;
|
| 34 | + rateLimiter = createReadRateLimiter(); |
30 | 35 | case HttpMethod.put:
|
31 | 36 | permission = Permissions.userAppSettingsUpdateOwned;
|
| 37 | + rateLimiter = createWriteRateLimiter(); |
32 | 38 | default:
|
33 | 39 | return Response(statusCode: 405);
|
34 | 40 | }
|
35 |
| - return handler(context.provide<String>(() => permission)); |
| 41 | + |
| 42 | + return rateLimiter( |
| 43 | + (context) => handler( |
| 44 | + context.provide<String>(() => permission), |
| 45 | + ), |
| 46 | + )(context); |
36 | 47 | };
|
37 | 48 | };
|
38 | 49 | }
|
0 commit comments