Modularización de GKACHELE SaaS
This commit is contained in:
122
demo/routes/auth.py
Normal file
122
demo/routes/auth.py
Normal file
@@ -0,0 +1,122 @@
|
||||
from flask import Blueprint, render_template, request, jsonify, session, redirect, url_for
|
||||
from werkzeug.security import generate_password_hash, check_password_hash
|
||||
import sqlite3
|
||||
import json
|
||||
import secrets
|
||||
import random
|
||||
import os
|
||||
from config import MAIN_DB, THEMES_DIR
|
||||
from utils.theme_engine import get_themes_by_rubro, get_theme_config
|
||||
|
||||
auth_bp = Blueprint('auth', __name__)
|
||||
|
||||
@auth_bp.route('/register', methods=['GET', 'POST'])
|
||||
def register():
|
||||
"""Registro - Sistema Simple y Profesional"""
|
||||
if request.method == 'POST':
|
||||
try:
|
||||
data = request.get_json() if request.is_json else (request.form.to_dict() if request.form else {})
|
||||
if not data:
|
||||
return jsonify({'success': False, 'error': 'Sin datos'}), 400
|
||||
|
||||
email = str(data.get('email', '')).strip()
|
||||
password = str(data.get('password', '')).strip()
|
||||
plan = str(data.get('plan', 'base'))
|
||||
rubro = str(data.get('rubro', 'gimnasio'))
|
||||
|
||||
if not email or '@' not in email:
|
||||
return jsonify({'success': False, 'error': 'Email inválido'}), 400
|
||||
if not password:
|
||||
return jsonify({'success': False, 'error': 'Contraseña requerida'}), 400
|
||||
|
||||
conn = sqlite3.connect(MAIN_DB)
|
||||
c = conn.cursor()
|
||||
|
||||
try:
|
||||
c.execute('INSERT INTO users (email, password, plan, rubro) VALUES (?, ?, ?, ?)',
|
||||
(email, generate_password_hash(password), plan, rubro))
|
||||
user_id = c.lastrowid
|
||||
except sqlite3.IntegrityError:
|
||||
conn.close()
|
||||
return jsonify({'success': False, 'error': 'Email ya existe'}), 400
|
||||
|
||||
theme = 'default'
|
||||
themes_by_rubro = get_themes_by_rubro(rubro)
|
||||
|
||||
if themes_by_rubro:
|
||||
theme = random.choice(list(themes_by_rubro.keys()))
|
||||
|
||||
theme_config = get_theme_config(theme)
|
||||
default_colors = {'primary': '#c94d4d', 'secondary': '#d97757', 'accent': '#f4a261', 'text': '#2c2c2c'}
|
||||
default_typography = {'font_family': 'Roboto'}
|
||||
|
||||
if theme_config:
|
||||
default_colors = theme_config.get('colors', default_colors)
|
||||
default_typography = theme_config.get('typography', default_typography)
|
||||
|
||||
content = json.dumps({
|
||||
'site_name': email.split('@')[0].title() + ' Site',
|
||||
'hero_title': 'Bienvenido',
|
||||
'colors': default_colors,
|
||||
'typography': default_typography
|
||||
})
|
||||
|
||||
slug = f'site-{secrets.token_hex(4)}'
|
||||
|
||||
c.execute('INSERT INTO sites (user_id, slug, theme, content_json) VALUES (?, ?, ?, ?)',
|
||||
(user_id, slug, theme, content))
|
||||
site_id = c.lastrowid
|
||||
|
||||
# Menús por defecto
|
||||
for loc, title, url, order in [('header', 'Inicio', '#inicio', 0), ('footer', 'Contacto', '#contacto', 1)]:
|
||||
c.execute('INSERT INTO menus (user_id, site_id, location, title, url, order_index) VALUES (?, ?, ?, ?, ?, ?)',
|
||||
(user_id, site_id, loc, title, url, order))
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
return jsonify({'success': True, 'message': 'Registro exitoso. Inicia sesión.', 'redirect': url_for('auth.login')})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({'success': False, 'error': str(e)}), 500
|
||||
|
||||
return render_template('register.html', plan=request.args.get('plan', 'base'), rubro=request.args.get('rubro', 'gimnasio'))
|
||||
|
||||
@auth_bp.route('/login', methods=['GET', 'POST'])
|
||||
def login():
|
||||
"""Login"""
|
||||
if request.method == 'POST':
|
||||
try:
|
||||
data = request.get_json()
|
||||
email = data.get('email')
|
||||
password = data.get('password')
|
||||
|
||||
conn = sqlite3.connect(MAIN_DB)
|
||||
c = conn.cursor()
|
||||
c.execute('SELECT id, password FROM users WHERE email = ?', (email,))
|
||||
user = c.fetchone()
|
||||
conn.close()
|
||||
|
||||
if user and check_password_hash(user[1], password):
|
||||
session['user_id'] = user[0]
|
||||
|
||||
# Buscar sitio para redirigir
|
||||
conn = sqlite3.connect(MAIN_DB)
|
||||
c = conn.cursor()
|
||||
c.execute('SELECT id FROM sites WHERE user_id = ? LIMIT 1', (user[0],))
|
||||
site = c.fetchone()
|
||||
conn.close()
|
||||
|
||||
redirect_url = url_for('customizer.customizer_view', site_id=site[0]) if site else url_for('dashboard.dashboard_view')
|
||||
return jsonify({'success': True, 'redirect': redirect_url})
|
||||
|
||||
return jsonify({'success': False, 'error': 'Credenciales inválidas'}), 401
|
||||
except Exception as e:
|
||||
return jsonify({'success': False, 'error': str(e)}), 500
|
||||
|
||||
return render_template('login.html')
|
||||
|
||||
@auth_bp.route('/logout')
|
||||
def logout():
|
||||
session.pop('user_id', None)
|
||||
return redirect(url_for('public.landing'))
|
||||
Reference in New Issue
Block a user