import 'dart:developer'; import 'package:http/http.dart' as http; import '../../api_params.dart'; import '../../api_response.dart'; import '../../errors/network_exception.dart'; import '../../errors/parse_exception.dart'; import '../../http_errors.dart'; import '../nextcloud_ocs.dart'; abstract class TalkApi { String path; ApiParams? body; Map? headers; Map? getParameters; 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 data = await sendGuarded( 'Talk $endpoint', () => request(endpoint, body, mergedHeaders), ); if (data == null) { throw const NetworkException( userMessage: 'Keine Antwort vom Talk-Server erhalten.', technicalDetails: 'Talk request returned null', ); } final status = data.statusCode; if (status < 200 || status >= 300) { // Talk's OCS errors carry the real reason in the body (expired session, // removed participant, ...); include a trimmed preview so the dialog and // logs surface the cause instead of just the bare status code. final detail = httpErrorDetail('Talk $endpoint', data.body, status); log(detail); throwForStatus(status, detail); } try { final assembled = assemble(data.body); assembled?.headers = data.headers; return assembled; } catch (e) { throw ParseException(technicalDetails: 'Talk $endpoint assemble: $e'); } } }