Mail-Graveyard/backend/00-router.go
2026-07-12 17:18:56 +02:00

87 lines
3.9 KiB
Go

package backend
import (
"fmt"
"net/http"
)
func RegisterRoutes(mux *http.ServeMux) {
mux.HandleFunc("/", homeHandler)
mux.HandleFunc("/login", loginHandler)
// Umzug (Konten pflegen + starten/beobachten)
mux.HandleFunc("/accounts", accountsHandler) // TODO Codex (02/07)
mux.HandleFunc("/accounts/save", accountSaveHandler) // TODO Codex
mux.HandleFunc("/accounts/delete", accountDeleteHandler) // TODO Codex
mux.HandleFunc("/accounts/test", accountTestHandler) // TODO Codex: Quelle+Ziel-Login pruefen
mux.HandleFunc("/migrate/run", migrateRunHandler) // TODO Codex: RunMigration im Hintergrund
mux.HandleFunc("/migrate/status", migrateStatusHandler) // TODO Codex: jobs-Fortschritt (HTMX-Poll)
// Viewer (lokale mbox betrachten + weiterleiten)
mux.HandleFunc("/view", viewerHandler)
mux.HandleFunc("/view/source/select", sourceSelectHandler)
mux.HandleFunc("/view/message", messageHandler)
mux.HandleFunc("/view/target", targetMessageHandler)
mux.HandleFunc("/view/target/select", targetSelectHandler)
mux.HandleFunc("/view/manual-copy", manualCopyHandler)
mux.HandleFunc("/view/forward", forwardHandler)
}
// homeHandler rendert die Outlook-2013-Oberflaeche (Dreispalter). Der linke
// Baum, die Nachrichtenliste und der Lesebereich werden per HTMX nachgeladen.
func homeHandler(w http.ResponseWriter, r *http.Request) {
// "active" ist die CSS-Klasse fuer den hervorgehobenen Reiter. Wenn Codex
// weitere Seiten baut, jeweils den passenden Reiter aktiv setzen.
renderShell(w, "active", `<div class="ef-empty">Konto links waehlen oder unter „Postfaecher" anlegen.</div>`)
}
// renderShell ist das Grundgeruest im Outlook-2013-Look:
//
// [ Ribbon: Archiv-Boxen | Import/Export | Postfach-Verwaltung | Mail-Transfer | Einstellungen | Mail-Graveyard ]
// [ Archiv-mbox | Nachrichtenliste | Quelle/Target ]
func renderShell(w http.ResponseWriter, active, readingPane string) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Mail-Graveyard</title>
<link rel="stylesheet" href="/static/style.css?v=20260712-2">
<script src="/static/htmx.min.js"></script>
<script src="/static/app.js?v=20260712-2" defer></script></head>
<body class="ol2013">
<header class="ribbon">
<nav class="ribbon-tabs">
<a class="tab %s" href="/view"><span class="mail-logo" aria-hidden="true"></span><span>Archiv-Boxen</span></a>
<a class="tab" href="/view">Import/Export</a>
<a class="tab" href="/accounts">Postfach-Verwaltung</a>
<a class="tab" href="/view">Mail-Transfer</a>
<a class="tab" href="/accounts">Einstellungen</a>
</nav>
<div class="ribbon-title">Mail-Graveyard</div>
</header>
<div class="three-pane">
<aside class="pane pane-tree" id="tree"
hx-get="/view" hx-trigger="load" hx-target="#tree" hx-swap="innerHTML">
<div class="pane-head">Archiv-Mailbox</div>
</aside>
<div class="pane-resizer" data-resize-index="0"></div>
<section class="pane pane-list" id="list">
<div class="pane-head">Nachrichten</div>
</section>
<div class="pane-resizer" data-resize-index="1"></div>
<section class="pane pane-read" id="read">
%s
</section>
</div>
<footer class="statusbar"><span id="mig-status"
hx-get="/migrate/status" hx-trigger="every 3s" hx-swap="innerHTML">bereit</span></footer>
</body></html>`, active, renderInitialReadPane(readingPane))
}
// --- Stubs fuer die noch nicht gebauten Handler (TODO Codex) ---
func accountsHandler(w http.ResponseWriter, r *http.Request) {}
func accountSaveHandler(w http.ResponseWriter, r *http.Request) {}
func accountDeleteHandler(w http.ResponseWriter, r *http.Request) {}
func accountTestHandler(w http.ResponseWriter, r *http.Request) {}
func migrateRunHandler(w http.ResponseWriter, r *http.Request) {}
func migrateStatusHandler(w http.ResponseWriter, r *http.Request) {}