Add saveReceivedEmail service

This commit is contained in:
Hongbo Wu
2023-01-17 17:04:01 +08:00
parent b7d732df7c
commit 2da4ca5da8
3 changed files with 51 additions and 11 deletions

View File

@ -27,6 +27,15 @@ interface ForwardEmailMessage {
forwardedFrom?: string
}
function isForwardEmailMessage(data: any): data is ForwardEmailMessage {
return (
'from' in data &&
'to' in data &&
'subject' in data &&
('html' in data || 'text' in data)
)
}
const logger = buildLogger('app.dispatch')
export function emailsServiceRouter() {
@ -37,7 +46,6 @@ export function emailsServiceRouter() {
logger.info('email forward router')
const { message, expired } = readPushSubscription(req)
logger.info('pubsub message:', { message, expired })
if (!message) {
res.status(400).send('Bad Request')
@ -51,15 +59,8 @@ export function emailsServiceRouter() {
}
try {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const data: ForwardEmailMessage = JSON.parse(message)
if (
!('from' in data) ||
!('to' in data) ||
!('subject' in data) ||
(!('html' in data) && !('text' in data))
) {
const data = JSON.parse(message) as unknown
if (!isForwardEmailMessage(data)) {
logger.error('Invalid message')
res.status(400).send('Bad Request')
return

View File

@ -0,0 +1,20 @@
import { ReceivedEmail } from '../entity/received_email'
import { getRepository } from '../entity/utils'
export const saveReceivedEmail = async (
from: string,
to: string,
subject: string,
text: string,
html: string,
userId: string
): Promise<ReceivedEmail> => {
return getRepository(ReceivedEmail).save({
from,
to,
subject,
text,
html,
user: { id: userId },
})
}

View File

@ -19,6 +19,25 @@ CREATE TABLE omnivore.received_emails (
CREATE TRIGGER received_emails_modtime BEFORE UPDATE ON omnivore.received_emails
FOR EACH ROW EXECUTE PROCEDURE update_updated_at_column();
GRANT SELECT, INSERT, UPDATE ON omnivore.received_emails TO omnivore_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON omnivore.received_emails TO omnivore_user;
-- Create a trigger to keep the most recent 20 emails for each user
CREATE OR REPLACE FUNCTION omnivore.delete_old_received_emails()
RETURNS trigger AS $$
BEGIN
DELETE FROM omnivore.received_emails
WHERE id NOT IN (
SELECT id FROM omnivore.received_emails
WHERE user_id = NEW.user_id
ORDER BY created_at DESC
LIMIT 20
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER delete_old_received_emails
AFTER INSERT ON omnivore.received_emails
FOR EACH ROW EXECUTE PROCEDURE omnivore.delete_old_received_emails();
COMMIT;