Files
app-hyggecraftery/lib/services/order_service.dart
2026-01-03 15:24:36 +01:00

155 lines
4.6 KiB
Dart

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
import '../models/order.dart';
import '../services/auth_service.dart';
import 'woocommerce_service.dart';
class OrderService {
final AuthService _authService = AuthService();
/// Holt alle Bestellungen des eingeloggten Benutzers
Future<List<Order>> getOrders({int perPage = 20, int page = 1}) async {
try {
// Versuche zuerst mit JWT Token
final token = await _authService.getToken();
if (token != null) {
return await _getOrdersWithToken(token, perPage, page);
}
// Fallback: Verwende WooCommerce Customer API
return await _getOrdersWithCredentials(perPage, page);
} catch (e) {
throw Exception('Fehler beim Abrufen der Bestellungen: $e');
}
}
Future<List<Order>> _getOrdersWithToken(String token, int perPage, int page) async {
try {
final uri = Uri.parse('${WooCommerceService.baseUrl}/wp-json/wc/v3/orders').replace(
queryParameters: {
'per_page': perPage.toString(),
'page': page.toString(),
'customer': 'me', // Holt Bestellungen des aktuellen Benutzers
},
);
final response = await http.get(
uri,
headers: {
'Authorization': 'Bearer $token',
},
);
if (response.statusCode == 200) {
final List<dynamic> data = json.decode(response.body);
return data.map((json) => Order.fromJson(json)).toList();
} else {
throw Exception('Fehler: ${response.statusCode}');
}
} catch (e) {
// Fallback zur Credentials-Methode
return await _getOrdersWithCredentials(perPage, page);
}
}
Future<List<Order>> _getOrdersWithCredentials(int perPage, int page) async {
try {
final prefs = await SharedPreferences.getInstance();
final username = prefs.getString('username');
final password = prefs.getString('password');
if (username == null || password == null) {
throw Exception('Nicht eingeloggt');
}
// Hole Customer ID
final customerId = await _getCustomerId(username, password);
if (customerId == null) {
throw Exception('Kunde nicht gefunden');
}
final credentials = base64Encode(utf8.encode('$username:$password'));
final uri = Uri.parse('${WooCommerceService.baseUrl}/wp-json/wc/v3/orders').replace(
queryParameters: {
'per_page': perPage.toString(),
'page': page.toString(),
'customer': customerId.toString(),
},
);
final response = await http.get(
uri,
headers: {
'Authorization': 'Basic $credentials',
},
);
if (response.statusCode == 200) {
final List<dynamic> data = json.decode(response.body);
return data.map((json) => Order.fromJson(json)).toList();
} else {
throw Exception('Fehler: ${response.statusCode}');
}
} catch (e) {
throw Exception('Fehler beim Abrufen der Bestellungen: $e');
}
}
Future<int?> _getCustomerId(String username, String password) async {
try {
final credentials = base64Encode(utf8.encode('$username:$password'));
final uri = Uri.parse('${WooCommerceService.baseUrl}/wp-json/wc/v3/customers');
final response = await http.get(
uri,
headers: {
'Authorization': 'Basic $credentials',
},
);
if (response.statusCode == 200) {
final customers = json.decode(response.body) as List;
final customer = customers.firstWhere(
(c) => c['email'] == username || c['username'] == username,
orElse: () => null,
);
return customer != null ? customer['id'] : null;
}
} catch (e) {
print('Fehler beim Abrufen der Customer ID: $e');
}
return null;
}
/// Holt Details einer einzelnen Bestellung
Future<Order> getOrder(int orderId) async {
try {
final token = await _authService.getToken();
if (token != null) {
final uri = Uri.parse('${WooCommerceService.baseUrl}/wp-json/wc/v3/orders/$orderId');
final response = await http.get(
uri,
headers: {
'Authorization': 'Bearer $token',
},
);
if (response.statusCode == 200) {
final data = json.decode(response.body);
return Order.fromJson(data);
}
}
throw Exception('Nicht autorisiert');
} catch (e) {
throw Exception('Fehler beim Abrufen der Bestellung: $e');
}
}
}