Add user theme support and migrate frontend to HTMX templates

- Add theme column to users table with default 'tokyo-night'
- Update all user queries to include theme field
- Add ListUsers and UpdateUserTheme database queries
- Update auth handlers to support HTMX form submissions and JSON API
- Add ListUsers API endpoint
- Replace embedded static files with Go templates
- Update Dockerfile to copy templates directory
- Redesign index.html with inline styles and HTMX forms
- Update Bruno API testing requests for auth endpoints
This commit is contained in:
2026-01-22 18:38:06 -05:00
parent 2399e892a6
commit e32fda6b65
12 changed files with 644 additions and 222 deletions
+40
View File
@@ -0,0 +1,40 @@
meta {
name: List Users
type: http
seq: 5
}
get {
url: {{base_url}}/api/users
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}
docs {
## List Users
Retrieves a list of all users.
**Method:** GET
**Endpoint:** /api/users
**Authentication:** Required
**Response:** Array of user objects
- `id` (string): User ID
- `email` (string): Email
- `username` (string): Username
- `theme` (string): User theme preference
- `created_at` (string): Creation timestamp
- `updated_at` (string): Last update timestamp
**Status Codes:**
- 200: Success
- 401: Unauthorized
}
+1 -1
View File
@@ -20,7 +20,7 @@ body:json {
script:post-response {
function onResponse(res) {
let data = res.getBody();
let token = bru.setEnvVar("token", data.token, { persist: true });
return bru.setEnvVar("token", data.token, { persist: true });
}
onResponse(res);
}
+14 -13
View File
@@ -18,32 +18,33 @@ body:json {
}
}
script:post-response {
function onResponse(res) {
let data = res.getBody();
return bru.setEnvVar("token", data.token, { persist: true });
}
onResponse(res);
}
settings {
encodeUrl: true
timeout: 0
}
script:post-response {
const data = res.getBody();
if (res.getStatusCode() === 201) {
bru.setEnvVar("token", data.token);
}
}
docs {
## Register User
Creates a new user account.
**Method:** POST
**Endpoint:** /api/auth/register
**Request Body:**
- `email` (string): Email address
- `username` (string): Username
- `password` (string): Password
**Response:**
- `token` (string): JWT token
- `user` (object): User details
@@ -51,7 +52,7 @@ docs {
- `email` (string): Email
- `username` (string): Username
- `theme` (string): User theme preference
**Status Codes:**
- 201: Created
- 409: User exists