Files
owenandClaude Sonnet 5 ba1f7c4c03 Initial vibeproxy implementation
Self-contained HTTP/HTTPS/TCP/UDP reverse proxy manager written in Go,
with SQLite storage, a Bootstrap 5 admin UI (Go templates, no JS
framework), and a REST API under /api/v1.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QTXFrNP1imCW7jtfL5SZrw
2026-08-17 10:28:59 -05:00

71 lines
2.8 KiB
Go

package api
import (
"database/sql"
"log/slog"
"net/http"
"github.com/owen/vibeproxy/internal/auth"
"github.com/owen/vibeproxy/internal/certificates"
"github.com/owen/vibeproxy/internal/runtime"
"github.com/owen/vibeproxy/internal/streams"
)
type API struct {
db *sql.DB
store *runtime.Store
certs *certificates.Manager
streams *streams.Manager
log *slog.Logger
}
// NewRouter builds the full /api/v1 handler tree, protected by API token
// bearer auth.
func NewRouter(db *sql.DB, store *runtime.Store, certs *certificates.Manager, streamMgr *streams.Manager, log *slog.Logger) http.Handler {
a := &API{db: db, store: store, certs: certs, streams: streamMgr, log: log}
mux := http.NewServeMux()
mux.HandleFunc("GET /api/v1/proxy-hosts", a.listProxyHosts)
mux.HandleFunc("POST /api/v1/proxy-hosts", a.createProxyHost)
mux.HandleFunc("GET /api/v1/proxy-hosts/{id}", a.getProxyHost)
mux.HandleFunc("PUT /api/v1/proxy-hosts/{id}", a.updateProxyHost)
mux.HandleFunc("DELETE /api/v1/proxy-hosts/{id}", a.deleteProxyHost)
mux.HandleFunc("POST /api/v1/proxy-hosts/{id}/enable", a.enableProxyHost)
mux.HandleFunc("POST /api/v1/proxy-hosts/{id}/disable", a.disableProxyHost)
mux.HandleFunc("GET /api/v1/streams", a.listStreams)
mux.HandleFunc("POST /api/v1/streams", a.createStream)
mux.HandleFunc("GET /api/v1/streams/{id}", a.getStream)
mux.HandleFunc("PUT /api/v1/streams/{id}", a.updateStream)
mux.HandleFunc("DELETE /api/v1/streams/{id}", a.deleteStream)
mux.HandleFunc("POST /api/v1/streams/{id}/enable", a.enableStream)
mux.HandleFunc("POST /api/v1/streams/{id}/disable", a.disableStream)
mux.HandleFunc("GET /api/v1/certificates", a.listCertificates)
mux.HandleFunc("POST /api/v1/certificates/letsencrypt", a.issueCertificate)
mux.HandleFunc("POST /api/v1/certificates/custom", a.uploadCertificate)
mux.HandleFunc("GET /api/v1/certificates/{id}", a.getCertificate)
mux.HandleFunc("DELETE /api/v1/certificates/{id}", a.deleteCertificate)
mux.HandleFunc("POST /api/v1/certificates/{id}/renew", a.renewCertificate)
mux.HandleFunc("GET /api/v1/access-lists", a.listAccessLists)
mux.HandleFunc("POST /api/v1/access-lists", a.createAccessList)
mux.HandleFunc("GET /api/v1/access-lists/{id}", a.getAccessList)
mux.HandleFunc("PUT /api/v1/access-lists/{id}", a.updateAccessList)
mux.HandleFunc("DELETE /api/v1/access-lists/{id}", a.deleteAccessList)
mux.HandleFunc("GET /api/v1/settings", a.getSettings)
mux.HandleFunc("PUT /api/v1/settings", a.updateSettings)
mux.HandleFunc("GET /api/v1/tokens", a.listTokens)
mux.HandleFunc("POST /api/v1/tokens", a.createToken)
mux.HandleFunc("DELETE /api/v1/tokens/{id}", a.revokeToken)
mux.HandleFunc("GET /api/v1/logs/requests", a.listRequestLogs)
mux.HandleFunc("GET /api/v1/logs/audit", a.listAuditLogs)
mux.HandleFunc("GET /api/v1/stats", a.getStats)
return auth.APIToken(db)(mux)
}