docs(36-01): create SUMMARY.md for plan 36-01 completion
This commit is contained in:
@@ -0,0 +1,47 @@
|
|||||||
|
---
|
||||||
|
plan: 36-01
|
||||||
|
phase: 36
|
||||||
|
title: "isAdmin schema, requireAdmin middleware, /api/auth/me surface, grant script"
|
||||||
|
status: complete
|
||||||
|
completed: 2026-04-19
|
||||||
|
---
|
||||||
|
|
||||||
|
## What Was Built
|
||||||
|
|
||||||
|
Server-side admin foundation for Phase 36:
|
||||||
|
|
||||||
|
1. **isAdmin column** added to the `users` pgTable in `src/db/schema.ts` — `boolean("is_admin").notNull().default(false)`.
|
||||||
|
2. **Drizzle migration** generated (`drizzle-pg/0009_spotty_lord_tyger.sql`) with `ALTER TABLE "users" ADD COLUMN "is_admin" boolean DEFAULT false NOT NULL`. DB push could not be applied (DB not reachable with default credentials — requires `DATABASE_URL` env var pointing to the running Postgres instance).
|
||||||
|
3. **requireAdmin middleware** added to `src/server/middleware/auth.ts` — reads `userId` from context (set by `requireAuth`), queries `users.isAdmin`, returns 401 if userId missing, 403 if `!user.isAdmin`, calls `next()` for admins.
|
||||||
|
4. **isAdmin in /api/auth/me** — `src/server/routes/auth.ts` now includes `isAdmin: fullUser?.isAdmin ?? false` in the returned user object.
|
||||||
|
5. **`/api/admin/` placeholder route** — `src/server/routes/admin.ts` applies `requireAuth` + `requireAdmin` middleware on `/*` and returns `{ ok: true }` on `GET /`.
|
||||||
|
6. **Route registration** — `src/server/index.ts` imports and registers `app.route("/api/admin", adminRoutes)`.
|
||||||
|
7. **grant-admin script** — `scripts/grant-admin.ts` grants or revokes `isAdmin` by `logto_sub`. Accepts `--revoke` flag. Exits 1 on missing sub or user not found.
|
||||||
|
|
||||||
|
## Key Files
|
||||||
|
|
||||||
|
- `src/db/schema.ts` — isAdmin column added to users table
|
||||||
|
- `drizzle-pg/0009_spotty_lord_tyger.sql` — migration file
|
||||||
|
- `src/server/middleware/auth.ts` — requireAdmin exported
|
||||||
|
- `src/server/routes/auth.ts` — isAdmin in /me response
|
||||||
|
- `src/server/routes/admin.ts` — new placeholder admin route
|
||||||
|
- `src/server/index.ts` — adminRoutes registered
|
||||||
|
- `scripts/grant-admin.ts` — admin grant/revoke script
|
||||||
|
|
||||||
|
## Deviations
|
||||||
|
|
||||||
|
- **DB push could not be applied** — the default PostgreSQL credentials (`gearbox:gearbox@localhost:5432/gearbox`) don't match the running instance. The migration file is generated and correct. Apply manually with the correct `DATABASE_URL`:
|
||||||
|
```
|
||||||
|
DATABASE_URL=<connection-string> bun run db:push
|
||||||
|
```
|
||||||
|
This is a deployment/environment concern, not a code defect.
|
||||||
|
|
||||||
|
## Self-Check: PASSED
|
||||||
|
|
||||||
|
- [x] isAdmin column in schema.ts
|
||||||
|
- [x] Migration file generated with correct SQL
|
||||||
|
- [x] requireAdmin middleware exported from auth.ts
|
||||||
|
- [x] isAdmin in /api/auth/me response
|
||||||
|
- [x] /api/admin route protected by requireAuth + requireAdmin
|
||||||
|
- [x] grant-admin.ts script created
|
||||||
|
- [x] bun run build exits 0
|
||||||
Reference in New Issue
Block a user