add: add feature to schedule messages

This commit is contained in:
Matthias Hochmeister
2026-04-17 10:41:00 +02:00
parent 5811ac201e
commit b91cf88812
7 changed files with 177 additions and 2 deletions

View File

@@ -521,6 +521,69 @@ async function sendVehicleEvent(vehicleId: string): Promise<void> {
}
}
// ── One-Time Messages ─────────────────────────────────────────────────────────
interface OneTimeMessage {
id: string;
message: string;
target_room_token: string;
target_room_name: string | null;
send_at: string;
created_by: string | null;
created_at: string;
}
async function getOneTimeMessages(): Promise<OneTimeMessage[]> {
const result = await pool.query(
'SELECT * FROM scheduled_one_time_messages ORDER BY send_at ASC',
);
return result.rows;
}
async function createOneTimeMessage(
data: Pick<OneTimeMessage, 'message' | 'target_room_token' | 'target_room_name' | 'send_at'>,
userId: string,
): Promise<OneTimeMessage> {
const result = await pool.query(
`INSERT INTO scheduled_one_time_messages
(message, target_room_token, target_room_name, send_at, created_by)
VALUES ($1, $2, $3, $4, $5)
RETURNING *`,
[data.message, data.target_room_token, data.target_room_name ?? null, data.send_at, userId],
);
return result.rows[0];
}
async function deleteOneTimeMessage(id: string): Promise<boolean> {
const result = await pool.query(
'DELETE FROM scheduled_one_time_messages WHERE id = $1',
[id],
);
return (result.rowCount ?? 0) > 0;
}
async function sendDueOneTimeMessages(): Promise<void> {
const creds = await getBotCredentials();
if (!creds) return;
const result = await pool.query(
`SELECT * FROM scheduled_one_time_messages WHERE send_at <= NOW() ORDER BY send_at ASC`,
);
for (const row of result.rows as OneTimeMessage[]) {
try {
await nextcloudService.sendMessage(row.target_room_token, row.message, creds.username, creds.appPassword);
await pool.query('DELETE FROM scheduled_one_time_messages WHERE id = $1', [row.id]);
logger.info('scheduledMessages: sent one-time message', { id: row.id, room: row.target_room_token });
} catch (error) {
logger.error('scheduledMessages: failed to send one-time message', {
id: row.id,
error: error instanceof Error ? error.message : String(error),
});
}
}
}
// ── Export ────────────────────────────────────────────────────────────────────
const scheduledMessagesService = {
@@ -535,7 +598,11 @@ const scheduledMessagesService = {
getSubscriptionsForUser,
buildAndSend,
sendVehicleEvent,
getOneTimeMessages,
createOneTimeMessage,
deleteOneTimeMessage,
sendDueOneTimeMessages,
};
export type { ScheduledMessageRule, RoomInfo, RoomsResult };
export type { ScheduledMessageRule, RoomInfo, RoomsResult, OneTimeMessage };
export default scheduledMessagesService;