Skip to content

Commit

Permalink
add model client and routes
Browse files Browse the repository at this point in the history
  • Loading branch information
zmatias committed Nov 21, 2024
1 parent 753c856 commit a33d09b
Show file tree
Hide file tree
Showing 4 changed files with 137 additions and 2 deletions.
2 changes: 2 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import os
from colorama import Fore, Back, Style
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity
from routes.clientes import clientes


app = Flask(__name__)
Expand Down Expand Up @@ -57,6 +58,7 @@ def load_user(user_id):
app.register_blueprint(asig_operador_vehiculo)
app.register_blueprint(modelos_vehiculos)
app.register_blueprint(proveedores_repuesto)
app.register_blueprint(clientes)

if not os.getenv('ENV'):
os.environ['ENV'] = 'development'
Expand Down
6 changes: 5 additions & 1 deletion models/cliente.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ class Cliente(db.Model):
direccion: Mapped[str] = mapped_column(nullable=True)
email: Mapped[str] = mapped_column(nullable=True)
telefono: Mapped[str] = mapped_column(nullable=True)
usuario_cliente: Mapped[str] = mapped_column(nullable=True)
contrasena: Mapped[str] = mapped_column(nullable=True)

def serialize(self):
return {
Expand All @@ -18,7 +20,9 @@ def serialize(self):
'nombre': self.nombre,
'direccion': self.direccion,
'email': self.email,
'telefono': self.telefono
'telefono': self.telefono,
'usuario_cliente': self.usuario_cliente,
'contrasena': self.contrasena
}

@staticmethod
Expand Down
127 changes: 127 additions & 0 deletions routes/clientes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required,create_access_token
from extensiones import db, bcrypt
from models.cliente import Cliente
from datetime import timedelta

clientes = Blueprint('clientes', __name__)

# Endpoint para listar todos los clientes
@clientes.route('/clientes', methods=['GET'])
@jwt_required()
def listar_clientes():
clientes = Cliente.listar_json()
return jsonify(clientes), 200


# Endpoint para agregar un nuevo cliente
@clientes.route('/clientes', methods=['POST'])
@jwt_required()
def agregar_cliente():
data = request.json

cuit = data.get('cuit')
nombre = data.get('nombre')
direccion = data.get('direccion')
email = data.get('email')
telefono = data.get('telefono')
usuario_cliente = data.get('usuario_cliente')
contrasena = data.get('contrasena')
id_operador = data.get('id_operador')

# Validación básica de datos obligatorios
if not cuit or not nombre or not usuario_cliente or not contrasena:
return jsonify(error='CUIT, Nombre, Usuario y Contraseña son obligatorios'), 400

# Verificar que el CUIT o el usuario no existan
if Cliente.query.filter_by(cuit=cuit).first():
return jsonify(error='CUIT ya registrado'), 400

if Cliente.query.filter_by(usuario_cliente=usuario_cliente).first():
return jsonify(error='Usuario ya registrado'), 400

# Encriptar la contraseña
contrasena_encriptada = bcrypt.generate_password_hash(contrasena).decode('utf-8')

# Crear y guardar el cliente
nuevo_cliente = Cliente(
cuit=cuit,
nombre=nombre,
direccion=direccion,
email=email,
telefono=telefono,
usuario_cliente=usuario_cliente,
contrasena=contrasena_encriptada,
id_operador=id_operador
)
Cliente.agregar(nuevo_cliente)
return jsonify(nuevo_cliente.serialize()), 201


@clientes.route('/clientes/login', methods=['POST'])
def login_cliente():
data = request.json
usuario_cliente = data.get('usuario_cliente')
contrasena = data.get('contrasena')

# Validar entrada
if not usuario_cliente or not contrasena:
return jsonify(error='Usuario y contraseña son requeridos'), 400

# Buscar cliente por usuario_cliente
cliente = Cliente.query.filter_by(usuario_cliente=usuario_cliente).first()
if not cliente:
return jsonify(error='Credenciales incorrectas'), 401

# Verificar contraseña
if not bcrypt.check_password_hash(cliente.contrasena, contrasena):
return jsonify(error='Credenciales incorrectas'), 401

# Generar token JWT
access_token = create_access_token(
identity=cliente.id,
expires_delta=timedelta(hours=1),
additional_claims={"usuario_cliente": cliente.usuario_cliente}
)

return jsonify(access_token=access_token, id=cliente.id, nombre=cliente.nombre), 200



# Endpoint para eliminar un cliente por ID
@clientes.route('/clientes/<int:id>', methods=['DELETE'])
@jwt_required()
def eliminar_cliente(id):
cliente = Cliente.encontrarPorId(id)
if not cliente:
return jsonify(error='Cliente no encontrado'), 404

Cliente.eliminar(cliente)
return jsonify(message='Cliente eliminado correctamente'), 200


# Endpoint para actualizar un cliente por ID
@clientes.route('/clientes/<int:id>', methods=['PUT'])
@jwt_required()
def actualizar_cliente(id):
data = request.json
cliente = Cliente.encontrarPorId(id)

if not cliente:
return jsonify(error='Cliente no encontrado'), 404

cliente.nombre = data.get('nombre', cliente.nombre)
cliente.direccion = data.get('direccion', cliente.direccion)
cliente.email = data.get('email', cliente.email)
cliente.telefono = data.get('telefono', cliente.telefono)
cliente.usuario_cliente = data.get('usuario_cliente', cliente.usuario_cliente)

# Encriptar la nueva contraseña si se proporciona
nueva_contrasena = data.get('contrasena')
if nueva_contrasena:
cliente.contrasena = bcrypt.generate_password_hash(nueva_contrasena).decode('utf-8')

cliente.id_operador = data.get('id_operador', cliente.id_operador)

Cliente.actualizar()
return jsonify(cliente.serialize()), 200
4 changes: 3 additions & 1 deletion tablas.sql
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,9 @@ CREATE TABLE cliente (
nombre text,
direccion text,
email text,
telefono text
telefono text,
usuario_cliente text,
contrasena text
);

CREATE TABLE gasto (
Expand Down

0 comments on commit a33d09b

Please sign in to comment.