import "dart:convert"; import "package:http/http.dart" as http; import "../config/api_config.dart"; class ApiClient { final http.Client _client; ApiClient({http.Client? client}) : _client = client ?? http.Client(); Uri _uri(String path, [Map? query]) { return Uri.parse(ApiConfig.baseUrl).replace( path: path, queryParameters: query?.map((key, value) => MapEntry(key, "$value")), ); } Future> getList( String path, { Map? query, }) async { final response = await _client.get(_uri(path, query)); _ensureSuccess(response); return jsonDecode(response.body) as List; } Future> getMap( String path, { Map? query, }) async { final response = await _client.get(_uri(path, query)); _ensureSuccess(response); return jsonDecode(response.body) as Map; } Future> post( String path, Map body, ) async { final response = await _client.post( _uri(path), headers: {"Content-Type": "application/json"}, body: jsonEncode(body), ); _ensureSuccess(response); return jsonDecode(response.body) as Map; } Future> put( String path, Map body, ) async { final response = await _client.put( _uri(path), headers: {"Content-Type": "application/json"}, body: jsonEncode(body), ); _ensureSuccess(response); return jsonDecode(response.body) as Map; } Future delete(String path) async { final response = await _client.delete(_uri(path)); _ensureSuccess(response); } void _ensureSuccess(http.Response response) { if (response.statusCode < 200 || response.statusCode >= 300) { throw Exception("Request failed: ${response.statusCode}"); } } }