Siguientes funcionalidades
This commit is contained in:
@@ -28,6 +28,9 @@ import 'package:http/http.dart' as http;
|
||||
class ETAInfo {
|
||||
final int usuarioId;
|
||||
final String colonia;
|
||||
final String rutaNombre;
|
||||
final String rutaStatus;
|
||||
final bool gpsOk;
|
||||
final String etaTexto;
|
||||
final int etaMinutos;
|
||||
final String mensajePreventivo;
|
||||
@@ -35,6 +38,9 @@ class ETAInfo {
|
||||
ETAInfo({
|
||||
required this.usuarioId,
|
||||
required this.colonia,
|
||||
required this.rutaNombre,
|
||||
required this.rutaStatus,
|
||||
required this.gpsOk,
|
||||
required this.etaTexto,
|
||||
required this.etaMinutos,
|
||||
required this.mensajePreventivo,
|
||||
@@ -47,6 +53,9 @@ class ETAInfo {
|
||||
return ETAInfo(
|
||||
usuarioId: json['usuario_id'],
|
||||
colonia: json['colonia'],
|
||||
rutaNombre: json['ruta_nombre'] ?? '',
|
||||
rutaStatus: json['ruta_status'] ?? '',
|
||||
gpsOk: json['gps_ok'] ?? true,
|
||||
etaTexto: json['eta_texto'],
|
||||
etaMinutos: json['eta_minutos'],
|
||||
mensajePreventivo: json['mensaje_preventivo'],
|
||||
@@ -54,6 +63,77 @@ class ETAInfo {
|
||||
}
|
||||
}
|
||||
|
||||
class DireccionInfo {
|
||||
final String colonia;
|
||||
final String direccion;
|
||||
|
||||
DireccionInfo({
|
||||
required this.colonia,
|
||||
required this.direccion,
|
||||
});
|
||||
|
||||
factory DireccionInfo.fromJson(Map<String, dynamic> json) {
|
||||
return DireccionInfo(
|
||||
colonia: json['colonia'],
|
||||
direccion: json['direccion'],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class UsuarioInfo {
|
||||
final int usuarioId;
|
||||
final String nombre;
|
||||
final String email;
|
||||
final List<DireccionInfo> direcciones;
|
||||
|
||||
UsuarioInfo({
|
||||
required this.usuarioId,
|
||||
required this.nombre,
|
||||
required this.email,
|
||||
required this.direcciones,
|
||||
});
|
||||
|
||||
factory UsuarioInfo.fromJson(Map<String, dynamic> json) {
|
||||
return UsuarioInfo(
|
||||
usuarioId: json['usuario_id'],
|
||||
nombre: json['nombre'],
|
||||
email: json['email'],
|
||||
direcciones: List<Map<String, dynamic>>.from(json['direcciones'])
|
||||
.map(DireccionInfo.fromJson)
|
||||
.toList(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class RouteInfo {
|
||||
final String routeId;
|
||||
final String name;
|
||||
final String status;
|
||||
final int lastPositionId;
|
||||
final String lastTimestamp;
|
||||
final bool gpsOk;
|
||||
|
||||
RouteInfo({
|
||||
required this.routeId,
|
||||
required this.name,
|
||||
required this.status,
|
||||
required this.lastPositionId,
|
||||
required this.lastTimestamp,
|
||||
required this.gpsOk,
|
||||
});
|
||||
|
||||
factory RouteInfo.fromJson(Map<String, dynamic> json) {
|
||||
return RouteInfo(
|
||||
routeId: json['route_id'],
|
||||
name: json['name'],
|
||||
status: json['status'],
|
||||
lastPositionId: json['last_position_id'],
|
||||
lastTimestamp: json['last_timestamp'],
|
||||
gpsOk: json['gps_ok'],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// CLASE PRINCIPAL: ApiService
|
||||
// ----------------------------------------------------------------
|
||||
@@ -69,9 +149,8 @@ class ApiService {
|
||||
//
|
||||
// ATAJO: Cambia solo esta constante para apuntar a staging/prod.
|
||||
// ============================================================
|
||||
static const String _baseUrl = 'http://192.168.192.116:8000';
|
||||
// static const String _baseUrl = 'http://127.0.0.1:8000'; // iOS Simulator
|
||||
// static const String _baseUrl = 'http://192.168.1.XX:8000'; // Dispositivo físico
|
||||
static const String _baseUrl = 'http://192.168.192.96:8000';
|
||||
|
||||
|
||||
// Timeout razonable para demo. Si el backend es lento, sube a 15s.
|
||||
static const Duration _timeout = Duration(seconds: 10);
|
||||
@@ -130,6 +209,140 @@ class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// MÉTODO: loginConCorreo
|
||||
//
|
||||
// Llama a POST /api/usuarios/login con email y obtiene el usuario_id
|
||||
// ----------------------------------------------------------------
|
||||
Future<int> loginConCorreo(String email) async {
|
||||
final url = Uri.parse('$_baseUrl/api/usuarios/login');
|
||||
|
||||
final response = await http.post(
|
||||
url,
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: json.encode({'email': email.trim().toLowerCase()}),
|
||||
).timeout(_timeout);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final Map<String, dynamic> jsonData = json.decode(response.body);
|
||||
return jsonData['usuario_id'];
|
||||
} else {
|
||||
throw Exception('Error al iniciar sesión: ${response.body}');
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// MÉTODO: registrarUsuario
|
||||
//
|
||||
// Llama a POST /api/usuarios/register y crea el usuario con su primera dirección.
|
||||
// ----------------------------------------------------------------
|
||||
Future<int> registrarUsuario(
|
||||
String nombre,
|
||||
String email,
|
||||
String direccion,
|
||||
String colonia,
|
||||
) async {
|
||||
final url = Uri.parse('$_baseUrl/api/usuarios/register');
|
||||
|
||||
final response = await http.post(
|
||||
url,
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: json.encode({
|
||||
'nombre': nombre.trim(),
|
||||
'email': email.trim().toLowerCase(),
|
||||
'colonia': colonia,
|
||||
'direccion': direccion.trim(),
|
||||
}),
|
||||
).timeout(_timeout);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final Map<String, dynamic> jsonData = json.decode(response.body);
|
||||
return jsonData['usuario_id'];
|
||||
} else {
|
||||
throw Exception('Error al registrar usuario: ${response.body}');
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// MÉTODO: obtenerUsuario
|
||||
//
|
||||
// Llama a GET /api/usuarios/{usuario_id} y retorna los datos de perfil.
|
||||
// ----------------------------------------------------------------
|
||||
Future<UsuarioInfo> obtenerUsuario(int usuarioId) async {
|
||||
final url = Uri.parse('$_baseUrl/api/usuarios/$usuarioId');
|
||||
|
||||
final response = await http.get(url).timeout(_timeout);
|
||||
if (response.statusCode == 200) {
|
||||
final Map<String, dynamic> jsonData = json.decode(response.body);
|
||||
return UsuarioInfo.fromJson(jsonData);
|
||||
} else {
|
||||
throw Exception('Error al obtener usuario: ${response.body}');
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// MÉTODO: obtenerRutas
|
||||
//
|
||||
// Llama a GET /api/rutas para listar el estado actual de cada camión.
|
||||
// ----------------------------------------------------------------
|
||||
Future<List<RouteInfo>> obtenerRutas() async {
|
||||
final url = Uri.parse('$_baseUrl/api/rutas');
|
||||
final response = await http.get(url).timeout(_timeout);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final Map<String, dynamic> jsonData = json.decode(response.body);
|
||||
return List<Map<String, dynamic>>.from(jsonData['rutas'])
|
||||
.map(RouteInfo.fromJson)
|
||||
.toList();
|
||||
}
|
||||
|
||||
throw Exception('Error al obtener rutas: ${response.body}');
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// MÉTODO: avanzarRuta
|
||||
//
|
||||
// Llama a POST /api/rutas/{route_id}/avanzar para simular el avance del camión.
|
||||
// ----------------------------------------------------------------
|
||||
Future<RouteInfo> avanzarRuta(String routeId) async {
|
||||
final url = Uri.parse('$_baseUrl/api/rutas/$routeId/avanzar');
|
||||
final response = await http.post(url).timeout(_timeout);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final Map<String, dynamic> jsonData = json.decode(response.body);
|
||||
return RouteInfo.fromJson(jsonData);
|
||||
}
|
||||
|
||||
throw Exception('Error al avanzar la ruta: ${response.body}');
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// MÉTODO: agregarDireccion
|
||||
//
|
||||
// Llama a POST /api/usuarios/{usuario_id}/direcciones para guardar
|
||||
// una nueva dirección asociada al usuario.
|
||||
// ----------------------------------------------------------------
|
||||
Future<void> agregarDireccion(
|
||||
int usuarioId,
|
||||
String colonia,
|
||||
String direccion,
|
||||
) async {
|
||||
final url = Uri.parse('$_baseUrl/api/usuarios/$usuarioId/direcciones');
|
||||
|
||||
final response = await http.post(
|
||||
url,
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: json.encode({
|
||||
'colonia': colonia,
|
||||
'direccion': direccion.trim(),
|
||||
}),
|
||||
).timeout(_timeout);
|
||||
|
||||
if (response.statusCode != 200) {
|
||||
throw Exception('Error al guardar la dirección: ${response.body}');
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// MÉTODO: registrarFcmToken
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user