Notify question authors via Resend when an admin posts the first answer.

Require email at registration (editable on profile), add a Resend mailer with idempotent first-answer sends, and keep answer saves independent of delivery.
This commit is contained in:
2026-08-22 12:39:43 -07:00
parent 35c8c9f391
commit f61b4fc7ab
23 changed files with 589 additions and 71 deletions
+13 -12
View File
@@ -1,24 +1,25 @@
-- name: CreateUser :exec
INSERT INTO users (id, username, name, password_hash, role, avatar_url, state, created_at)
VALUES ($1, $2, $3, $4, $5, '', '', $6);
INSERT INTO users (id, username, name, password_hash, role, email, avatar_url, state, created_at)
VALUES ($1, $2, $3, $4, $5, $6, '', '', $7);
-- name: GetUserByID :one
SELECT id, username, name, role, avatar_url, state, created_at
SELECT id, username, name, role, email, avatar_url, state, created_at
FROM users
WHERE id = $1;
-- name: GetUserByUsername :one
SELECT id, username, name, role, avatar_url, state, created_at, password_hash
SELECT id, username, name, role, email, avatar_url, state, created_at, password_hash
FROM users
WHERE username = $1;
-- name: ListUsers :many
SELECT id, username, name, role, avatar_url, state, created_at
SELECT id, username, name, role, email, avatar_url, state, created_at
FROM users
WHERE (
sqlc.arg(search) = ''
OR username ILIKE '%' || sqlc.arg(search) || '%'
OR name ILIKE '%' || sqlc.arg(search) || '%'
OR email ILIKE '%' || sqlc.arg(search) || '%'
)
AND (
sqlc.arg(cursor_created) = ''
@@ -43,12 +44,12 @@ UPDATE users
SET role = $1
WHERE id = $2;
-- name: UpdateUserState :exec
-- name: UpdateUserProfile :exec
UPDATE users
SET state = $1
WHERE id = $2;
-- name: UpdateUserStateAndAvatar :exec
UPDATE users
SET state = $1, avatar_url = $2
SET state = $1, email = $2
WHERE id = $3;
-- name: UpdateUserProfileAndAvatar :exec
UPDATE users
SET state = $1, email = $2, avatar_url = $3
WHERE id = $4;