import 'package:logging/logging.dart'; import 'package:pshared/service/authorization/service.dart'; class BasicService { final String _objectType; final Logger _logger; final List Function(Map json) fromJson; Logger get logger => _logger; BasicService({ required String objectType, required this.fromJson, }) : _objectType = objectType, _logger = Logger('service.$objectType'); Future> list(String organizationRef, String parentRef) async { _logger.fine('Loading all objects'); return _getObjects( AuthorizationService.getGETResponse(_objectType, '/list/$organizationRef/$parentRef'), ); } Future get(String objectRef) async { _logger.fine('Loading object $objectRef'); final objects = await _getObjects( AuthorizationService.getGETResponse(_objectType, '/$objectRef'), ); return objects.first; } Future> create(String organizationRef, Map request) async { _logger.fine('Creating new object...'); return _getObjects( AuthorizationService.getPOSTResponse(_objectType, '/$organizationRef', request), ); } Future> update(Map request) async { _logger.fine('Patching object...'); return _getObjects( AuthorizationService.getPUTResponse(_objectType, '/', request, ), ); } Future> delete(String objecRef) async { _logger.fine('Deleting object $objecRef'); return _getObjects( AuthorizationService.getDELETEResponse(_objectType, '/$objecRef', {}), ); } Future> _getObjects(Future> future) async { try { final responseJson = await future; final objects = fromJson(responseJson); _logger.fine('Fetched ${objects.length} object(s)'); return objects; } catch (e, stackTrace) { _logger.severe('Failed to fetch objects', e, stackTrace); rethrow; } } }