import 'dart:async';
import 'dart:io';
import 'package:angel_framework/angel_framework.dart';

/// Restricts access to a resource via authentication.
class RequireAuthorizationMiddleware extends AngelMiddleware {
  @override
  Future<bool> call(RequestContext req, ResponseContext res,
      {bool throwError: true}) async {
    bool _reject(ResponseContext res) {
      if (throwError) {
        res.statusCode = HttpStatus.FORBIDDEN;
        throw new AngelHttpException.Forbidden();
      } else
        return false;
    }

    if (req.properties.containsKey('user') || req.method == 'OPTIONS')
      return true;
    else
      return _reject(res);
  }
}