''')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
data = request.get_json()
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('SELECT id, password FROM users WHERE email = ?', (data['email'],))
user = c.fetchone()
conn.close()
if user and check_password_hash(user[1], data['password']):
session['user_id'] = user[0]
return jsonify({'success': True})
return jsonify({'error': 'Credenciales inválidas'}), 401
return render_template_string('''
Login
Login
''')
@app.route('/dashboard')
def dashboard():
if 'user_id' not in session:
return redirect('/login')
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('SELECT id, slug, status FROM sites WHERE user_id = ?', (session['user_id'],))
sites = c.fetchall()
conn.close()
sites_html = ''.join([f'
'}
''')
@app.route('/create', methods=['GET', 'POST'])
def create():
if 'user_id' not in session:
return redirect('/login')
if request.method == 'POST':
data = request.get_json()
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
content = json.dumps({
'site_name': data.get('site_name', 'Mi Sitio'),
'hero_title': data.get('hero_title', 'Bienvenido'),
'colors': {'primary': '#ff4d4d', 'secondary': '#1a1a1a'}
})
c.execute('INSERT INTO sites (user_id, slug, content) VALUES (?, ?, ?)',
(session['user_id'], data['slug'], content))
site_id = c.lastrowid
conn.commit()
conn.close()
return jsonify({'success': True, 'site_id': site_id})
return render_template_string('''
Crear Sitio
➕ Crear Sitio
''')
@app.route('/customizer/')
def customizer(site_id):
if 'user_id' not in session:
return redirect('/login')
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('SELECT content FROM sites WHERE id = ? AND user_id = ?', (site_id, session['user_id']))
site = c.fetchone()
conn.close()
if not site:
return "No encontrado", 404
content = json.loads(site[0])
return render_template_string(f'''
Customizer
⚙️ Personalizar
{content.get('hero_title', 'Título')}
''')
@app.route('/api/save/', methods=['POST'])
def save(site_id):
if 'user_id' not in session:
return jsonify({'error': 'No autorizado'}), 401
data = request.get_json()
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('UPDATE sites SET content = ? WHERE id = ? AND user_id = ?',
(json.dumps(data['content']), site_id, session['user_id']))
conn.commit()
conn.close()
return jsonify({'success': True})
@app.route('/api/submit/', methods=['POST'])
def submit(site_id):
if 'user_id' not in session:
return jsonify({'error': 'No autorizado'}), 401
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('UPDATE sites SET status = ? WHERE id = ? AND user_id = ?',
('pending', site_id, session['user_id']))
conn.commit()
conn.close()
return jsonify({'success': True})
@app.route('/admin')
def admin():
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('SELECT id, slug, status FROM sites WHERE status = ?', ('pending',))
requests = c.fetchall()
c.execute('SELECT id, slug, status FROM sites')
sites = c.fetchall()
conn.close()
return render_template_string(f'''
Admin
🔧 Admin
Solicitudes Pendientes
ID
Slug
Acción
{''.join([f'
{r[0]}
{r[1]}
' for r in requests])}
Todos los Sitios
ID
Slug
Status
{''.join([f'
{s[0]}
{s[1]}
{s[2]}
' for s in sites])}
''')
@app.route('/api/approve/', methods=['POST'])
def approve(site_id):
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('UPDATE sites SET status = ? WHERE id = ?', ('published', site_id))
conn.commit()
conn.close()
return jsonify({'success': True})
@app.route('/site/')
def site(slug):
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('SELECT content FROM sites WHERE slug = ? AND status = ?', (slug, 'published'))
site = c.fetchone()
conn.close()
if not site:
return "Sitio no encontrado", 404
content = json.loads(site[0])
return render_template_string(f'''
{content.get('site_name', 'Sitio')}