import 'dart:developer'; import 'package:dartz/dartz.dart'; import 'package:data_channel/data_channel.dart'; import 'package:injectable/injectable.dart'; import '../../../domain/wallet/wallet.dart'; import '../datasources/customer_remote_data_provider.dart'; @Injectable(as: IOrderRepository) class OrderRepository implements IOrderRepository { final CustomerRemoteDataProvider _remoteDataProvider; final String _logName = 'OrderRepository'; OrderRepository(this._remoteDataProvider); @override Future> getOrders({ required int page, int limit = 20, }) => _run( 'getOrders', () => _remoteDataProvider.fetchOrders(page: page, limit: limit), (dto) => dto.toDomain(), ); @override Future> getOrderDetail( String id, ) => _run( 'getOrderDetail', () => _remoteDataProvider.fetchOrderDetail(id), (dto) => dto.toDetailDomain(), ); Future> _run( String name, Future> Function() call, R Function(D dto) toDomain, ) async { try { final result = await call(); if (result.hasError) return left(result.error!); return right(toDomain(result.data as D)); } catch (e, s) { log(name, name: _logName, error: e, stackTrace: s); return left(const WalletFailure.unexpectedError()); } } }