commit 8d48d219fdd66ac64e79bbb237e7e406321a1dee
parent 5f2166b4f4ee13c33167932a00126205c8aa08dc
Author: breadcat <breadcat@users.noreply.github.com>
Date: Wed, 2 Sep 2026 16:41:50 +0100
Make orphan links clickable and clean up page
Diffstat:
4 files changed, 49 insertions(+), 41 deletions(-)
diff --git a/internal/app/admin.go b/internal/app/admin.go
@@ -22,6 +22,11 @@ type AdminPageData struct {
RecentFiles []File
}
+type DBFile struct {
+ ID int
+ Filename string
+}
+
type SedRule struct {
Name string `json:"name"`
Description string `json:"description"`
@@ -280,20 +285,22 @@ func vacuumDatabase() error {
return nil
}
-func getFilesInDB() (map[string]bool, error) {
- rows, err := DB.Query("SELECT filename FROM files")
+func getFilesInDB() (map[string]DBFile, error) {
+ rows, err := DB.Query("SELECT id, filename FROM files")
if err != nil {
return nil, err
}
defer rows.Close()
- fileMap := make(map[string]bool)
+ fileMap := make(map[string]DBFile)
for rows.Next() {
- var name string
- if err := rows.Scan(&name); err != nil {
+ var file DBFile
+
+ if err := rows.Scan(&file.ID, &file.Filename); err != nil {
return nil, err
}
- fileMap[name] = true
+
+ fileMap[file.Filename] = file
}
if err := rows.Err(); err != nil {
return nil, err
diff --git a/internal/app/admin_orphans.go b/internal/app/admin_orphans.go
@@ -6,9 +6,14 @@ import (
"os"
)
+type OrphanFile struct {
+ ID int
+ Filename string
+}
+
type OrphanData struct {
- Orphans []string // on disk, not in DB
- ReverseOrphans []string // in DB, not on disk
+ Orphans []OrphanFile // on disk, not in DB
+ ReverseOrphans []OrphanFile // in DB, not on disk
}
func getOrphanedFiles(uploadDir string) (OrphanData, error) {
@@ -27,17 +32,22 @@ func getOrphanedFiles(uploadDir string) (OrphanData, error) {
diskFileSet[f] = true
}
- var orphans []string
+ var orphans []OrphanFile
for _, f := range diskFiles {
- if !dbFiles[f] {
- orphans = append(orphans, f)
+ if _, ok := dbFiles[f]; !ok {
+ orphans = append(orphans, OrphanFile{
+ Filename: f,
+ })
}
}
- var reverseOrphans []string
- for f := range dbFiles {
- if !diskFileSet[f] {
- reverseOrphans = append(reverseOrphans, f)
+ var reverseOrphans []OrphanFile
+ for filename, file := range dbFiles {
+ if !diskFileSet[filename] {
+ reverseOrphans = append(reverseOrphans, OrphanFile{
+ ID: file.ID,
+ Filename: file.Filename,
+ })
}
}
diff --git a/static/style.css b/static/style.css
@@ -218,7 +218,6 @@ div.config-split {flex: 1}
.admin-form-top {margin-top:20px}
.admin-hint {color:#666}
.admin-hint--inline {margin-left:10px}
-.admin-hint--spaced {margin-bottom:12px}
/* buttons */
.admin-btn {padding:10px 20px;border:none;border-radius:4px;font-size:16px;cursor:pointer;color:#fff}
.admin-btn--sm {padding:8px 16px;font-size:14px}
@@ -238,7 +237,6 @@ div.config-split {flex: 1}
.thumb-subtab-btn--active {border-bottom-color:#007bff;font-weight:bold}
/* orphans */
.admin-orphan-heading {margin-top:24px}
-.admin-orphan-heading--db {margin-top:32px}
.admin-orphan-list {list-style-type:disc;padding-left:20px}
.admin-orphan-item {margin-bottom:5px;font-family:monospace}
/* thumbnails */
diff --git a/templates/admin.html b/templates/admin.html
@@ -186,41 +186,34 @@
<!-- Orphans Tab -->
<div id="admin-content-orphans" class="admin-tab-content">
+
<h2>Orphaned Files</h2>
- <!-- Files on disk, not in DB -->
- <h3 class="admin-orphan-heading">Disk Orphans</h3>
- <p class="admin-hint admin-hint--spaced">
- These files exist in the upload directory but are not tracked in the database.
- </p>
+ <div class="config-container">
+ <div class="config-split">
+ <h3 class="admin-orphan-heading">Untracked Files</h3>
{{if .Data.OrphanData.Orphans}}
<ul class="admin-orphan-list">
- {{range .Data.OrphanData.Orphans}}
- <li class="admin-orphan-item">{{.}}</li>
- {{end}}
+ {{range .Data.OrphanData.Orphans}}<li class="admin-orphan-item">{{.Filename}}</li>
+ {{end}}
</ul>
- {{else}}
- <div class="admin-alert admin-alert--success">
- <strong>✓ No disk orphans found!</strong>
- </div>
+ {{else}}<strong>✓ No untracked files found!</strong>
{{end}}
- <!-- Files in DB, not on disk -->
- <h3 class="admin-orphan-heading admin-orphan-heading--db">Database Orphans</h3>
- <p class="admin-hint admin-hint--spaced">
- These files are tracked in the database but are missing from the upload directory.
- </p>
+ </div>
+ <div class="config-split">
+
+ <h3 class="admin-orphan-heading">Missing Files</h3>
{{if .Data.OrphanData.ReverseOrphans}}
<ul class="admin-orphan-list">
- {{range .Data.OrphanData.ReverseOrphans}}
- <li class="admin-orphan-item">{{.}}</li>
- {{end}}
+ {{range .Data.OrphanData.ReverseOrphans}}<li class="admin-orphan-item"><a href="/file/{{.ID}}" target="_blank">{{.Filename}}</a></li>
+ {{end}}
</ul>
- {{else}}
- <div class="admin-alert admin-alert--success">
- <strong>✓ No database orphans found!</strong>
- </div>
+ {{else}}<strong>✓ No missing files found!</strong>
{{end}}
+
+ </div>
+ </div>
</div>
<!-- Thumbnails Tab -->