Setting up basic API Structure

This commit is contained in:
2026-08-28 14:54:54 +02:00
parent 968228cbc3
commit b3a13cd5a2
18 changed files with 974 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
/// Central configuration of the backend Rest API (.Net Web API).
///
/// The API is reached over plain http because it only ever gets called
/// inside of a trusted network.
class ApiConfig {
const ApiConfig({
this.scheme = 'http',
this.host = 'localhost',
this.port = 5000,
this.basePath = '',
this.timeout = const Duration(seconds: 15),
this.defaultHeaders = const {},
});
final String scheme;
final String host;
final int? port;
/// Optional prefix in front of every controller route, e.g. `api`.
final String basePath;
final Duration timeout;
final Map<String, String> defaultHeaders;
/// Default configuration used by [AcApi] when nothing else is provided.
static const ApiConfig development = ApiConfig();
ApiConfig copyWith({
String? scheme,
String? host,
int? port,
String? basePath,
Duration? timeout,
Map<String, String>? defaultHeaders,
}) {
return ApiConfig(
scheme: scheme ?? this.scheme,
host: host ?? this.host,
port: port ?? this.port,
basePath: basePath ?? this.basePath,
timeout: timeout ?? this.timeout,
defaultHeaders: defaultHeaders ?? this.defaultHeaders,
);
}
/// Builds an absolute [Uri] for a controller route like `agents`.
Uri buildUri(String path, [Map<String, dynamic>? queryParameters]) {
final segments = <String>[
...basePath.split('/'),
...path.split('/'),
].where((segment) => segment.isNotEmpty).toList();
Map<String, String>? query;
if (queryParameters != null && queryParameters.isNotEmpty) {
query = <String, String>{};
queryParameters.forEach((key, value) {
if (value != null) {
query![key] = value.toString();
}
});
if (query.isEmpty) {
query = null;
}
}
return Uri(
scheme: scheme,
host: host,
port: port,
pathSegments: segments,
queryParameters: query,
);
}
}