105 lines
3.8 KiB
Dart
105 lines
3.8 KiB
Dart
import 'dart:convert';
|
|
import 'package:http/http.dart' as http;
|
|
import '../core/constants.dart';
|
|
import '../models/member.dart';
|
|
import 'auth_service.dart';
|
|
import 'member_repository.dart';
|
|
|
|
export 'member_repository.dart';
|
|
|
|
class MemberService implements MemberRepository {
|
|
final _auth = AuthService();
|
|
|
|
Future<Map<String, String>> _headers() async {
|
|
final token = await _auth.getToken();
|
|
return {
|
|
if (token != null) 'Authorization': 'Bearer $token',
|
|
'Accept': 'application/json',
|
|
};
|
|
}
|
|
|
|
Future<Member> _fetch(String url) async {
|
|
final res = await http.get(Uri.parse(url), headers: await _headers());
|
|
if (res.statusCode == 200) {
|
|
return Member.fromJson(jsonDecode(res.body) as Map<String, dynamic>);
|
|
}
|
|
throw Exception('Error ${res.statusCode}');
|
|
}
|
|
|
|
@override Future<Member> first() => _fetch('$kApiBase/members/first');
|
|
@override Future<Member> last() => _fetch('$kApiBase/members/last');
|
|
@override Future<Member> show(int id) => _fetch('$kApiBase/members/$id');
|
|
@override Future<Member> prev(int id) => _fetch('$kApiBase/members/$id/prev');
|
|
@override Future<Member> next(int id) => _fetch('$kApiBase/members/$id/next');
|
|
|
|
@override
|
|
Future<Map<String, String>> search(String term) async {
|
|
final uri = Uri.parse('$kApiBase/members/search')
|
|
.replace(queryParameters: {'term': term});
|
|
final res = await http.get(uri, headers: await _headers());
|
|
if (res.statusCode == 200) {
|
|
final data = jsonDecode(res.body) as Map<String, dynamic>;
|
|
return data.map((k, v) => MapEntry(k, v.toString()));
|
|
}
|
|
return {};
|
|
}
|
|
|
|
Future<Map<String, String>> _postHeaders() async =>
|
|
{...await _headers(), 'Content-Type': 'application/json'};
|
|
|
|
// POST → respuesta con clave "member"
|
|
Future<Member> _postWrapped(String path, Map<String, dynamic> body) async {
|
|
final res = await http.post(Uri.parse('$kApiBase/$path'),
|
|
headers: await _postHeaders(), body: jsonEncode(body));
|
|
if (res.statusCode == 200) {
|
|
final data = jsonDecode(res.body) as Map<String, dynamic>;
|
|
return Member.fromJson(data['member'] as Map<String, dynamic>);
|
|
}
|
|
throw Exception('Error ${res.statusCode}');
|
|
}
|
|
|
|
// POST → respuesta es directamente el objeto member
|
|
Future<Member> _postDirect(String path, Map<String, dynamic> body) async {
|
|
final res = await http.post(Uri.parse('$kApiBase/$path'),
|
|
headers: await _postHeaders(), body: jsonEncode(body));
|
|
if (res.statusCode == 200) {
|
|
return Member.fromJson(jsonDecode(res.body) as Map<String, dynamic>);
|
|
}
|
|
throw Exception('Error ${res.statusCode}');
|
|
}
|
|
|
|
@override
|
|
Future<Member> paidCaution(int id) => _postDirect('members/paid-caution', {'pk_i_id': id});
|
|
|
|
@override
|
|
Future<Member> retener(int id) => _postWrapped('members/retener', {'member': id});
|
|
|
|
@override
|
|
Future<Member> retenerCancel(int id) => _postWrapped('members/retener-cancel', {'member': id});
|
|
|
|
@override
|
|
Future<Member> recover(int id) => _postDirect('members/recover', {'pk_i_id': id});
|
|
|
|
@override
|
|
Future<Map<String, int>> preDelete(int id) async {
|
|
final res = await http.post(Uri.parse('$kApiBase/members/pre-delete'),
|
|
headers: await _postHeaders(), body: jsonEncode({'pk_i_id': id}));
|
|
if (res.statusCode == 200) {
|
|
final data = jsonDecode(res.body) as Map<String, dynamic>;
|
|
return {
|
|
'pendientes': (data['pendientes'] as num).toInt(),
|
|
'devueltos': (data['devueltos'] as num).toInt(),
|
|
'revision': (data['revision'] as num).toInt(),
|
|
};
|
|
}
|
|
throw Exception('Error ${res.statusCode}');
|
|
}
|
|
|
|
@override
|
|
Future<Member> delete(int id, String unregDate, String unregReason) =>
|
|
_postDirect('members/delete', {
|
|
'pk_i_id': id,
|
|
'd_unreg_date': unregDate,
|
|
's_unreg_reason': unregReason,
|
|
});
|
|
}
|