import 'dart:async'; import 'dart:developer'; import 'dart:io'; import 'package:http/http.dart' as http; import '../../apiParams.dart'; import '../../apiRequest.dart'; import '../../apiResponse.dart'; import '../../errors/auth_exception.dart'; import '../../errors/network_exception.dart'; import '../../errors/not_found_exception.dart'; import '../../errors/parse_exception.dart'; import '../../errors/server_exception.dart'; import '../nextcloud_ocs.dart'; enum TalkApiMethod { get, post, put, delete, } abstract class TalkApi extends ApiRequest { String path; ApiParams? body; Map? headers; Map? getParameters; http.Response? response; TalkApi(this.path, this.body, {this.headers, this.getParameters}); Future? request(Uri uri, ApiParams? body, Map? headers); T assemble(String raw); Future run() async { final endpoint = NextcloudOcs.uri('apps/spreed/api/$path', queryParameters: getParameters); final mergedHeaders = {...NextcloudOcs.headers(), ...?headers}; final http.Response data; try { final raw = await request(endpoint, body, mergedHeaders); if (raw == null) { throw const NetworkException( userMessage: 'Keine Antwort vom Talk-Server erhalten.', technicalDetails: 'Talk request returned null', ); } data = raw; } on SocketException catch (e) { throw NetworkException(technicalDetails: 'Talk $endpoint: ${e.message}'); } on TimeoutException catch (e) { throw NetworkException.timeout(technicalDetails: 'Talk $endpoint: $e'); } on http.ClientException catch (e) { throw NetworkException(technicalDetails: 'Talk $endpoint: ${e.message}'); } final status = data.statusCode; if (status < 200 || status >= 300) { final detail = 'Talk $endpoint -> HTTP $status'; log(detail); if (status == 401) throw AuthException.unauthorized(technicalDetails: detail); if (status == 403) throw AuthException.forbidden(technicalDetails: detail); if (status == 404) throw NotFoundException(technicalDetails: detail); throw ServerException(statusCode: status, technicalDetails: detail); } try { final assembled = assemble(data.body); assembled?.headers = data.headers; return assembled; } catch (e) { throw ParseException(technicalDetails: 'Talk $endpoint assemble: $e'); } } }