from flask import Blueprint, request, jsonify from app.database import db # ⬇️ Cambiamos esta línea para importar desde el módulo raíz de modelos ⬇️ from app.models import User, Role from app.middlewares.auth_middleware import token_required import jwt import datetime import os # (El resto del código del archivo auth.py queda exactamente igual) auth_bp = Blueprint('auth', __name__) @auth_bp.route('/register', methods=['POST']) def register(): data = request.get_json() if not data or not data.get('username') or not data.get('password') or not data.get('email'): return jsonify({'message': 'Datos incompletos'}), 400 if User.query.filter((User.username == data['username']) | (User.email == data['email'])).first(): return jsonify({'message': 'El usuario o email ya existe'}), 400 # Asignar un rol por defecto si no se especifica (ej: el ID del rol investigador) default_role = Role.query.filter_by(name='investigador').first() new_user = User( username=data['username'], email=data['email'], role_id=default_role.id if default_role else None ) new_user.set_password(data['password']) db.session.add(new_user) db.session.commit() return jsonify({'message': 'Usuario registrado con éxito'}), 201 @auth_bp.route('/login', methods=['POST']) def login(): data = request.get_json() if not data or not data.get('username') or not data.get('password'): return jsonify({'message': 'Credenciales requeridas'}), 400 user = User.query.filter_by(username=data['username']).first() if not user or not user.check_password(data['password']): return jsonify({'message': 'Usuario o contraseña incorrectos'}), 401 # Generación del JWT Token payload = { 'user_id': user.id, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=2) } token = jwt.encode(payload, os.environ.get('JWT_SECRET_KEY', 'secret'), algorithm='HS256') return jsonify({ 'token': token, 'user': user.to_dict() }), 200 @auth_bp.route('/me', methods=['GET']) @token_required def me(current_user): # 'current_user' es inyectado automáticamente por nuestro middleware 'token_required' return jsonify(current_user.to_dict()), 200