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