69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
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 |