apiMethod method
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;
}