import 'package:flutter_project/shared/data/remote/remote.dart'; import 'package:flutter_project/shared/domain/models/either.dart'; import 'package:flutter_project/shared/domain/models/paginated_response.dart'; import 'package:flutter_project/shared/exceptions/http_exception.dart'; import 'package:flutter_project/shared/globals.dart'; abstract class DashboardDatasource { Future> fetchPaginatedProducts( {required int skip}); Future> searchPaginatedProducts( {required int skip, required String query}); } class DashboardRemoteDatasource extends DashboardDatasource { final NetworkService networkService; DashboardRemoteDatasource(this.networkService); @override Future> fetchPaginatedProducts( {required int skip}) async { final response = await networkService.get( '/products', queryParameters: { 'skip': skip, 'limit': PRODUCTS_PER_PAGE, }, ); return response.fold( (l) => Left(l), (r) { final jsonData = r.data; if (jsonData == null) { return Left( AppException( identifier: 'fetchPaginatedData', statusCode: 0, message: 'The data is not in the valid format.', ), ); } final paginatedResponse = PaginatedResponse.fromJson(jsonData, jsonData['products'] ?? []); return Right(paginatedResponse); }, ); } @override Future> searchPaginatedProducts( {required int skip, required String query}) async { final response = await networkService.get( '/products/search?q=$query', queryParameters: { 'skip': skip, 'limit': PRODUCTS_PER_PAGE, }, ); return response.fold( (l) => Left(l), (r) { final jsonData = r.data; if (jsonData == null) { return Left( AppException( identifier: 'search PaginatedData', statusCode: 0, message: 'The data is not in the valid format.', ), ); } final paginatedResponse = PaginatedResponse.fromJson(jsonData, jsonData['products'] ?? []); return Right(paginatedResponse); }, ); } }