diff --git a/packages/mailer/handler.ts b/packages/mailer/handler.ts index fd42f98..7d51d93 100644 --- a/packages/mailer/handler.ts +++ b/packages/mailer/handler.ts @@ -15,13 +15,44 @@ interface FormData { waiters_count: string } -const sendEmail = (formData: FormData) => { - const SOURCE_EMAIL = 'hi@menuo.app' - const DESTINATION_EMAIL = 'hi@menuo.app' +interface SendEmailInput { + from: string + to: string[] + replyTo: string[] + message: string + subject: string +} + +const buildEmailParams = (data: SendEmailInput) => { + const emailParams = { + Source: data.from, + ReplyToAddresses: data.replyTo, + Destination: { + ToAddresses: data.to, + }, + Message: { + Body: { + Text: { + Charset: 'UTF-8', + Data: data.message, + }, + }, + Subject: { + Charset: 'UTF-8', + Data: data.subject, + }, + }, + } + return emailParams +} + +function sendContactEmail(formData: FormData) { + const from = 'hi@menuo.app' + const to = ['hi@menuo.app'] const { email, - message, + message: messageFormText, first_name, restaurant_name, last_name, @@ -30,9 +61,10 @@ const sendEmail = (formData: FormData) => { table_list, waiters_count, } = formData - - const messageData = ` -${message} + const replyTo = [email] + const subject = `Nowa wiadomość z formularza menuo od ${restaurant_name}` + const message = ` +${messageFormText} ----------------------------------------------------------------------------- Restauracja: ${restaurant_name} @@ -44,33 +76,15 @@ Menu: ${menu} Lista stolików: ${table_list} ` - const emailParams = { - Source: SOURCE_EMAIL, - ReplyToAddresses: [email], - Destination: { - ToAddresses: [DESTINATION_EMAIL], - }, - Message: { - Body: { - Text: { - Charset: 'UTF-8', - Data: messageData, - }, - }, - Subject: { - Charset: 'UTF-8', - Data: `Nowa wiadomość z formularza menuo od ${restaurant_name}`, - }, - }, - } - - return ses.sendEmail(emailParams).promise() + return ses + .sendEmail(buildEmailParams({ from, to, replyTo, message, subject })) + .promise() } -export const staticSiteMailer: APIGatewayProxyHandler = async ( +export const staticSiteMailer: APIGatewayProxyHandler = async function ( event, _context, -): Promise => { +): Promise { const formData = JSON.parse(event.body) const headers = { @@ -85,7 +99,7 @@ export const staticSiteMailer: APIGatewayProxyHandler = async ( }) try { - await sendEmail(formData) + await sendContactEmail(formData) } catch (e) { console.log(e) return sendMailErrorResponse(e) diff --git a/packages/server/serverless.yml b/packages/server/serverless.yml index 3f4e8bc..0df27b5 100644 --- a/packages/server/serverless.yml +++ b/packages/server/serverless.yml @@ -30,6 +30,7 @@ provider: - Effect: 'Allow' Action: - 'lambda:*' + - 'ses:SendEmail' Resource: '*' functions: @@ -195,6 +196,14 @@ functions: send_notifications: handler: src/handlers.sendNotifications + send_email_order: + handler: src/handlers.send-email-order.handler + events: + - http: + method: post + path: static-site-mailer + cors: true + # logs: # handler: src/logs/handlers/log.handler # events: diff --git a/packages/server/src/handlers.ts b/packages/server/src/handlers.ts index 93b4ebf..b6d90c4 100644 --- a/packages/server/src/handlers.ts +++ b/packages/server/src/handlers.ts @@ -3,3 +3,4 @@ export { handler as registerWaiter } from './auth/register-waiter' export { handler as verifyToken } from './auth/authorizer' export { handler as me } from './auth/me' export { handler as sendNotifications } from './notifications/handlers/send-notifications' +export { handler as sendEmailOrder } from './notifications/handlers/send-email-order' diff --git a/packages/server/src/notifications/email.ts b/packages/server/src/notifications/email.ts new file mode 100644 index 0000000..11b5c6f --- /dev/null +++ b/packages/server/src/notifications/email.ts @@ -0,0 +1,31 @@ +export interface SendEmailInput { + from: string + to: string[] + replyTo: string[] + message: string + subject: string +} + +export const buildEmailParams = (data: SendEmailInput) => { + const emailParams = { + Source: data.from, + ReplyToAddresses: data.replyTo, + Destination: { + ToAddresses: data.to, + }, + Message: { + Body: { + Text: { + Charset: 'UTF-8', + Data: data.message, + }, + }, + Subject: { + Charset: 'UTF-8', + Data: data.subject, + }, + }, + } + + return emailParams +} diff --git a/packages/server/src/notifications/handlers/send-email-order.ts b/packages/server/src/notifications/handlers/send-email-order.ts new file mode 100644 index 0000000..18b5220 --- /dev/null +++ b/packages/server/src/notifications/handlers/send-email-order.ts @@ -0,0 +1,39 @@ +import 'source-map-support/register' +import { SES } from 'aws-sdk' + +import { response } from 'src/lib/http' +import { buildEmailParams } from '../email' + +export const handler = async function (event: any) { + // TODO: Define interface + const { subscriptions, body, title } = event + + try { + await sendEmailWithOrder({ table: '1233' }) + } catch (e) { + console.log(e) + return response({ kind: 'NOT_FOUND' }) + } + + return response({ body: event }) +} + +function sendEmailWithOrder({ table }: { table: string }) { + const from = 'hi@menuo.app' + const to = ['hi@menuo.app'] + const replyTo = to + const subject = `Nowe zamówienie (Solar Gliwice) od ${table}` + // TODO: Generate proper message + const message = ` + kto kupił + Kod + Nazwa + Marka + ilość szt. + ` + + const ses = new SES() + return ses + .sendEmail(buildEmailParams({ from, to, replyTo, message, subject })) + .promise() +} diff --git a/packages/server/src/notifications/notifications.ts b/packages/server/src/notifications/notifications.ts index 7e151fc..4440b00 100644 --- a/packages/server/src/notifications/notifications.ts +++ b/packages/server/src/notifications/notifications.ts @@ -16,11 +16,12 @@ export const sendNotification = ({ }: { title: string body: string -}) => async (subscription: any) => { - return webPush - .sendNotification(subscription, JSON.stringify({ title, body })) - .catch(error => console.error(error)) -} +}) => + async function (subscription: any) { + return webPush + .sendNotification(subscription, JSON.stringify({ title, body })) + .catch(error => console.error(error)) + } export const sendNotifications = ({ functionName, diff --git a/packages/shared/interfaces/config.ts b/packages/shared/interfaces/config.ts index 4f9c430..c81590b 100644 --- a/packages/shared/interfaces/config.ts +++ b/packages/shared/interfaces/config.ts @@ -1,4 +1,5 @@ export interface RestaurantConfig { MENU_READ_ONLY: boolean CHANGE_CALL_WAITER_TO_CONTACT: boolean + CHANGE_ORDER_TO_EMAIL: boolean }