diff --git a/app/home/(user)/(dashboard)/cart/montonio-callback/actions.ts b/app/home/(user)/(dashboard)/cart/montonio-callback/actions.ts index bede603..5ee25aa 100644 --- a/app/home/(user)/(dashboard)/cart/montonio-callback/actions.ts +++ b/app/home/(user)/(dashboard)/cart/montonio-callback/actions.ts @@ -9,6 +9,9 @@ import { placeOrder, retrieveCart } from "@lib/data/cart"; import { createI18nServerInstance } from "~/lib/i18n/i18n.server"; import { createOrder } from '~/lib/services/order.service'; import { getOrderedAnalysisElementsIds, sendOrderToMedipost } from '~/lib/services/medipost.service'; +import { createNotificationsApi } from '@kit/notifications/api'; +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; +import { AccountWithParams } from '@kit/accounts/api'; const ANALYSIS_PACKAGES_TYPE_HANDLE = 'analysis-packages'; const MONTONIO_PAID_STATUS = 'PAID'; @@ -31,7 +34,22 @@ const env = () => z siteUrl: process.env.NEXT_PUBLIC_SITE_URL!, }); -const sendEmail = async ({ email, analysisPackageName, personName, partnerLocationName, language }: { email: string, analysisPackageName: string, personName: string, partnerLocationName: string, language: string }) => { +const sendEmail = async ({ + account, + email, + analysisPackageName, + personName, + partnerLocationName, + language, +}: { + account: AccountWithParams, + email: string, + analysisPackageName: string, + personName: string, + partnerLocationName: string, + language: string, +}) => { + const client = getSupabaseServerAdminClient(); try { const { renderSynlabAnalysisPackageEmail } = await import('@kit/email-templates'); const { getMailer } = await import('@kit/mailers'); @@ -55,6 +73,11 @@ const sendEmail = async ({ email, analysisPackageName, personName, partnerLocati .catch((error) => { throw new Error(`Failed to send email, message=${error}`); }); + await createNotificationsApi(client) + .createNotification({ + account_id: account.id, + body: html, + }); } catch (error) { throw new Error(`Failed to send email, message=${error}`); } @@ -62,13 +85,13 @@ const sendEmail = async ({ email, analysisPackageName, personName, partnerLocati export async function processMontonioCallback(orderToken: string) { const { language } = await createI18nServerInstance(); - + const secretKey = process.env.MONTONIO_SECRET_KEY as string; const decoded = jwt.verify(orderToken, secretKey, { algorithms: ['HS256'], }) as MontonioOrderToken; - + if (decoded.paymentStatus !== MONTONIO_PAID_STATUS) { throw new Error("Payment not successful"); } @@ -79,7 +102,7 @@ export async function processMontonioCallback(orderToken: string) { } try { - const [,, cartId] = decoded.merchantReferenceDisplay.split(':'); + const [, , cartId] = decoded.merchantReferenceDisplay.split(':'); if (!cartId) { throw new Error("Cart ID not found"); } @@ -89,6 +112,7 @@ export async function processMontonioCallback(orderToken: string) { throw new Error("Cart not found"); } + const medusaOrder = await placeOrder(cartId, { revalidateCacheTags: false }); const orderedAnalysisElements = await getOrderedAnalysisElementsIds({ medusaOrder }); const orderId = await createOrder({ medusaOrder, orderedAnalysisElements }); @@ -96,7 +120,7 @@ export async function processMontonioCallback(orderToken: string) { const { productTypes } = await listProductTypes(); const analysisPackagesType = productTypes.find(({ metadata }) => metadata?.handle === ANALYSIS_PACKAGES_TYPE_HANDLE); const analysisPackageOrderItem = medusaOrder.items?.find(({ product_type_id }) => product_type_id === analysisPackagesType?.id); - + const orderResult = { medusaOrderId: medusaOrder.id, email: medusaOrder.email, @@ -107,10 +131,10 @@ export async function processMontonioCallback(orderToken: string) { const { medusaOrderId, email, partnerLocationName, analysisPackageName } = orderResult; const personName = account.name; - + if (email && analysisPackageName) { try { - await sendEmail({ email, analysisPackageName, personName, partnerLocationName, language }); + await sendEmail({ account, email, analysisPackageName, personName, partnerLocationName, language }); } catch (error) { console.error("Failed to send email", error); } @@ -118,9 +142,9 @@ export async function processMontonioCallback(orderToken: string) { // @TODO send email for separate analyses console.error("Missing email or analysisPackageName", orderResult); } - + sendOrderToMedipost({ medusaOrderId, orderedAnalysisElements }); - + return { success: true, orderId }; } catch (error) { console.error("Failed to place order", error);