The inbox UI deduplicates items by issue_id (showing only the latest notification per issue). Previously, clicking archive only archived the single visible item, so older items for the same issue would reappear. Now archiving operates at the issue level — both the backend and frontend archive all inbox items sharing the same issue_id.
376 lines
10 KiB
Go
376 lines
10 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.30.0
|
|
// source: inbox.sql
|
|
|
|
package db
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
const archiveAllInbox = `-- name: ArchiveAllInbox :execrows
|
|
UPDATE inbox_item SET archived = true
|
|
WHERE workspace_id = $1 AND recipient_type = 'member' AND recipient_id = $2 AND archived = false
|
|
`
|
|
|
|
type ArchiveAllInboxParams struct {
|
|
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
|
RecipientID pgtype.UUID `json:"recipient_id"`
|
|
}
|
|
|
|
func (q *Queries) ArchiveAllInbox(ctx context.Context, arg ArchiveAllInboxParams) (int64, error) {
|
|
result, err := q.db.Exec(ctx, archiveAllInbox, arg.WorkspaceID, arg.RecipientID)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return result.RowsAffected(), nil
|
|
}
|
|
|
|
const archiveAllReadInbox = `-- name: ArchiveAllReadInbox :execrows
|
|
UPDATE inbox_item SET archived = true
|
|
WHERE workspace_id = $1 AND recipient_type = 'member' AND recipient_id = $2 AND read = true AND archived = false
|
|
`
|
|
|
|
type ArchiveAllReadInboxParams struct {
|
|
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
|
RecipientID pgtype.UUID `json:"recipient_id"`
|
|
}
|
|
|
|
func (q *Queries) ArchiveAllReadInbox(ctx context.Context, arg ArchiveAllReadInboxParams) (int64, error) {
|
|
result, err := q.db.Exec(ctx, archiveAllReadInbox, arg.WorkspaceID, arg.RecipientID)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return result.RowsAffected(), nil
|
|
}
|
|
|
|
const archiveCompletedInbox = `-- name: ArchiveCompletedInbox :execrows
|
|
UPDATE inbox_item i SET archived = true
|
|
WHERE i.workspace_id = $1 AND i.recipient_type = 'member' AND i.recipient_id = $2 AND i.archived = false
|
|
AND i.issue_id IN (SELECT id FROM issue WHERE status IN ('done', 'cancelled'))
|
|
`
|
|
|
|
type ArchiveCompletedInboxParams struct {
|
|
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
|
RecipientID pgtype.UUID `json:"recipient_id"`
|
|
}
|
|
|
|
func (q *Queries) ArchiveCompletedInbox(ctx context.Context, arg ArchiveCompletedInboxParams) (int64, error) {
|
|
result, err := q.db.Exec(ctx, archiveCompletedInbox, arg.WorkspaceID, arg.RecipientID)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return result.RowsAffected(), nil
|
|
}
|
|
|
|
const archiveInboxByIssue = `-- name: ArchiveInboxByIssue :execrows
|
|
UPDATE inbox_item SET archived = true
|
|
WHERE workspace_id = $1 AND recipient_type = $2 AND recipient_id = $3 AND issue_id = $4 AND archived = false
|
|
`
|
|
|
|
type ArchiveInboxByIssueParams struct {
|
|
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
|
RecipientType string `json:"recipient_type"`
|
|
RecipientID pgtype.UUID `json:"recipient_id"`
|
|
IssueID pgtype.UUID `json:"issue_id"`
|
|
}
|
|
|
|
func (q *Queries) ArchiveInboxByIssue(ctx context.Context, arg ArchiveInboxByIssueParams) (int64, error) {
|
|
result, err := q.db.Exec(ctx, archiveInboxByIssue,
|
|
arg.WorkspaceID,
|
|
arg.RecipientType,
|
|
arg.RecipientID,
|
|
arg.IssueID,
|
|
)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return result.RowsAffected(), nil
|
|
}
|
|
|
|
const archiveInboxItem = `-- name: ArchiveInboxItem :one
|
|
UPDATE inbox_item SET archived = true
|
|
WHERE id = $1
|
|
RETURNING id, workspace_id, recipient_type, recipient_id, type, severity, issue_id, title, body, read, archived, created_at, actor_type, actor_id, details
|
|
`
|
|
|
|
func (q *Queries) ArchiveInboxItem(ctx context.Context, id pgtype.UUID) (InboxItem, error) {
|
|
row := q.db.QueryRow(ctx, archiveInboxItem, id)
|
|
var i InboxItem
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.WorkspaceID,
|
|
&i.RecipientType,
|
|
&i.RecipientID,
|
|
&i.Type,
|
|
&i.Severity,
|
|
&i.IssueID,
|
|
&i.Title,
|
|
&i.Body,
|
|
&i.Read,
|
|
&i.Archived,
|
|
&i.CreatedAt,
|
|
&i.ActorType,
|
|
&i.ActorID,
|
|
&i.Details,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const countUnreadInbox = `-- name: CountUnreadInbox :one
|
|
SELECT count(*) FROM inbox_item
|
|
WHERE workspace_id = $1 AND recipient_type = $2 AND recipient_id = $3 AND read = false AND archived = false
|
|
`
|
|
|
|
type CountUnreadInboxParams struct {
|
|
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
|
RecipientType string `json:"recipient_type"`
|
|
RecipientID pgtype.UUID `json:"recipient_id"`
|
|
}
|
|
|
|
func (q *Queries) CountUnreadInbox(ctx context.Context, arg CountUnreadInboxParams) (int64, error) {
|
|
row := q.db.QueryRow(ctx, countUnreadInbox, arg.WorkspaceID, arg.RecipientType, arg.RecipientID)
|
|
var count int64
|
|
err := row.Scan(&count)
|
|
return count, err
|
|
}
|
|
|
|
const createInboxItem = `-- name: CreateInboxItem :one
|
|
INSERT INTO inbox_item (
|
|
workspace_id, recipient_type, recipient_id,
|
|
type, severity, issue_id, title, body,
|
|
actor_type, actor_id, details
|
|
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
|
|
RETURNING id, workspace_id, recipient_type, recipient_id, type, severity, issue_id, title, body, read, archived, created_at, actor_type, actor_id, details
|
|
`
|
|
|
|
type CreateInboxItemParams struct {
|
|
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
|
RecipientType string `json:"recipient_type"`
|
|
RecipientID pgtype.UUID `json:"recipient_id"`
|
|
Type string `json:"type"`
|
|
Severity string `json:"severity"`
|
|
IssueID pgtype.UUID `json:"issue_id"`
|
|
Title string `json:"title"`
|
|
Body pgtype.Text `json:"body"`
|
|
ActorType pgtype.Text `json:"actor_type"`
|
|
ActorID pgtype.UUID `json:"actor_id"`
|
|
Details []byte `json:"details"`
|
|
}
|
|
|
|
func (q *Queries) CreateInboxItem(ctx context.Context, arg CreateInboxItemParams) (InboxItem, error) {
|
|
row := q.db.QueryRow(ctx, createInboxItem,
|
|
arg.WorkspaceID,
|
|
arg.RecipientType,
|
|
arg.RecipientID,
|
|
arg.Type,
|
|
arg.Severity,
|
|
arg.IssueID,
|
|
arg.Title,
|
|
arg.Body,
|
|
arg.ActorType,
|
|
arg.ActorID,
|
|
arg.Details,
|
|
)
|
|
var i InboxItem
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.WorkspaceID,
|
|
&i.RecipientType,
|
|
&i.RecipientID,
|
|
&i.Type,
|
|
&i.Severity,
|
|
&i.IssueID,
|
|
&i.Title,
|
|
&i.Body,
|
|
&i.Read,
|
|
&i.Archived,
|
|
&i.CreatedAt,
|
|
&i.ActorType,
|
|
&i.ActorID,
|
|
&i.Details,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getInboxItem = `-- name: GetInboxItem :one
|
|
SELECT id, workspace_id, recipient_type, recipient_id, type, severity, issue_id, title, body, read, archived, created_at, actor_type, actor_id, details FROM inbox_item
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) GetInboxItem(ctx context.Context, id pgtype.UUID) (InboxItem, error) {
|
|
row := q.db.QueryRow(ctx, getInboxItem, id)
|
|
var i InboxItem
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.WorkspaceID,
|
|
&i.RecipientType,
|
|
&i.RecipientID,
|
|
&i.Type,
|
|
&i.Severity,
|
|
&i.IssueID,
|
|
&i.Title,
|
|
&i.Body,
|
|
&i.Read,
|
|
&i.Archived,
|
|
&i.CreatedAt,
|
|
&i.ActorType,
|
|
&i.ActorID,
|
|
&i.Details,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getInboxItemInWorkspace = `-- name: GetInboxItemInWorkspace :one
|
|
SELECT id, workspace_id, recipient_type, recipient_id, type, severity, issue_id, title, body, read, archived, created_at, actor_type, actor_id, details FROM inbox_item
|
|
WHERE id = $1 AND workspace_id = $2
|
|
`
|
|
|
|
type GetInboxItemInWorkspaceParams struct {
|
|
ID pgtype.UUID `json:"id"`
|
|
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
|
}
|
|
|
|
func (q *Queries) GetInboxItemInWorkspace(ctx context.Context, arg GetInboxItemInWorkspaceParams) (InboxItem, error) {
|
|
row := q.db.QueryRow(ctx, getInboxItemInWorkspace, arg.ID, arg.WorkspaceID)
|
|
var i InboxItem
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.WorkspaceID,
|
|
&i.RecipientType,
|
|
&i.RecipientID,
|
|
&i.Type,
|
|
&i.Severity,
|
|
&i.IssueID,
|
|
&i.Title,
|
|
&i.Body,
|
|
&i.Read,
|
|
&i.Archived,
|
|
&i.CreatedAt,
|
|
&i.ActorType,
|
|
&i.ActorID,
|
|
&i.Details,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const listInboxItems = `-- name: ListInboxItems :many
|
|
SELECT i.id, i.workspace_id, i.recipient_type, i.recipient_id, i.type, i.severity, i.issue_id, i.title, i.body, i.read, i.archived, i.created_at, i.actor_type, i.actor_id, i.details,
|
|
iss.status as issue_status
|
|
FROM inbox_item i
|
|
LEFT JOIN issue iss ON iss.id = i.issue_id
|
|
WHERE i.workspace_id = $1 AND i.recipient_type = $2 AND i.recipient_id = $3 AND i.archived = false
|
|
ORDER BY i.created_at DESC
|
|
`
|
|
|
|
type ListInboxItemsParams struct {
|
|
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
|
RecipientType string `json:"recipient_type"`
|
|
RecipientID pgtype.UUID `json:"recipient_id"`
|
|
}
|
|
|
|
type ListInboxItemsRow struct {
|
|
ID pgtype.UUID `json:"id"`
|
|
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
|
RecipientType string `json:"recipient_type"`
|
|
RecipientID pgtype.UUID `json:"recipient_id"`
|
|
Type string `json:"type"`
|
|
Severity string `json:"severity"`
|
|
IssueID pgtype.UUID `json:"issue_id"`
|
|
Title string `json:"title"`
|
|
Body pgtype.Text `json:"body"`
|
|
Read bool `json:"read"`
|
|
Archived bool `json:"archived"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
ActorType pgtype.Text `json:"actor_type"`
|
|
ActorID pgtype.UUID `json:"actor_id"`
|
|
Details []byte `json:"details"`
|
|
IssueStatus pgtype.Text `json:"issue_status"`
|
|
}
|
|
|
|
func (q *Queries) ListInboxItems(ctx context.Context, arg ListInboxItemsParams) ([]ListInboxItemsRow, error) {
|
|
rows, err := q.db.Query(ctx, listInboxItems, arg.WorkspaceID, arg.RecipientType, arg.RecipientID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []ListInboxItemsRow{}
|
|
for rows.Next() {
|
|
var i ListInboxItemsRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.WorkspaceID,
|
|
&i.RecipientType,
|
|
&i.RecipientID,
|
|
&i.Type,
|
|
&i.Severity,
|
|
&i.IssueID,
|
|
&i.Title,
|
|
&i.Body,
|
|
&i.Read,
|
|
&i.Archived,
|
|
&i.CreatedAt,
|
|
&i.ActorType,
|
|
&i.ActorID,
|
|
&i.Details,
|
|
&i.IssueStatus,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const markAllInboxRead = `-- name: MarkAllInboxRead :execrows
|
|
UPDATE inbox_item SET read = true
|
|
WHERE workspace_id = $1 AND recipient_type = 'member' AND recipient_id = $2 AND archived = false AND read = false
|
|
`
|
|
|
|
type MarkAllInboxReadParams struct {
|
|
WorkspaceID pgtype.UUID `json:"workspace_id"`
|
|
RecipientID pgtype.UUID `json:"recipient_id"`
|
|
}
|
|
|
|
func (q *Queries) MarkAllInboxRead(ctx context.Context, arg MarkAllInboxReadParams) (int64, error) {
|
|
result, err := q.db.Exec(ctx, markAllInboxRead, arg.WorkspaceID, arg.RecipientID)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return result.RowsAffected(), nil
|
|
}
|
|
|
|
const markInboxRead = `-- name: MarkInboxRead :one
|
|
UPDATE inbox_item SET read = true
|
|
WHERE id = $1
|
|
RETURNING id, workspace_id, recipient_type, recipient_id, type, severity, issue_id, title, body, read, archived, created_at, actor_type, actor_id, details
|
|
`
|
|
|
|
func (q *Queries) MarkInboxRead(ctx context.Context, id pgtype.UUID) (InboxItem, error) {
|
|
row := q.db.QueryRow(ctx, markInboxRead, id)
|
|
var i InboxItem
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.WorkspaceID,
|
|
&i.RecipientType,
|
|
&i.RecipientID,
|
|
&i.Type,
|
|
&i.Severity,
|
|
&i.IssueID,
|
|
&i.Title,
|
|
&i.Body,
|
|
&i.Read,
|
|
&i.Archived,
|
|
&i.CreatedAt,
|
|
&i.ActorType,
|
|
&i.ActorID,
|
|
&i.Details,
|
|
)
|
|
return i, err
|
|
}
|