4df87cbf9a
- Git: init, commit, log, diff, restore, remotes, push/pull - Auto-commit on every file save - Sharing: share/unshare files with other users (ro/rw) - Shared documents view in sidebar - 2FA: TOTP setup/verify/disable, enforced at login - AI: verify spec endpoint (LiteLLM), generate (summarize/prompt/expand) - Light/dark theme with CSS variables - File delete (recursive for folders) - Admin panel + preferences panel - File creation timestamp display
82 lines
3.3 KiB
Go
82 lines
3.3 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))
|
|
|
|
// 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/search", s.requireAuth(s.handleSearchFiles))
|
|
mux.HandleFunc("POST /api/files/shared", s.requireAuth(s.handleListSharedFiles))
|
|
|
|
// 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
|
|
mux.HandleFunc("POST /api/daemon/poll", s.requireAuth(s.handleDaemonPoll))
|
|
mux.HandleFunc("POST /api/daemon/heartbeat", s.requireAuth(s.handleDaemonHeartbeat))
|
|
mux.HandleFunc("POST /api/daemon/report", s.requireAuth(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
|
|
}
|