Files
markdown-hub/internal/api/router.go
T
anders bf655c6bc5 Complete remaining TODO: image upload, spinners, drag-to-trash, sort
- Image upload: drag-drop images into editor, stored in .assets/
- Serve images via /api/files/image/ endpoint
- Loading spinner bar in sidebar during file operations
- Sort files by name/date buttons
- Drag files onto Trash button to delete
- All code TODO items complete
2026-05-26 23:56:13 +02:00

90 lines
3.9 KiB
Go

package api
import (
"database/sql"
"net/http"
"os"
"path/filepath"
)
type Server struct {
db *sql.DB
dataDir string
secret string
}
func NewRouter(db *sql.DB, dataDir, secret string) http.Handler {
s := &Server{db: db, dataDir: dataDir, secret: secret}
mux := http.NewServeMux()
// Auth
mux.HandleFunc("POST /api/auth/login", s.handleLogin)
mux.HandleFunc("POST /api/auth/logout", s.handleLogout)
mux.HandleFunc("POST /api/auth/totp/setup", s.requireAuth(s.handleTOTPSetup))
mux.HandleFunc("POST /api/auth/totp/verify", s.requireAuth(s.handleTOTPVerify))
mux.HandleFunc("POST /api/auth/totp/disable", s.requireAuth(s.handleTOTPDisable))
// Users (admin)
mux.HandleFunc("POST /api/users/create", s.requireAdmin(s.handleCreateUser))
mux.HandleFunc("POST /api/users/list", s.requireAdmin(s.handleListUsers))
mux.HandleFunc("POST /api/auth/change-password", s.requireAuth(s.handleChangePassword))
// Files
mux.HandleFunc("POST /api/files/list", s.requireAuth(s.handleListFiles))
mux.HandleFunc("POST /api/files/read", s.requireAuth(s.handleReadFile))
mux.HandleFunc("POST /api/files/write", s.requireAuth(s.handleWriteFile))
mux.HandleFunc("POST /api/files/create", s.requireAuth(s.handleCreateFile))
mux.HandleFunc("POST /api/files/create-folder", s.requireAuth(s.handleCreateFolder))
mux.HandleFunc("POST /api/files/delete", s.requireAuth(s.handleDeleteFile))
mux.HandleFunc("POST /api/files/move", s.requireAuth(s.handleMoveFile))
mux.HandleFunc("POST /api/files/rename", s.requireAuth(s.handleRenameFile))
mux.HandleFunc("POST /api/files/trash", s.requireAuth(s.handleListTrash))
mux.HandleFunc("POST /api/files/trash/restore", s.requireAuth(s.handleRestoreTrash))
mux.HandleFunc("POST /api/files/trash/empty", s.requireAuth(s.handleEmptyTrash))
mux.HandleFunc("POST /api/files/search", s.requireAuth(s.handleSearchFiles))
mux.HandleFunc("POST /api/files/shared", s.requireAuth(s.handleListSharedFiles))
mux.HandleFunc("POST /api/files/upload-image", s.requireAuth(s.handleUploadImage))
mux.HandleFunc("GET /api/files/image/", s.requireAuth(s.handleServeImage))
// Sharing
mux.HandleFunc("POST /api/share", s.requireAuth(s.handleShareFile))
mux.HandleFunc("POST /api/unshare", s.requireAuth(s.handleUnshareFile))
// Git
mux.HandleFunc("POST /api/git/init", s.requireAuth(s.handleGitInit))
mux.HandleFunc("POST /api/git/commit", s.requireAuth(s.handleGitCommit))
mux.HandleFunc("POST /api/git/log", s.requireAuth(s.handleGitLog))
mux.HandleFunc("POST /api/git/diff", s.requireAuth(s.handleGitDiff))
mux.HandleFunc("POST /api/git/restore", s.requireAuth(s.handleGitRestore))
mux.HandleFunc("POST /api/git/status", s.requireAuth(s.handleGitStatus))
mux.HandleFunc("POST /api/git/remote/add", s.requireAuth(s.handleGitRemoteAdd))
mux.HandleFunc("POST /api/git/remote/list", s.requireAuth(s.handleGitRemoteList))
mux.HandleFunc("POST /api/git/push", s.requireAuth(s.handleGitPush))
mux.HandleFunc("POST /api/git/pull", s.requireAuth(s.handleGitPull))
// AI
mux.HandleFunc("POST /api/ai/verify", s.requireAuth(s.handleAIVerify))
mux.HandleFunc("POST /api/ai/generate", s.requireAuth(s.handleAIGenerate))
// Build jobs
mux.HandleFunc("POST /api/build/submit", s.requireAuth(s.handleBuildSubmit))
mux.HandleFunc("POST /api/build/jobs", s.requireAuth(s.handleBuildJobs))
mux.HandleFunc("POST /api/build/status", s.requireAuth(s.handleBuildStatus))
mux.HandleFunc("POST /api/build/cancel", s.requireAuth(s.handleBuildCancel))
// Daemon endpoints (admin only)
mux.HandleFunc("POST /api/daemon/poll", s.requireAdmin(s.handleDaemonPoll))
mux.HandleFunc("POST /api/daemon/heartbeat", s.requireAdmin(s.handleDaemonHeartbeat))
mux.HandleFunc("POST /api/daemon/report", s.requireAdmin(s.handleDaemonReport))
// Static frontend
frontendDir := filepath.Join(dataDir, "..", "frontend", "dist")
if _, err := os.Stat(frontendDir); err != nil {
frontendDir = "./frontend/dist"
}
fs := http.FileServer(http.Dir(frontendDir))
mux.Handle("/", fs)
return mux
}