diff --git a/elementor/routes.py b/elementor/routes.py new file mode 100644 index 0000000..1181c67 --- /dev/null +++ b/elementor/routes.py @@ -0,0 +1,106 @@ +from flask import Blueprint, render_template, session, request, jsonify +import json +from db import get_db +from utils.theme_engine import get_theme_config + + +elementor_bp = Blueprint( + 'elementor', + __name__, + template_folder='templates', + static_folder='static', + static_url_path='/elementor/static' +) + + +def _render_builder(site_id, builder_mode='default', **_kwargs): + conn = get_db() + c = conn.cursor() + c.execute('SELECT user_id, slug, theme, content_json FROM sites WHERE id = ?', (site_id,)) + site = c.fetchone() + + if not site: + conn.close() + return 'Sitio no encontrado', 404 + + if 'user_id' in session and site[0] != session['user_id']: + conn.close() + return 'No autorizado', 403 + + content = json.loads(site[3]) if site[3] else {} + if not isinstance(content, dict): + content = {} + + theme = site[2] + theme_config = get_theme_config(theme) + + c.execute('SELECT plan, rubro FROM users WHERE id = ?', (site[0],)) + user_data = c.fetchone() + conn.close() + user_plan = user_data[0] if user_data else 'base' + user_rubro = user_data[1] if user_data else 'restaurante' + + return render_template( + 'elementor_builder.html', + site_id=site_id, + slug=site[1], + theme=theme, + content=content, + theme_config=theme_config, + user_plan=user_plan, + rubro=user_rubro, + builder_mode=builder_mode + ) + + +@elementor_bp.route('/elementor/') +def elementor_view(site_id): + return _render_builder(site_id, builder_mode='default') + + +@elementor_bp.route('/ub24/') +def ub24_view(site_id): + return _render_builder(site_id, builder_mode='ub24') + + +@elementor_bp.route('/api/elementor/save', methods=['POST']) +def save_elementor(): + data = request.get_json(silent=True) or {} + site_id = data.get('site_id') + content = data.get('content') + publish = bool(data.get('publish')) + + if not site_id or not isinstance(content, dict): + return jsonify({'success': False, 'error': 'Payload invalido'}), 400 + + conn = get_db() + c = conn.cursor() + c.execute('SELECT user_id, content_json FROM sites WHERE id = ?', (site_id,)) + row = c.fetchone() + if not row: + conn.close() + return jsonify({'success': False, 'error': 'Sitio no encontrado'}), 404 + + owner_id = row[0] + if 'user_id' in session and session['user_id'] != owner_id: + conn.close() + return jsonify({'success': False, 'error': 'No autorizado'}), 403 + + current_content = {} + try: + if row[1]: + current_content = json.loads(row[1]) or {} + except Exception: + current_content = {} + + merged = dict(current_content) + merged.update(content) + + if publish: + c.execute('UPDATE sites SET content_json = ?, status = ? WHERE id = ?', (json.dumps(merged), 'published', site_id)) + else: + c.execute('UPDATE sites SET content_json = ? WHERE id = ?', (json.dumps(merged), site_id)) + + conn.commit() + conn.close() + return jsonify({'success': True, 'published': publish})