feat(files): MAX_VERSIONS_KEPT statt zweier Konstanten
Die Zahl stand doppelt im Quelltext: als const im Backend und noch einmal im Verlaufs-Dialog, verbunden nur durch den Kommentar "muss zu maxVersionsKept im Backend passen". Ein Satz ist keine Zusicherung - beim ersten Aendern haette der Dialog eine andere Zahl genannt als die, die der Server anwendet. Jetzt eine .env-Variable (Vorgabe 5), die der Server ueber /api/v1/public/config mitliefert. Werte unter 1 werden verworfen: Die Zahl geht als OFFSET in die Aufraeumabfrage, und OFFSET 0 loeschte jede Fassung - aus "keine Grenze" wuerde "kein Verlauf". Gemessen: MAX_VERSIONS_KEPT=3, Datei siebenmal ueberschrieben, uebrig bleiben v6, v5, v4 bei aktueller v7. Dazu ein README-Abschnitt "Versionen" - Standard aus, warum das so ist, Kontingent, und dass jedes Strg+S in Office eine Fassung anlegt. Bisher stand zu alldem nichts im README. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
7fc8bb51d5
commit
ebff565367
10 files changed
+119
-14
No files matched your search
@@ -180,6 +180,10 @@ func main() {
|
||||
|
||||
// fileHandler bekommt docStore mit: Der PDF-Betrachter holt sich darueber
|
||||
// den erkannten Text eines Scans, in Seiten zerlegt.
|
||||
// Wie viele frühere Fassungen aufgehoben werden. Einmal hier gesetzt,
|
||||
// danach nur gelesen – siehe files.SetMaxVersionsKept.
|
||||
files.SetMaxVersionsKept(cfg.MaxVersionsKept)
|
||||
|
||||
fileHandler := files.NewHandler(fileStore, blobStore, auditor, aclStore, tagStore, docStore)
|
||||
|
||||
shareStore := sharing.NewStore(pool)
|
||||
@@ -373,6 +377,10 @@ func main() {
|
||||
// Damit die Oberflaeche den Menuepunkt „Edit in Office" gar nicht
|
||||
// erst anbietet, wenn es keinen Office-Server gibt.
|
||||
"office_enabled": officeHandler.Enabled(),
|
||||
// Damit der Verlaufs-Dialog dieselbe Zahl nennt, die der Server
|
||||
// anwendet. Vorher stand sie zweimal im Quelltext, mit einem
|
||||
// Kommentar „muss zusammenpassen" – das ist keine Zusicherung.
|
||||
"max_versions_kept": cfg.MaxVersionsKept,
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -33,7 +33,26 @@ const maxUploadSize = 5 << 30 // 5 GB
|
||||
|
||||
// maxVersionsKept begrenzt den Verlauf einer Datei mit aktivierter
|
||||
// Versionierung. Ältere Fassungen werden samt Blob entfernt.
|
||||
const maxVersionsKept = 5
|
||||
//
|
||||
// Eine Paketvariable, kein Feld an Handler: Der Wert wird beim Start einmal
|
||||
// aus MAX_VERSIONS_KEPT gesetzt und danach nur gelesen. Ihn stattdessen
|
||||
// durchzureichen hieße, vier Signaturen zu ändern – auch die von
|
||||
// ReplaceContent, die der Office-Weg benutzt –, für eine Zahl, die sich zur
|
||||
// Laufzeit nie ändert.
|
||||
var maxVersionsKept = 5
|
||||
|
||||
// SetMaxVersionsKept wird einmal beim Start aufgerufen, bevor der erste
|
||||
// Request läuft.
|
||||
//
|
||||
// Kleiner als 1 wird verworfen: Die Zahl geht als OFFSET in das DELETE der
|
||||
// Aufräumabfrage, und `OFFSET 0` löschte **jede** Fassung – aus „keine Grenze"
|
||||
// würde „kein Verlauf". Wer keinen Verlauf will, lässt die Versionierung an
|
||||
// der Datei aus; dafür gibt es den Schalter schon.
|
||||
func SetMaxVersionsKept(n int) {
|
||||
if n >= 1 {
|
||||
maxVersionsKept = n
|
||||
}
|
||||
}
|
||||
|
||||
type Handler struct {
|
||||
store *Store
|
||||
|
||||
@@ -18,11 +18,14 @@ type Config struct {
|
||||
// TrustedProxies is the list of IPs/CIDRs whose X-Forwarded-* headers are trusted.
|
||||
TrustedProxies []*net.IPNet
|
||||
|
||||
DBHost string
|
||||
DBPort string
|
||||
DBName string
|
||||
DBUser string
|
||||
DBPassword string
|
||||
DBHost string
|
||||
// MaxVersionsKept: Wie viele frühere Fassungen einer Datei aufgehoben
|
||||
// werden, wenn die Versionierung für sie eingeschaltet ist.
|
||||
MaxVersionsKept int
|
||||
DBPort string
|
||||
DBName string
|
||||
DBUser string
|
||||
DBPassword string
|
||||
|
||||
SessionSecret string
|
||||
SessionMaxAge int
|
||||
@@ -151,11 +154,12 @@ func Load() (*Config, error) {
|
||||
ListenAddr: getEnv("APP_LISTEN_ADDR", ":8080"),
|
||||
PublicURL: getEnv("PUBLIC_URL", "http://localhost:8080"),
|
||||
|
||||
DBHost: getEnv("DB_HOST", "localhost"),
|
||||
DBPort: getEnv("DB_PORT", "5432"),
|
||||
DBName: getEnv("DB_NAME", "aether"),
|
||||
DBUser: getEnv("DB_USER", "aether"),
|
||||
DBPassword: getEnv("DB_PASSWORD", ""),
|
||||
DBHost: getEnv("DB_HOST", "localhost"),
|
||||
MaxVersionsKept: getEnvInt("MAX_VERSIONS_KEPT", 5),
|
||||
DBPort: getEnv("DB_PORT", "5432"),
|
||||
DBName: getEnv("DB_NAME", "aether"),
|
||||
DBUser: getEnv("DB_USER", "aether"),
|
||||
DBPassword: getEnv("DB_PASSWORD", ""),
|
||||
|
||||
SessionSecret: getEnv("SESSION_SECRET", ""),
|
||||
StoragePath: getEnv("STORAGE_PATH", "./data"),
|
||||
@@ -290,6 +294,21 @@ func parseCIDRList(raw string) ([]*net.IPNet, error) {
|
||||
return networks, nil
|
||||
}
|
||||
|
||||
// getEnvInt liest eine Zahl. Ein unbrauchbarer Wert nimmt die Vorgabe, statt
|
||||
// den Start zu verhindern: Eine Tippfehler in einer Nebensache soll nicht
|
||||
// dazu führen, dass die Cloud gar nicht erst hochkommt.
|
||||
func getEnvInt(key string, fallback int) int {
|
||||
v := os.Getenv(key)
|
||||
if v == "" {
|
||||
return fallback
|
||||
}
|
||||
n, err := strconv.Atoi(strings.TrimSpace(v))
|
||||
if err != nil || n < 0 {
|
||||
return fallback
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func getEnv(key, fallback string) string {
|
||||
if v := os.Getenv(key); v != "" {
|
||||
return v
|
||||
|
||||
Reference in new issue
Block a user