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
105 lines
2.3 KiB
TypeScript
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>;
|
|
}
|