summaryrefslogtreecommitdiff
path: root/instructions.md
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-01-20 15:24:47 -1000
committerPeter Stone <thepeterstone@gmail.com>2026-01-20 15:24:47 -1000
commit6202b6e03eddfe9a8e2974c88bb6fcab9f2dd8de (patch)
treed823bce4d31052a2be7c0160175820fb8825dcb4 /instructions.md
parent6bc4bed8665ae4aa2c5090e49a7373ed0d2fd2c1 (diff)
Add workflow documentation for auth implementation
Include surgical instructions and code review feedback from authentication feature development. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'instructions.md')
-rw-r--r--instructions.md77
1 files changed, 77 insertions, 0 deletions
diff --git a/instructions.md b/instructions.md
new file mode 100644
index 0000000..b01168b
--- /dev/null
+++ b/instructions.md
@@ -0,0 +1,77 @@
+# Surgical Instructions: Wire Up Authentication
+
+## Context
+The `internal/auth` package is fully implemented, and the database migrations are ready. We need to wire everything up in `cmd/dashboard/main.go` and ensure the application is protected.
+
+## Plan
+1. **Update `cmd/dashboard/main.go`** to initialize sessions, auth service, and protect routes.
+2. **Verify** the login flow.
+
+## Step 1: Update `cmd/dashboard/main.go`
+
+**Action:** Edit `cmd/dashboard/main.go`.
+
+**Imports to Add:**
+```go
+"github.com/alexedwards/scs/v2"
+"github.com/alexedwards/scs/sqlite3store"
+"task-dashboard/internal/auth"
+```
+
+**Changes in `main()` function:**
+
+1. **Initialize Session Manager** (After `store` init, before `router` init):
+ ```go
+ // Initialize Session Manager
+ sessionManager := scs.New()
+ sessionManager.Store = sqlite3store.New(store.DB())
+ sessionManager.Lifetime = 24 * time.Hour
+ sessionManager.Cookie.Persist = true
+ sessionManager.Cookie.SameSite = http.SameSiteLaxMode
+ sessionManager.Cookie.Secure = !cfg.Debug
+ ```
+
+2. **Initialize Auth Service & Handlers** (After `templates` init):
+ ```go
+ // Initialize Auth
+ authService := auth.NewService(store.DB())
+ // Ensure default admin user exists (for development/first run)
+ if err := authService.EnsureDefaultUser("admin", "admin"); err != nil {
+ log.Printf("WARNING: Failed to ensure default user: %v", err)
+ }
+
+ authHandlers := auth.NewHandlers(authService, sessionManager, tmpl)
+ ```
+
+3. **Configure Router Middleware & Routes**:
+ * Add `r.Use(sessionManager.LoadAndSave)` to the global middleware stack.
+ * **Refactor Routes**:
+ * Keep `/static/*` public.
+ * Add Public Auth Routes:
+ ```go
+ r.Get("/login", authHandlers.HandleLoginPage)
+ r.Post("/login", authHandlers.HandleLogin)
+ r.Post("/logout", authHandlers.HandleLogout)
+ ```
+ * **Protect Application Routes**: Wrap the main application routes in a group using `RequireAuth`.
+ ```go
+ r.Group(func(r chi.Router) {
+ r.Use(authHandlers.Middleware().RequireAuth)
+
+ // Move existing application routes here:
+ r.Get("/", handlers.HandleHome)
+ r.Get("/tabs/{type}", handlers.HandleTab)
+ // ... and any other app routes
+ })
+ ```
+
+## Step 2: Verification
+
+**Action:**
+1. **Update Dependencies:** Run `go mod tidy` to ensure new imports are tracked correctly.
+2. **Ensure CSS is built:** Run `npm run build` to generate `web/static/css/output.css`.
+3. **Run the application:** `go run cmd/dashboard/main.go`.
+4. **Verify Flow:**
+ * Accessing `/` should redirect to `/login`.
+ * Login with `admin` / `admin` should work and redirect to `/`.
+ * Logout should work and redirect to `/login`.