feat(reminders): получатели в отложенных/входящих, приватные сообщения чата, календарь, бейдж уведомлений

This commit is contained in:
2026-09-21 10:26:53 +03:00
parent 17e6ebf412
commit aa316141be
20 changed files with 312 additions and 36 deletions

View File

@@ -170,7 +170,20 @@ homeRouter.get('/api/home/inbox',
AND NOT EXISTS (
SELECT 1 FROM task_reminders tr_snooze
WHERE tr_snooze.task_id = t.id
AND tr_snooze.created_by_user_id = $2
AND (
tr_snooze.created_by_user_id = $2
OR tr_snooze.recipients @> jsonb_build_array(jsonb_build_object('type', 'user', 'userId', $2))
OR EXISTS (
SELECT 1 FROM jsonb_array_elements(tr_snooze.recipients) r_el
WHERE r_el ->> 'type' = 'role'
AND r_el ->> 'role' = (SELECT app_role FROM users WHERE id = $2)
)
OR EXISTS (
SELECT 1 FROM jsonb_array_elements(tr_snooze.recipients) r_el
WHERE r_el ->> 'type' = 'orgRole'
AND EXISTS (SELECT 1 FROM role_members rm WHERE rm.role_id = (r_el ->> 'roleId')::int AND rm.user_id = $2)
)
)
AND tr_snooze.remind_at > NOW()
AND tr_snooze.is_sent = false
)
@@ -217,7 +230,20 @@ homeRouter.get('/api/home/inbox',
AND NOT EXISTS (
SELECT 1 FROM task_reminders tr_snooze
WHERE tr_snooze.task_id = t.id
AND tr_snooze.created_by_user_id = $2
AND (
tr_snooze.created_by_user_id = $2
OR tr_snooze.recipients @> jsonb_build_array(jsonb_build_object('type', 'user', 'userId', $2))
OR EXISTS (
SELECT 1 FROM jsonb_array_elements(tr_snooze.recipients) r_el
WHERE r_el ->> 'type' = 'role'
AND r_el ->> 'role' = (SELECT app_role FROM users WHERE id = $2)
)
OR EXISTS (
SELECT 1 FROM jsonb_array_elements(tr_snooze.recipients) r_el
WHERE r_el ->> 'type' = 'orgRole'
AND EXISTS (SELECT 1 FROM role_members rm WHERE rm.role_id = (r_el ->> 'roleId')::int AND rm.user_id = $2)
)
)
AND tr_snooze.remind_at > NOW()
AND tr_snooze.is_sent = false
)
@@ -400,7 +426,20 @@ homeRouter.get('/api/home/inbox/count',
WHERE NOT EXISTS (
SELECT 1 FROM task_reminders tr_snooze
WHERE tr_snooze.task_id = s.task_id
AND tr_snooze.created_by_user_id = $2
AND (
tr_snooze.created_by_user_id = $2
OR tr_snooze.recipients @> jsonb_build_array(jsonb_build_object('type', 'user', 'userId', $2))
OR EXISTS (
SELECT 1 FROM jsonb_array_elements(tr_snooze.recipients) r_el
WHERE r_el ->> 'type' = 'role'
AND r_el ->> 'role' = (SELECT app_role FROM users WHERE id = $2)
)
OR EXISTS (
SELECT 1 FROM jsonb_array_elements(tr_snooze.recipients) r_el
WHERE r_el ->> 'type' = 'orgRole'
AND EXISTS (SELECT 1 FROM role_members rm WHERE rm.role_id = (r_el ->> 'roleId')::int AND rm.user_id = $2)
)
)
AND tr_snooze.remind_at > NOW()
AND tr_snooze.is_sent = false
)
@@ -448,14 +487,29 @@ homeRouter.get('/api/home/snoozed',
t.updated_at AS "updatedAt",
t.due_date AS "dueDate",
t.is_completed AS "isCompleted",
MIN(tr.remind_at) OVER (PARTITION BY t.id) AS "remindAt"
MIN(tr.remind_at) OVER (PARTITION BY t.id) AS "remindAt",
CONCAT(cu.first_name, ' ', cu.last_name) AS "createdByName"
FROM task_reminders tr
JOIN tasks t ON t.id = tr.task_id AND t.organization_id = $1
JOIN forms f ON f.id = t.form_id
JOIN form_statuses fs ON fs.id = t.current_status_id
LEFT JOIN users u ON u.id = t.assigned_to
LEFT JOIN users cu ON cu.id = tr.created_by_user_id
WHERE tr.organization_id = $1
AND tr.created_by_user_id = $2
AND (
tr.created_by_user_id = $2
OR tr.recipients @> jsonb_build_array(jsonb_build_object('type', 'user', 'userId', $2))
OR EXISTS (
SELECT 1 FROM jsonb_array_elements(tr.recipients) r_el
WHERE r_el ->> 'type' = 'role'
AND r_el ->> 'role' = (SELECT app_role FROM users WHERE id = $2)
)
OR EXISTS (
SELECT 1 FROM jsonb_array_elements(tr.recipients) r_el
WHERE r_el ->> 'type' = 'orgRole'
AND EXISTS (SELECT 1 FROM role_members rm WHERE rm.role_id = (r_el ->> 'roleId')::int AND rm.user_id = $2)
)
)
AND tr.remind_at > NOW()
AND tr.is_sent = false
AND ($3 = '' OR t.title ILIKE '%' || $3 || '%')
@@ -468,7 +522,20 @@ homeRouter.get('/api/home/snoozed',
FROM task_reminders tr
JOIN tasks t ON t.id = tr.task_id AND t.organization_id = $1
WHERE tr.organization_id = $1
AND tr.created_by_user_id = $2
AND (
tr.created_by_user_id = $2
OR tr.recipients @> jsonb_build_array(jsonb_build_object('type', 'user', 'userId', $2))
OR EXISTS (
SELECT 1 FROM jsonb_array_elements(tr.recipients) r_el
WHERE r_el ->> 'type' = 'role'
AND r_el ->> 'role' = (SELECT app_role FROM users WHERE id = $2)
)
OR EXISTS (
SELECT 1 FROM jsonb_array_elements(tr.recipients) r_el
WHERE r_el ->> 'type' = 'orgRole'
AND EXISTS (SELECT 1 FROM role_members rm WHERE rm.role_id = (r_el ->> 'roleId')::int AND rm.user_id = $2)
)
)
AND tr.remind_at > NOW()
AND tr.is_sent = false
AND ($3 = '' OR t.title ILIKE '%' || $3 || '%')