mirror of
https://github.com/coder/coder.git
synced 2026-09-22 05:05:20 +08:00
feat(coderd): add inbox notifications endpoints (#16889)
This PR is part of the inbox notifications topic, and rely on previous PRs merged - it adds : - Endpoints to : - WS : watch new inbox notifications - REST : list inbox notifications - REST : update the read status of a notification Also, this PR acts as a follow-up PR from previous work and : - fix DB query issues - fix DBMem logic to match DB
This commit is contained in:
@@ -3296,34 +3296,52 @@ func (q *FakeQuerier) GetFilteredInboxNotificationsByUserID(_ context.Context, a
|
||||
defer q.mutex.RUnlock()
|
||||
|
||||
notifications := make([]database.InboxNotification, 0)
|
||||
for _, notification := range q.inboxNotifications {
|
||||
// TODO : after using go version >= 1.23 , we can change this one to https://pkg.go.dev/slices#Backward
|
||||
for idx := len(q.inboxNotifications) - 1; idx >= 0; idx-- {
|
||||
notification := q.inboxNotifications[idx]
|
||||
|
||||
if notification.UserID == arg.UserID {
|
||||
if !arg.CreatedAtOpt.IsZero() && !notification.CreatedAt.Before(arg.CreatedAtOpt) {
|
||||
continue
|
||||
}
|
||||
|
||||
templateFound := false
|
||||
for _, template := range arg.Templates {
|
||||
templateFound := false
|
||||
if notification.TemplateID == template {
|
||||
templateFound = true
|
||||
}
|
||||
|
||||
if !templateFound {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
if len(arg.Templates) > 0 && !templateFound {
|
||||
continue
|
||||
}
|
||||
|
||||
targetsFound := true
|
||||
for _, target := range arg.Targets {
|
||||
isFound := false
|
||||
targetFound := false
|
||||
for _, insertedTarget := range notification.Targets {
|
||||
if insertedTarget == target {
|
||||
isFound = true
|
||||
targetFound = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !isFound {
|
||||
continue
|
||||
if !targetFound {
|
||||
targetsFound = false
|
||||
break
|
||||
}
|
||||
|
||||
notifications = append(notifications, notification)
|
||||
}
|
||||
|
||||
if !targetsFound {
|
||||
continue
|
||||
}
|
||||
|
||||
if (arg.LimitOpt == 0 && len(notifications) == 25) ||
|
||||
(arg.LimitOpt != 0 && len(notifications) == int(arg.LimitOpt)) {
|
||||
break
|
||||
}
|
||||
|
||||
notifications = append(notifications, notification)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8223,7 +8241,7 @@ func (q *FakeQuerier) InsertInboxNotification(_ context.Context, arg database.In
|
||||
Content: arg.Content,
|
||||
Icon: arg.Icon,
|
||||
Actions: arg.Actions,
|
||||
CreatedAt: time.Now(),
|
||||
CreatedAt: arg.CreatedAt,
|
||||
}
|
||||
|
||||
q.inboxNotifications = append(q.inboxNotifications, notification)
|
||||
|
||||
@@ -4310,8 +4310,8 @@ func (q *sqlQuerier) CountUnreadInboxNotificationsByUserID(ctx context.Context,
|
||||
const getFilteredInboxNotificationsByUserID = `-- name: GetFilteredInboxNotificationsByUserID :many
|
||||
SELECT id, user_id, template_id, targets, title, content, icon, actions, read_at, created_at FROM inbox_notifications WHERE
|
||||
user_id = $1 AND
|
||||
template_id = ANY($2::UUID[]) AND
|
||||
targets @> COALESCE($3, ARRAY[]::UUID[]) AND
|
||||
($2::UUID[] IS NULL OR template_id = ANY($2::UUID[])) AND
|
||||
($3::UUID[] IS NULL OR targets @> $3::UUID[]) AND
|
||||
($4::inbox_notification_read_status = 'all' OR ($4::inbox_notification_read_status = 'unread' AND read_at IS NULL) OR ($4::inbox_notification_read_status = 'read' AND read_at IS NOT NULL)) AND
|
||||
($5::TIMESTAMPTZ = '0001-01-01 00:00:00Z' OR created_at < $5::TIMESTAMPTZ)
|
||||
ORDER BY created_at DESC
|
||||
|
||||
@@ -21,8 +21,8 @@ SELECT * FROM inbox_notifications WHERE
|
||||
-- param limit_opt: The limit of notifications to fetch. If the limit is not specified, it defaults to 25
|
||||
SELECT * FROM inbox_notifications WHERE
|
||||
user_id = @user_id AND
|
||||
template_id = ANY(@templates::UUID[]) AND
|
||||
targets @> COALESCE(@targets, ARRAY[]::UUID[]) AND
|
||||
(@templates::UUID[] IS NULL OR template_id = ANY(@templates::UUID[])) AND
|
||||
(@targets::UUID[] IS NULL OR targets @> @targets::UUID[]) AND
|
||||
(@read_status::inbox_notification_read_status = 'all' OR (@read_status::inbox_notification_read_status = 'unread' AND read_at IS NULL) OR (@read_status::inbox_notification_read_status = 'read' AND read_at IS NOT NULL)) AND
|
||||
(@created_at_opt::TIMESTAMPTZ = '0001-01-01 00:00:00Z' OR created_at < @created_at_opt::TIMESTAMPTZ)
|
||||
ORDER BY created_at DESC
|
||||
|
||||
Reference in New Issue
Block a user