mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-04-27 11:53:23 +01:00
Setup pinned messages types and table
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
This commit is contained in:
91
ts/sql/server/pinnedMessages.std.ts
Normal file
91
ts/sql/server/pinnedMessages.std.ts
Normal file
@@ -0,0 +1,91 @@
|
||||
// Copyright 2025 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
import type {
|
||||
PinnedMessage,
|
||||
PinnedMessageId,
|
||||
PinnedMessageParams,
|
||||
} from '../../types/PinnedMessage.std.js';
|
||||
import { strictAssert } from '../../util/assert.std.js';
|
||||
import type { ReadableDB, WritableDB } from '../Interface.std.js';
|
||||
import { sql } from '../util.std.js';
|
||||
|
||||
export function getPinnedMessagesForConversation(
|
||||
db: ReadableDB,
|
||||
conversationId: string
|
||||
): ReadonlyArray<PinnedMessage> {
|
||||
const [query, params] = sql`
|
||||
SELECT * FROM pins
|
||||
WHERE conversationId = ${conversationId}
|
||||
ORDER BY pinnedAt DESC
|
||||
`;
|
||||
return db.prepare(query).all<PinnedMessage>(params);
|
||||
}
|
||||
|
||||
export function createPinnedMessage(
|
||||
db: WritableDB,
|
||||
pinnedMessageParams: PinnedMessageParams
|
||||
): PinnedMessage {
|
||||
const [query, params] = sql`
|
||||
INSERT INTO pinnedMessages (
|
||||
conversationId,
|
||||
messageId,
|
||||
messageSentAt,
|
||||
messageSenderAci,
|
||||
pinnedByAci,
|
||||
pinnedAt,
|
||||
expiresAt
|
||||
) VALUES (
|
||||
${pinnedMessageParams.conversationId},
|
||||
${pinnedMessageParams.messageId},
|
||||
${pinnedMessageParams.messageSentAt},
|
||||
${pinnedMessageParams.messageSenderAci},
|
||||
${pinnedMessageParams.pinnedByAci},
|
||||
${pinnedMessageParams.pinnedAt},
|
||||
${pinnedMessageParams.expiresAt}
|
||||
)
|
||||
RETURNING *;
|
||||
`;
|
||||
|
||||
const row = db.prepare(query).get<PinnedMessage>(params);
|
||||
strictAssert(row != null, 'createPinnedMessage: Failed to insert');
|
||||
return row;
|
||||
}
|
||||
|
||||
export function deletePinnedMessage(
|
||||
db: WritableDB,
|
||||
pinnedMessageId: PinnedMessageId
|
||||
): void {
|
||||
const [query, params] = sql`
|
||||
DELETE FROM pinnedMessages
|
||||
WHERE id = ${pinnedMessageId}
|
||||
`;
|
||||
const result = db.prepare(query).run(params);
|
||||
strictAssert(
|
||||
result.changes === 1,
|
||||
`deletePinnedMessage: Expected changes: 1, Actual: ${result.changes}`
|
||||
);
|
||||
}
|
||||
|
||||
export function getNextExpiringPinnedMessageAcrossConversations(
|
||||
db: ReadableDB
|
||||
): PinnedMessage | null {
|
||||
const [query, params] = sql`
|
||||
SELECT * FROM pinnedMessages
|
||||
ORDER BY expiresAt ASC
|
||||
LIMIT 1
|
||||
`;
|
||||
return db.prepare(query).get<PinnedMessage>(params) ?? null;
|
||||
}
|
||||
|
||||
export function deleteAllExpiredPinnedMessagesBefore(
|
||||
db: WritableDB,
|
||||
beforeTimestamp: number
|
||||
): ReadonlyArray<PinnedMessageId> {
|
||||
const [query, params] = sql`
|
||||
DELETE FROM pinnedMessages
|
||||
WHERE expiresAt <= ${beforeTimestamp}
|
||||
RETURNING id
|
||||
`;
|
||||
return db.prepare(query, { pluck: true }).all<PinnedMessageId>(params);
|
||||
}
|
||||
Reference in New Issue
Block a user