Commit abd13ab8 by yenisleydi

categoria api

parent c4971193
import 'dart:convert'; // Importa el paquete para trabajar con JSON.
import 'dart:convert'; // Para convertir datos a JSON
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:primer_practica/src/http_api/category_service.dart';
import 'package:primer_practica/src/models/categoryModel.dart';
class CategoryController {
final Connectivity _connectivity = Connectivity(); // Crea una instancia de Connectivity para verificar el estado de la red.
final Connectivity _connectivity = Connectivity();
// Método para obtener las categorías
Future<Map<String, dynamic>> getCategories() async {
// Inicializa la respuesta por defecto.
Map<String, dynamic> mapResp = {
'ok': false,
'message': 'No hay categorias',
'data': null
};
// Verifica la conectividad.
ConnectivityResult connectivityResult = (await _connectivity.checkConnectivity()) as ConnectivityResult;
ConnectivityResult connectivityResult = (await _connectivity.checkConnectivity());
// Si hay conexión a internet.
if (connectivityResult != ConnectivityResult.none) {
if (connectivityResult == ConnectivityResult.wifi || connectivityResult == ConnectivityResult.mobile) {
CategoryService categoryApi = CategoryService(); // Crea una instancia de CategoryApi.
Map<String, dynamic> respGet = await categoryApi.getCategories(); // Obtiene las categorías desde la API.
CategoryService categoryApi = CategoryService();
Map<String, dynamic> respGet = await categoryApi.getCategories();
// Si la respuesta de la API es exitosa.
if (respGet['statusCode'] == 200) {
try {
var decodeResp = json.decode(respGet['body']); // Decodifica la respuesta JSON.
List<CategoryModel> listCategories = CategoryModel.fromJsonArray(decodeResp['data']); // Convierte los datos en una lista de categorías.
mapResp['ok'] = true; // Marca la operación como exitosa.
mapResp['message'] = "${listCategories.length} categorias encontradas"; // Actualiza el mensaje con el número de categorías encontradas.
mapResp['data'] = listCategories; // Asigna los datos de las categorías a la respuesta.
var decodeResp = json.decode(respGet['body']);
List<CategoryModel> listCategories = CategoryModel.fromJsonArray(decodeResp['data']);
mapResp['ok'] = true;
mapResp['message'] = "${listCategories.length} categorías encontradas";
mapResp['data'] = listCategories;
} catch (e) {
mapResp['message'] = "Error en operador $e"; // Captura y asigna cualquier error durante la decodificación.
mapResp['message'] = "Error en decodificación: $e";
}
} else {
mapResp['message'] = "${respGet['body']}";
}
}
}
return mapResp;
}
// Método para agregar una categoría
Future<Map<String, dynamic>> addCategory(CategoryModel category) async {
Map<String, dynamic> mapResp = {
'ok': false,
'message': 'No se pudo agregar la categoría'
};
ConnectivityResult connectivityResult = (await _connectivity.checkConnectivity());
if (connectivityResult != ConnectivityResult.none) {
if (connectivityResult == ConnectivityResult.wifi || connectivityResult == ConnectivityResult.mobile) {
CategoryService categoryApi = CategoryService();
Map<String, dynamic> respPost = await categoryApi.postCategory(category);
if (respPost['statusCode'] == 201) {
mapResp['ok'] = true;
mapResp['message'] = 'Categoría agregada exitosamente';
} else {
mapResp['message'] = "${respGet['body']}"; // Asigna el mensaje de error de la API a la respuesta.
mapResp['message'] = "${respPost['body']}";
}
}
}
return mapResp; // Retorna la respuesta
return mapResp;
}
}
import 'dart:convert'; // Para convertir datos a JSON
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import 'package:primer_practica/environments/urls.dart' as api;
import 'package:primer_practica/src/models/categoryModel.dart';
class CategoryService {
static const String apiBaseUrl = 'categoria';
// Método para obtener las categorías
Future<Map<String, dynamic>> getCategories({int offset = 0, int max = 100}) async {
String url = '${api.apiApp}/$apiBaseUrl?offset=$offset&max=$max';
final String url = '${api.apiApp}/$apiBaseUrl?offset=$offset&max=$max';
if (kDebugMode) {
print('Url -> $url');
}
try {
final resp = await http.get(Uri.parse(url));
return {"statusCode": resp.statusCode, "body": resp.body};
final response = await http.get(Uri.parse(url));
return {
'statusCode': response.statusCode,
'body': response.body,
};
} catch (e) {
return {"statusCode": 501, "body": '$e'};
return {
'statusCode': 501,
'body': '$e',
};
}
}
// Método para enviar una nueva categoría al servidor
Future<Map<String, dynamic>> postCategory(CategoryModel category) async {
final String url = '${api.apiApp}/$apiBaseUrl';
//conversión del objeto a Json
final categoryJson = category.toJson();
// Imprime la URL y el cuerpo de la solicitud
if (kDebugMode) {
print('Url -> $url');
print('Body -> $categoryJson');
}
try {
// Realiza la solicitud POST al servidor
final response = await http.post(
Uri.parse(url), // Convierte la URL a un objeto Uri
headers: {'Content-Type': 'application/json'}, // Establece el tipo de contenido como JSON
body: json.encode(categoryJson),
);
return {
'statusCode': response.statusCode,
'body': response.body,
};
} catch (e) {
return {
'statusCode': 501,
'body': '$e',
};
}
}
}
......@@ -4,8 +4,8 @@ class CategoryModel {
int id;
int? version;
String? key;
String? name;
int? createdDate;
String name;
int createdDate;
CategoryModel? parentCategory;
List<CategoryModel>? subCategories;
bool? active;
......@@ -14,8 +14,8 @@ class CategoryModel {
required this.id,
this.version,
this.key,
this.name,
this.createdDate,
required this.name,
required this.createdDate,
this.parentCategory,
this.subCategories,
this.active,
......
import 'package:flutter/material.dart';
import 'package:primer_practica/src/controllers/categoty_controller.dart';
import 'package:primer_practica/src/models/categoryModel.dart';
import 'package:primer_practica/src/config/routes.dart';
class FormularioCategoria extends StatefulWidget {
const FormularioCategoria({super.key});
......@@ -10,6 +13,7 @@ class FormularioCategoria extends StatefulWidget {
class _FormularioCategoriaState extends State<FormularioCategoria> {
final _nombreController = TextEditingController();
final _claveController = TextEditingController();
final CategoryController _categoryController = CategoryController(); // Instancia del controlador
@override
void dispose() {
......@@ -18,12 +22,11 @@ class _FormularioCategoriaState extends State<FormularioCategoria> {
super.dispose();
}
void _guardarCategoria() {
final nombre = _nombreController.text; // se obtiene el calor de nombre y clave
Future<void> _guardarCategoria() async {
final nombre = _nombreController.text; // Obtiene el valor de nombre y clave
final clave = _claveController.text;
if (nombre.isEmpty || clave.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Por favor, complete todos los campos')),
);
......@@ -32,15 +35,27 @@ class _FormularioCategoriaState extends State<FormularioCategoria> {
final fechaCreado = DateTime.now().millisecondsSinceEpoch;
final categoria = {
"clave": clave,
"fechaCreado": fechaCreado,
"nombre": nombre,
};
final categoria = CategoryModel(
id: 0,
key: clave,
name: nombre,
createdDate: fechaCreado,
);
final result = await _categoryController.addCategory(categoria); // Llama al método para agregar categoría
print(categoria);
if (result['ok']) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(result['message'])), // Muestra mensaje de éxito
);
Navigator.pop(context);
Navigator.pushNamed(context, 'home');
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(result['message'])),
);
}
}
@override
......@@ -50,7 +65,7 @@ class _FormularioCategoriaState extends State<FormularioCategoria> {
title: const Text('Agregar Categoría'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
padding: const EdgeInsets.all(16.0), // Ajuste del padding para un diseño más estético
child: Column(
children: <Widget>[
TextField(
......@@ -58,13 +73,13 @@ class _FormularioCategoriaState extends State<FormularioCategoria> {
decoration: const InputDecoration(labelText: 'Clave'),
keyboardType: TextInputType.text,
),
const SizedBox(height: 16),
const SizedBox(height: 16), // Ajuste del espacio entre campos
TextField(
controller: _nombreController,
decoration: const InputDecoration(labelText: 'Nombre'),
keyboardType: TextInputType.text,
),
const SizedBox(height: 16),
const SizedBox(height: 24), // Ajuste del espacio entre campos y botón
ElevatedButton(
onPressed: _guardarCategoria,
child: const Text('GUARDAR'),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment