78 lines
2.4 KiB
Dart
78 lines
2.4 KiB
Dart
import 'dart:async';
|
|
import 'dart:developer';
|
|
import 'dart:io';
|
|
|
|
import 'package:http/http.dart' as http;
|
|
|
|
import '../../api_params.dart';
|
|
import '../../api_request.dart';
|
|
import '../../api_response.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<T extends ApiResponse?> extends ApiRequest {
|
|
String path;
|
|
ApiParams? body;
|
|
Map<String, String>? headers;
|
|
Map<String, dynamic>? getParameters;
|
|
|
|
http.Response? response;
|
|
|
|
TalkApi(this.path, this.body, {this.headers, this.getParameters});
|
|
|
|
Future<http.Response>? request(Uri uri, ApiParams? body, Map<String, String>? headers);
|
|
T assemble(String raw);
|
|
|
|
Future<T> 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');
|
|
}
|
|
}
|
|
}
|