Files
Finlytic/FinlyticApp/lib/features/trades/repositories/trade_repository.dart
T

91 lines
3.3 KiB
Dart

import 'dart:async';
import 'package:finlytic_app/core/network/api_client.dart';
import 'package:finlytic_app/features/trades/models/trade_model.dart';
import 'package:finlytic_app/features/trades/models/trade_acceptance_dto.dart';
import 'package:finlytic_app/features/trades/models/close_trade_request_dto.dart';
import 'package:finlytic_app/features/trades/models/derivative_item_model.dart';
class TradeRepository {
final ApiClient apiClient;
const TradeRepository({required this.apiClient});
Future<List<TradeModel>> fetchTrades({String? isin, String? status}) async {
try {
final queryParams = <String, dynamic>{
'_t': DateTime.now().millisecondsSinceEpoch,
};
if (isin != null && isin.isNotEmpty) queryParams['isin'] = isin;
if (status != null && status.isNotEmpty) queryParams['status'] = status;
final response = await apiClient.get('/api/v1/user/trades', queryParameters: queryParams);
if (response.statusCode == 200 && response.data != null) {
final List<dynamic> data = response.data;
return data.map((json) => TradeModel.fromJson(json)).toList();
}
return [];
} catch (e) {
throw Exception('Trades konnten nicht geladen werden: $e');
}
}
Future<List<DerivativeItemModel>> fetchDerivatives(
String isin, {
String optionType = 'long',
double? targetLeverage,
double? minLeverage,
double? maxLeverage,
String? search,
String? after,
int? page,
bool forceRefresh = false,
}) async {
try {
final queryParams = <String, dynamic>{
'optionType': optionType,
if (targetLeverage != null && targetLeverage > 0) 'targetLeverage': targetLeverage,
if (minLeverage != null) 'minLeverage': minLeverage,
if (maxLeverage != null) 'maxLeverage': maxLeverage,
if (search != null && search.isNotEmpty) 'search': search,
if (after != null && after.isNotEmpty) 'after': after,
if (page != null) 'page': page,
if (forceRefresh) 'forceRefresh': 'true',
'_t': DateTime.now().millisecondsSinceEpoch,
};
final response = await apiClient.get('/api/v1/assets/$isin/derivatives', queryParameters: queryParams);
if (response.statusCode == 200 && response.data != null) {
final List<dynamic> data = response.data;
return data.map((json) => DerivativeItemModel.fromJson(json)).toList();
}
return [];
} catch (e) {
throw Exception('Derivate konnten nicht geladen werden: $e');
}
}
Future<void> acceptTrade(TradeAcceptanceDto dto) async {
final response = await apiClient.post('/api/v1/user/trades/accept', data: dto.toJson());
if (response.statusCode != 200) {
throw Exception('Trade konnte nicht akzeptiert werden');
}
}
Future<void> rejectTrade(String tradeId) async {
final response = await apiClient.post('/api/v1/user/trades/$tradeId/reject');
if (response.statusCode != 200) {
throw Exception('Trade konnte nicht abgelehnt werden');
}
}
Future<void> closeTrade(String id, {CloseTradeRequestDto? dto}) async {
final response = await apiClient.post('/api/v1/user/trades/$id/close', data: dto?.toJson());
if (response.statusCode != 200) {
throw Exception('Trade konnte nicht geschlossen werden');
}
}
}