// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:meta/meta.dart';
import 'package:shelf/shelf.dart';

import 'request_handler.dart';
import '../request_handling/authentication.dart';
import '../requests/exceptions.dart';
import '../service/log.dart';

/// A [RequestHandler] that handles API requests.
///
///  * All requests must be authenticated per [CronAuthProvider].
@immutable
abstract class AuthenticatedRequestHandler extends RequestHandler {
  /// Creates a new [ApiRequestHandler].
  const AuthenticatedRequestHandler({
    required super.config,
    required this.cronAuthProvider,
  });

  /// Service responsible for authenticating this [Request].
  final CronAuthProvider cronAuthProvider;

  @override
  Future<Response> run(Request request) async {
    try {
      await cronAuthProvider.authenticate(request);
    } on Unauthenticated catch (error) {
      log.info('Authenticate error: $error');
      return Response.forbidden(error.toString());
    }
    return await super.run(request);
  }
}
