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/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)) // 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 }