Add recipe share links with configurable validity, public guest access, and revocation

This commit is contained in:
2026-10-23 14:47:34 +02:00
parent 42f3de191c
commit e3bf88f018
6 changed files with 4498 additions and 3094 deletions
File diff suppressed because it is too large Load Diff
+118
View File
@@ -0,0 +1,118 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<title>Link nicht mehr gültig – Mein Kochbuch</title>
<link rel="stylesheet" href="/static/cookbook.css?v=4.7.1">
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>⏳</text></svg>">
<style>
.expired-page-wrapper {
min-height: 80vh;
display: flex;
align-items: center;
justify-content: center;
padding: 24px 16px;
}
.expired-card {
background: var(--creme, #faf6f0);
border: 2.5px solid var(--schwarz, #2a2a2a);
border-radius: 16px;
box-shadow: 6px 6px 0px rgba(30, 77, 59, 0.4);
max-width: 520px;
width: 100%;
padding: 36px 28px;
text-align: center;
position: relative;
}
.expired-icon {
font-size: 3.5rem;
margin-bottom: 16px;
display: inline-block;
animation: float-gentle 3s ease-in-out infinite;
}
.expired-title {
font-family: var(--font-hand, 'Caveat', cursive);
font-size: 2.2rem;
color: var(--tannengruen, #1e4d3b);
margin: 0 0 14px 0;
line-height: 1.2;
}
.expired-desc {
font-size: 1.05rem;
color: #4a4a4a;
line-height: 1.6;
margin-bottom: 20px;
}
.expired-meta-box {
background: rgba(30, 77, 59, 0.07);
border: 1.5px dashed var(--tannengruen, #1e4d3b);
border-radius: 10px;
padding: 12px 16px;
font-size: 0.92rem;
color: var(--tannengruen, #1e4d3b);
margin-bottom: 24px;
}
.expired-actions {
display: flex;
justify-content: center;
gap: 12px;
flex-wrap: wrap;
}
@keyframes float-gentle {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-6px); }
}
</style>
</head>
<body class="cookbook-body">
<header class="cb-nav">
<div class="cb-nav-brand">
<span class="cb-brand-icon">📖</span>
<h1 class="cb-nav-title">Mein Kochbuch</h1>
</div>
</header>
<main class="expired-page-wrapper">
<div class="expired-card">
<div class="expired-icon">
{% if reason == 'revoked' %}🔒{% else %}⏳{% endif %}
</div>
<h2 class="expired-title">
{% if reason == 'revoked' %}
Freigabe wurde deaktiviert
{% elif reason == 'expired' %}
Rezept-Link ist abgelaufen
{% else %}
Link nicht gefunden
{% endif %}
</h2>
<p class="expired-desc">
{% if reason == 'revoked' %}
Dieser Share-Link wurde vom Ersteller des Rezepts vorzeitig zurückgezogen.
{% elif reason == 'expired' %}
Die zeitliche Gültigkeit für diesen geteilten Rezept-Link ist leider abgelaufen. Bitte frage die Person, die das Rezept geteilt hat, nach einem neuen Link.
{% else %}
Der aufgerufene Share-Link ist ungültig oder existiert nicht mehr.
{% endif %}
</p>
{% if share and share.expires_at_formatted and reason == 'expired' %}
<div class="expired-meta-box">
Ablaufzeitpunkt: <strong>{{ share.expires_at_formatted }} Uhr</strong>
</div>
{% endif %}
<div class="expired-actions">
<a href="/login" class="cb-btn cb-btn-green">
<span>📖</span> <span>Zum Kochbuch / Anmelden</span>
</a>
</div>
</div>
</main>
</body>
</html>