mail drin
fehlende routen drin
prod-reife erreicht.
TODOS:
Deine aktuellen offenen TODOs
1. Rate-Limiting (Spam-Schutz VOR dem reCAPTCHA)
Das reCAPTCHA hält zwar Bots ab, aber wenn jemand böswillig ein Script schreibt, das 1.000 POST-Requests pro Sekunde an /api/v1/submissions sendet, muss dein Backend jedes Mal Google kontaktieren und die Datenbank befragen. Das frisst Server-Ressourcen.
Todo: Einbinden von Flask-Limiter und Absichern der API-Route (z.B. max. 10 Submissions pro Minute pro IP-Adresse oder Tenant).
2. Billing & Feature-Enforcement (Limits pro Tenant durchsetzen)
Die Mandanten-Architektur und das config-Feld im JSON existieren bereits. Aber wir erzwingen diese Limits aktuell nicht im Backend.
Todo: Im Dashboard (templates/admin/tenants/view.html) UI-Controls einbauen, um Feature-Flags für einen Tenant festzulegen:
max_forms (z.B. 1 für Free-User, 10 für Pro-User).
allow_instant_mail (Dürfen E-Mails an den Tenant gesendet werden?).
allow_autoresponder (Darf der Autoresponder für Endkunden genutzt werden?).
Todo: Diese Limits hart im Backend (beim Erstellen von Forms und beim Mailversand) kontrollieren. (Der Mailer prüft das zwar schon halbwegs, das UI zum Pflegen fehlt aber noch komplett).
3. E-Mail Templates aufwerten (HTML statt Plain-Text)
Bisher versendet der Service E-Mails als reinen Text (plain). Für eine professionelle SaaS-Lösung sollten diese Mails ansprechend aussehen.
Todo: Im services/mailer.py den MIMEMultipart so erweitern, dass er saubere HTML-Mails aus einem Jinja2-Template (templates/emails/...) generiert, inklusive Branding/Logo deines Services.
4. Frontend-Snippet "Graceful Degradation"
Das embed.js arbeitet aktuell sehr gut. Aber was ist, wenn das Formeleon-Backend mal für 5 Minuten down ist?
Todo: Einen sauberen Timeout im fetch einbauen und dem Endkunden auf der Webseite eine schöne, fallback HTML-Meldung anzeigen ("Entschuldigung, das Formular ist momentan nicht erreichbar"), anstatt dass sich das Script lautlos in der Console mit einem CORS/Network-Error verabschiedet.
5. CI/CD Pipeline (Deployment)
Wenn der Code fertig ist, willst du ihn sicher nicht immer händisch per git pull auf deinen Produktionsserver schieben und dort docker compose up tippen.
Todo: Eine simple Pipeline (Github Actions / Gitea Actions) anlegen, die den Code testet und automatisch auf dem Zielserver ausrollt.
127 lines
4.4 KiB
HTML
127 lines
4.4 KiB
HTML
{# ==============================================================================
|
|
Formeleon - Multi-tenant Form Generator
|
|
Author: Björn Runden <br@runden.net>
|
|
Template: index.html
|
|
Description: Simple welcome page for root URL.
|
|
============================================================================== #}
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>{{_('Formeleon - Form Generator')}}</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css">
|
|
<style>
|
|
body {
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
min-height: 100vh;
|
|
}
|
|
|
|
.welcome-container {
|
|
max-width: 800px;
|
|
margin: 0 auto;
|
|
padding: 4rem 2rem;
|
|
}
|
|
|
|
.welcome-card {
|
|
background: white;
|
|
border-radius: 1rem;
|
|
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
|
|
padding: 3rem;
|
|
}
|
|
|
|
.welcome-card h1 {
|
|
color: #333;
|
|
font-weight: 700;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.welcome-card p {
|
|
color: #666;
|
|
font-size: 1.1rem;
|
|
line-height: 1.6;
|
|
}
|
|
|
|
.btn-primary {
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
border: none;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.feature-list {
|
|
list-style: none;
|
|
padding: 0;
|
|
}
|
|
|
|
.feature-list li {
|
|
padding: 0.5rem 0;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
}
|
|
|
|
.feature-list i {
|
|
color: #667eea;
|
|
font-size: 1.25rem;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="welcome-container">
|
|
<div class="welcome-card text-center">
|
|
<div class="mb-4">
|
|
<i class="bi bi-file-earmark-text-fill" style="font-size: 4rem; color: #667eea;"></i>
|
|
</div>
|
|
|
|
<h1>Welcome to Formeleon</h1>
|
|
<p class="lead">Multi-tenant Form Generator with Bot Protection</p>
|
|
|
|
<hr class="my-4">
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-md-6 mb-3">
|
|
<ul class="feature-list text-start">
|
|
<li><i class="bi bi-check-circle-fill"></i> Dynamic Form Generation</li>
|
|
<li><i class="bi bi-check-circle-fill"></i> Multi-Tenant Support</li>
|
|
<li><i class="bi bi-check-circle-fill"></i> reCAPTCHA v3 Protection</li>
|
|
</ul>
|
|
</div>
|
|
<div class="col-md-6 mb-3">
|
|
<ul class="feature-list text-start">
|
|
<li><i class="bi bi-check-circle-fill"></i> Zitadel OIDC Integration</li>
|
|
<li><i class="bi bi-check-circle-fill"></i> RESTful API</li>
|
|
<li><i class="bi bi-check-circle-fill"></i> Easy Embedding</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<hr class="my-4">
|
|
|
|
<div class="d-grid gap-3">
|
|
<a href="/admin/" class="btn btn-primary btn-lg">
|
|
<i class="bi bi-speedometer2"></i> Dashboard
|
|
</a>
|
|
<a href="/admin/forms/" class="btn btn-outline-secondary btn-lg">
|
|
<i class="bi bi-file-earmark-text"></i> Manage Forms
|
|
</a>
|
|
<a href="/api/v1/status" class="btn btn-outline-info btn-lg">
|
|
<i class="bi bi-check-circle"></i> API Status
|
|
</a>
|
|
</div>
|
|
|
|
{% if dev_mode %}
|
|
<div class="mt-4 p-3 bg-warning bg-opacity-10 rounded">
|
|
<i class="bi bi-bug-fill text-warning"></i>
|
|
<strong>Development Mode</strong> is enabled
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
</body>
|
|
</html>
|