mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-10-28 15:51:26 +00:00
Per-user notification_channels (ntfy + Gotify): every
insertUserNotification now fans out best-effort to enabled channels —
deployment/backup/security/agent alerts reach the user's phone via the
ntfy app with zero extra infrastructure.
- POST/GET/DELETE /notifications/channels + POST .../:id/test which
pushes a real probe so misconfiguration surfaces before alerts depend
on it (502 DELIVERY_FAILED on endpoint errors).
- ntfy: POST to endpoint (topic in path), Title/Tags headers, optional
Bearer token. Gotify: POST {endpoint}/message?token=...
- Delivery is best-effort by design — a dead relay never breaks the
producing flow; one shared 5s-timeout client.
- CLI `notifications channels list|add|test|remove`, MCP tools,
OpenAPI paths + NotificationChannel schema.
- Web settings "Push notifications" section and a Push channels card on
the mobile notifications tab (add/test/remove).
Verified live: channel CRUD, test-ping hit a recording endpoint with
correct headers/body, and a real deployment fanned out "Deployment
succeeded" through the channel end-to-end.
Generated with [Devin](https://devin.ai)
Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
40 lines
1.4 KiB
SQL
40 lines
1.4 KiB
SQL
-- name: CreateNotification :exec
|
|
INSERT INTO notifications (id, user_id, kind, title, body, resource_type, resource_id, created_at)
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8);
|
|
|
|
-- name: ListNotificationsByUser :many
|
|
SELECT id, user_id, kind, title, body, resource_type, resource_id, read_at, created_at
|
|
FROM notifications
|
|
WHERE user_id = $1
|
|
ORDER BY created_at DESC
|
|
LIMIT $2;
|
|
|
|
-- name: CountUnreadNotificationsByUser :one
|
|
SELECT COUNT(*) FROM notifications WHERE user_id = $1 AND read_at IS NULL;
|
|
|
|
-- name: MarkNotificationReadByIDAndUser :exec
|
|
UPDATE notifications SET read_at = $3 WHERE id = $1 AND user_id = $2 AND read_at IS NULL;
|
|
|
|
-- name: MarkAllNotificationsReadByUser :exec
|
|
UPDATE notifications SET read_at = $2 WHERE user_id = $1 AND read_at IS NULL;
|
|
|
|
-- name: ListNotificationChannelsByUser :many
|
|
SELECT id, user_id, kind, endpoint, token, enabled, created_at, updated_at
|
|
FROM notification_channels
|
|
WHERE user_id = $1 AND enabled
|
|
ORDER BY created_at;
|
|
|
|
-- name: ListAllNotificationChannelsByUser :many
|
|
SELECT id, user_id, kind, endpoint, token, enabled, created_at, updated_at
|
|
FROM notification_channels
|
|
WHERE user_id = $1
|
|
ORDER BY created_at;
|
|
|
|
-- name: InsertNotificationChannel :one
|
|
INSERT INTO notification_channels (user_id, kind, endpoint, token)
|
|
VALUES ($1, $2, $3, $4)
|
|
RETURNING id, user_id, kind, endpoint, token, enabled, created_at, updated_at;
|
|
|
|
-- name: DeleteNotificationChannel :execrows
|
|
DELETE FROM notification_channels WHERE id = $1 AND user_id = $2;
|