summaryrefslogtreecommitdiffstats
path: root/internal
Commit message (Collapse)AuthorAgeFilesLines
* Fix: set HTML template on Gin engine for template renderingivar12 days1-0/+1
| | | | | | | | | | | | | The embedded templates were being parsed but not registered with the Gin engine's HTMLRender, causing 500 errors on admin UI requests. Now SetHTMLTemplate is called to register the parsed template set so Gin can render them properly. Verified: - Build succeeds with no errors - Binary contains embedded template strings - Admin UI pages load and render correctly - All template files (base, list, form, error) work as expected
* feat: embed admin templates into binary with //go:embedivar12 days5-3/+150
| | | | | | | | | | | | | Move admin templates from templates/admin/*.html to internal/admin/templates/*.html and embed them using //go:embed directive. This removes the runtime dependency on having template files on disk, allowing the templates to be compiled into the binary. Changes: - Add embed import and //go:embed directive for templates - Change ParseGlob() to ParseFS() to load from embedded filesystem - Copy templates to internal/admin/templates/ for embedding Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
* refactor: convert admin handlers to Gin context-based signaturesivar12 days4-66/+75
| | | | | | | | | | | | | | | | | - Remove old ServeHTTP method (no longer needed with Gin routing) - Update all 6 handler methods to use *gin.Context instead of http.ResponseWriter, *http.Request - Convert handler signatures: handleList, handleNew, handleNewPost, handleEdit, handleDelete - Remove render() helper (use c.HTML() directly) - Update renderError() to accept gin.Context instead of http.ResponseWriter - Update postFromForm() to extract form data from gin.Context using c.PostForm() - Update main.go to use adminSrv.NewServer() and adminSrv.Engine() - All handlers now use Gin methods: c.HTML(), c.PostForm(), c.Param(), c.Redirect() - Path parameters now extracted via c.Param("slug") instead of function arguments - HTTP status codes and error handling fully migrated to Gin patterns Build verified: go build ./cmd/nebbet succeeds Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
* refactor: implement auth middleware for Ginivar12 days1-41/+30
| | | | | | | | | | | | | | | | Replace the old checkAuth() method with a Gin middleware function that validates Basic Auth credentials. The authMiddleware() now handles authentication at the middleware level rather than per-handler, supporting graceful degradation when no auth file is configured. The middleware: - Skips auth if AuthFile is empty or doesn't exist - Extracts Basic Auth credentials from the request - Verifies credentials using the auth package - Returns 401 with WWW-Authenticate header on failure - Calls c.Next() to pass control to handlers on success Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
* refactor: add Gin routing infrastructure with NewServer constructorivar12 days1-183/+85
|
* Use sqlite packageivar2026-03-311-263/+0
|
* Fault if not able to authenticate userivar2026-03-311-6/+6
|
* Add post management admin UI and switch to modernc.org/sqliteClaude2026-03-314-4/+485
| | | | | | | | | | | | | | | | | | | | | | | | | | | | - Replace custom CGO sqlite driver with modernc.org/sqlite (registered as "sqlite3"); a local compat shim under compat/sqlite/ provides the same import path and WAL-mode behaviour using system libsqlite3 while network access is unavailable — swapping to the real pure-Go package later only requires removing the replace directive and running go get. - Add internal/admin/server.go: HTTP handler for /admin/ that serves a server-side-rendered post management UI (list, new, edit, delete). Posts are stored as Markdown files under content/posts/ and rebuilt via the existing Builder after every write. Basic auth is checked against the .passwords file when it exists. - Add cmd/nebbet/main.go: unified CLI with build, watch, serve (HTTP server with admin + file server + watch), and user subcommands. - Update builder.BuildAll to skip content/admin/ — admin pages are served dynamically and must never appear in the static output directory. - Mark content/admin/index.md as draft so the old static placeholder is not built even if the admin skip logic is bypassed. - Fix .gitignore: use /nebbet (root-only) so the pattern no longer accidentally ignores the cmd/nebbet/ source directory. https://claude.ai/code/session_01WLuSGxJhNs2cFM2zJzSsTx
* Add static site builder: SQLite-backed MD→HTML pipelineClaude2026-03-319-0/+1203
- cmd/nebbet: CLI with build [--watch] and user add/passwd/delete/list - internal/builder: markdown→HTML, component injection via HTML comments, auto importmap from lib/, fsnotify watch with 150ms debounce - internal/db: meta.db (page index, tag queries) + search.db (FTS5) - internal/sqlitedrv: minimal CGO database/sql driver for system libsqlite3 - internal/auth: htpasswd-compatible bcrypt password file management - templates/base.html + admin.html, styles/main.css + admin.css - nginx.conf with auth_basic for /admin, clean URLs, gzip - nebbet.service systemd unit for watch daemon - Example content/index.md and components/site-greeting.js https://claude.ai/code/session_01HTc1BCBCiMTEB54XQP1Wz9