serve method

Future serve(
  1. HttpRequest request
)

Стартовая точка

Implementation

Future<dynamic> serve(HttpRequest request) async {
  request.response.headers.add(
    'Content-Type',
    'application/json;charset=utf-8',
  );

  request.response.headers.add('X-Powered-By', '_dserver');

  late Method method;

  switch (request.method.trim().toUpperCase()) {
    case 'GET':
      method = Method.GET;
      break;
    case 'POST':
      method = Method.POST;
      break;
    case 'PUT':
      method = Method.PUT;
      break;
    case 'DELETE':
      method = Method.DELETE;
      break;
  }

  print('Handle ${request.method} ${request.requestedUri}');

  bool isError = true;

  if (_routes.containsKey(method)) {
    final String empty = '_empty_';
    final String rPath = request.requestedUri.path;

    String path = _routes[method]!.keys.firstWhere(
          (String path) => path.split(' ')[1].trim() == rPath,
          orElse: () => empty,
        );

    // Try find by RegExp
    if (path == empty) {
      final Map<String, Handler> handlers = _routes[method]!;

      final List<Handler> rHandlers = <Handler>[];

      handlers.forEach((String key, Handler value) {
        if (value.rPath != null) {
          rHandlers.add(value);
        }
      });

      final Handler hFind = rHandlers.firstWhere(
        (Handler handler) {
          final RegExp regExp = RegExp(handler.rPath!.toString());

          if (regExp.hasMatch(rPath)) {
            return true;
          }

          return false;
        },
        orElse: () => Handler(callback: (_) => ''),
      );

      // Still not found - Route not found!
      if (hFind.path == null && hFind.rPath == null) {
        path = '';
        isError = false;

        request.response.statusCode = HttpStatus.notFound;
        request.response.write(jsonEncode(
          <String, dynamic>{
            'success': false,
            'system': true,
            'error': 'Route not found',
          },
        ));
      } else {
        path = '';
        isError = false;

        final Object result = await hFind.callback.call(request);

        request.response.write(jsonEncode(
          <String, dynamic>{
            'success': true,
            'result': result,
          },
        ));
      }
    }

    if (path != '') {
      final Object result = await _routes[method]![path]!.callback.call(
            request,
          );

      isError = false;

      request.response.write(jsonEncode(
        <String, dynamic>{
          'success': true,
          'result': result,
        },
      ));
    }
  }

  if (isError) {
    request.response.statusCode = HttpStatus.badRequest;
    request.response.write(jsonEncode(
      <String, dynamic>{
        'success': false,
        'system': false,
        'error': 'Some error was occured',
      },
    ));
  }

  await request.response.close();
}