apiMethod method

bool apiMethod(
  1. MethodReflection apiMethod, [
  2. APIRequestMethod? requestMethod
])

Adds a route from apiMethod, using the same name of the methods as route. See MethodReflectionExtension.isAPIMethod.

  • requestMethod the route request method.

Implementation

bool apiMethod(MethodReflection apiMethod,
    [APIRequestMethod? requestMethod]) {
  var classReflection = apiMethod.classReflection;

  if (classReflection.supperTypes.contains(APIModule) &&
      APIModule.interfaceMethodsNames.contains(apiMethod.name)) {
    return false;
  }

  var returnsAPIResponse = apiMethod.returnsAPIResponse;
  var receivesAPIRequest = apiMethod.receivesAPIRequest;

  var methodRules = apiMethod.annotations.whereType<APIRouteRule>().toList();
  var classRules =
      classReflection.classAnnotations.whereType<APIRouteRule>().toList();

  List<APIRouteRule> rules;
  if (methodRules.isEmpty) {
    rules = classRules;
  } else {
    var noGlobalRules = methodRules.any((r) => r.noGlobalRules);

    rules = noGlobalRules
        ? methodRules
        : [
            ...methodRules,
            ...classRules.where((r) => r.globalRules),
          ];
  }

  var config = apiMethod.annotations.whereType<APIRouteConfig>().firstOrNull;

  if (returnsAPIResponse && receivesAPIRequest) {
    var paramName = apiMethod.normalParametersNames.first;
    var parameters = <String, TypeInfo>{paramName: APIRequest.typeInfo};

    add(
      requestMethod,
      apiMethod.name,
      // ignore: discarded_futures
      (req) => _apiMethodStandard(apiMethod, req),
      parameters: parameters,
      rules: rules,
      config: config,
    );

    return true;
  } else if (receivesAPIRequest) {
    var paramName = apiMethod.normalParametersNames.first;
    var parameters = <String, TypeInfo>{paramName: APIRequest.typeInfo};

    add(
      requestMethod,
      apiMethod.name,
      // ignore: discarded_futures
      (req) => _apiMethodStandard(apiMethod, req),
      parameters: parameters,
      rules: rules,
      config: config,
    );

    return true;
  } else if (returnsAPIResponse) {
    var parameters = Map<String, TypeInfo>.fromEntries(apiMethod.allParameters
        .map((p) => MapEntry(p.name, TypeInfo.from(p))));

    add(
      requestMethod,
      apiMethod.name,
      // ignore: discarded_futures
      (req) => _apiMethodInvocation(apiMethod, req),
      parameters: parameters,
      rules: rules,
      config: config,
    );

    return true;
  }

  return false;
}