add: add feature to schedule messages
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user