Files
Kontrollverlust/frontend/src/types.ts
T
irrlichtandClaude Opus 5.5 07a2b64eff Statistik: tägliche SVG-Diagramme statt CSS-Balken
Der Server rendert einmal täglich (0:01 Uhr deutscher Zeit) Liniendiagramme
für Aufrufe, Netze und Beiträge pro Tag sowie gestapelte Säulen (Threads/
Antworten) für den Ø pro Wochentag und pro Tageszeit, je schmal (600) und
breit (1200), ausgeliefert über /api/stats/charts. Hovern zeigt den
Datenpunkt in einer Infozeile und markiert ihn mit einer senkrechten Linie.

Die Statistik-Seite wird auf breiten Bildschirmen bis 1200 px breit.
"Netze nach Betreiber" entfällt; neu ist die Kennzahl Ø Beiträge/Tag der
letzten 30 Tage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TiXsPUqw7oeomZ8wZrQW5q
2026-10-06 20:13:30 +02:00

105 lines
2.3 KiB
TypeScript

// Typen der JSON-API; Referenz ist notes/api.md. Zeitstempel sind
// Unix-Sekunden.
export interface Entry {
pid: number;
uid: number;
created_at: number;
content: string;
filepath: string;
reply_to: number;
reply_count: number;
last_activity: number;
deleted: number;
bump_count: number;
last_bump: number;
username: string;
avatar: string;
// Vorschau des ersten Links, sobald der Server sie geholt hat.
preview?: LinkPreview;
// Nur in Feed und Antwortliste: jüngster Beitrag im Teilbaum, skipped =
// Beiträge auf dem Pfad dazwischen (0 = direkte Antwort).
latest?: { entry: Entry; skipped: number };
}
// Vom Server geholte Linkvorschau; thumb liegt lokal (leer = kein Bild).
export interface LinkPreview {
url: string;
kind: "youtube" | "page";
title: string;
site: string;
thumb: string;
}
export interface Thread {
entry: Entry;
ancestors: Entry[];
replies: Entry[];
}
export type VoteMode = "yes" | "no";
export interface VoteTally {
pid: number;
yes: number;
no: number;
selected: VoteMode | "none";
}
export interface BumpResult {
pid: number;
bump_count: number;
last_bump: number;
last_activity: number;
retry_after: number;
}
// GET /api/user/info -- das eigene Konto.
export interface Me {
uid: number;
username: string;
created_at: number;
last_login: number;
avatar: string;
}
// GET /api/u/{username}/info -- öffentliches Profil.
export interface Profile {
uid: number;
username: string;
created_at: number;
avatar: string;
}
export interface StatsDetail {
users: number;
entries: number;
toplevel: number;
replies: number;
votes: { yes: number; no: number };
impressions_total: number;
visitors_total: number;
entries_per_day_30: number;
}
// Fertig gerenderte SVG-Diagramme der Statistik-Seite (einmal täglich,
// charts.go), je schmal (600) und breit (1200).
export interface ChartPair {
narrow: string;
wide: string;
}
export interface StatsCharts {
generated: number;
charts: Record<"impressions" | "networks" | "entries" | "weekday" | "hour", ChartPair>;
}
// Fehlerformat: {"error": {...}}, bei manchen Fehlern mit Zusatzfeldern
// daneben (Repost-Cooldown: retry_after, bump_count).
export interface ApiErrorBody {
code: string;
message: string;
field?: string;
fields?: Record<string, string>;
}