From ab0834149d13d6dadb6363fcd226495e4d4ff34b Mon Sep 17 00:00:00 2001 From: k4rli Date: Fri, 18 Jul 2025 16:10:13 +0300 Subject: [PATCH] wip --- .env | 22 +++++++++++++++++-- .env.development | 2 +- app/api/montonio/verify-token/route.ts | 9 ++++++++ .../(user)/_components/cart/cart-items.tsx | 2 +- .../cart/montonio-checkout-callback.tsx | 16 +++++++++----- .../(user)/_components/order/cart-totals.tsx | 2 +- .../_components/order/order-completed.tsx | 3 +++ .../(user)/_components/order/order-item.tsx | 8 +++---- .../(user)/_components/order/order-items.tsx | 4 +--- instrumentation.ts | 8 +++---- lib/services/medusaCart.service.ts | 2 +- .../montonio-webhook-handler.service.ts | 2 +- public/locales/et/cart.json | 2 +- 13 files changed, 58 insertions(+), 24 deletions(-) diff --git a/.env b/.env index d26da95..c2b8ddb 100644 --- a/.env +++ b/.env @@ -53,5 +53,23 @@ NEXT_PUBLIC_DEFAULT_LOCALE=et NEXT_PUBLIC_TEAM_NAVIGATION_STYLE=custom NEXT_PUBLIC_USER_NAVIGATION_STYLE=custom -# MEDUSA -NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY= \ No newline at end of file +#### MEDUSA +#NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY=pk_0ec86252438b38ce18d5601f7877e4395d7e0a6afa8687dfea8d37af33015633 +#MEDUSA_BACKEND_URL=http://5.181.51.38:9000 +NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY=pk_e23a820689a07d55aa0a0ad187268559f5d6288ecb0768ff4520516285bdef84 +MEDUSA_BACKEND_URL=http://localhost:9000 +# NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY=pk_068d930c33fea53608a410d84a51935f6ce2ccec5bef8e0ecf75eaee602ac486 +# MEDUSA_BACKEND_URL=https://backoffice-test.medreport.ee:443 + +#### MONTONIO +NEXT_PUBLIC_MONTONIO_ACCESS_KEY=7da5d7fa-3383-4997-9435-46aa818f4ead +MONTONIO_SECRET_KEY=rNZkzwxOiH93mzkdV53AvhSsbGidrgO2Kl5lE/IT7cvo +MONTONIO_API_URL=https://sandbox-stargate.montonio.com + +#### SUPABASE +# NEXT_PUBLIC_SUPABASE_URL=https://oqsdacktkhmbylmzstjq.supabase.co +# NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9xc2RhY2t0a2htYnlsbXpzdGpxIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDY1MjgxMjMsImV4cCI6MjA2MjEwNDEyM30.LdHCTWxijFmhXdnT9KVuLRAVbtSwY7OO-oLtpd8GmO0 +# SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9xc2RhY2t0a2htYnlsbXpzdGpxIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc0NjUyODEyMywiZXhwIjoyMDYyMTA0MTIzfQ.KVcnkZ21Pd0XkJho23dZqFHawVTLQqfvF7l2RxsELLk +NEXT_PUBLIC_SUPABASE_URL=http://5.181.51.38:54321 +NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 +SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU diff --git a/.env.development b/.env.development index c22cdb6..cef0d99 100644 --- a/.env.development +++ b/.env.development @@ -2,7 +2,7 @@ # These values are only used when running the app in development mode. # SUPABASE -NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321 +NEXT_PUBLIC_SUPABASE_URL=http://5.181.51.38:54321 NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU diff --git a/app/api/montonio/verify-token/route.ts b/app/api/montonio/verify-token/route.ts index 6898ac6..b5b1da7 100644 --- a/app/api/montonio/verify-token/route.ts +++ b/app/api/montonio/verify-token/route.ts @@ -38,6 +38,9 @@ export const POST = enhanceRouteHandler( const body = await request.json(); const namespace = 'montonio.verify-token'; + const activeCartId = request.cookies.get('_medusa_cart_id')?.value; + console.info('cart id', activeCartId); + try { const { token } = BodySchema.parse(body); @@ -58,6 +61,12 @@ export const POST = enhanceRouteHandler( algorithms: ['HS256'], }) as MontonioOrderToken; + const [, cartId] = decoded.merchantReferenceDisplay.split(':'); + console.info('active cart id parsed', {cartId, activeCartId, decoded:decoded.merchantReferenceDisplay}); + if (cartId !== activeCartId) { + throw new Error('Invalid cart id'); + } + logger.info( { name: namespace, diff --git a/app/home/(user)/_components/cart/cart-items.tsx b/app/home/(user)/_components/cart/cart-items.tsx index 7ca24a9..5e7243b 100644 --- a/app/home/(user)/_components/cart/cart-items.tsx +++ b/app/home/(user)/_components/cart/cart-items.tsx @@ -21,7 +21,7 @@ export default function CartItems({ cart, items, productColumnLabelKey }: { return ( - + diff --git a/app/home/(user)/_components/cart/montonio-checkout-callback.tsx b/app/home/(user)/_components/cart/montonio-checkout-callback.tsx index 9f2c1eb..2ff184b 100644 --- a/app/home/(user)/_components/cart/montonio-checkout-callback.tsx +++ b/app/home/(user)/_components/cart/montonio-checkout-callback.tsx @@ -8,7 +8,7 @@ import { Button } from '@kit/ui/button'; import { Trans } from '@kit/ui/trans'; import { placeOrder } from "@lib/data/cart" import Link from 'next/link'; -import Loading from '@/app/home/loading'; +import GlobalLoader from '../../loading'; enum Status { LOADING = 'LOADING', @@ -18,12 +18,17 @@ enum Status { export function MontonioCheckoutCallback() { const router = useRouter(); const [status, setStatus] = useState(Status.LOADING); + const [isFinalized, setIsFinalized] = useState(false); const searchParams = useSearchParams(); useEffect(() => { + if (isFinalized) { + return; + } + const token = searchParams.get('order-token'); if (!token) { - router.push('/home/cart'); + //router.push('/home/cart'); return; } @@ -38,6 +43,7 @@ export function MontonioCheckoutCallback() { }, body: JSON.stringify({ token }), }); + setIsFinalized(true); if (!response.ok) { const body = await response.json(); @@ -54,7 +60,7 @@ export function MontonioCheckoutCallback() { router.push('/home/cart'); } } else { - setStatus(Status.ERROR); + throw new Error('Payment failed or pending'); } } catch (e) { console.error("Error verifying token", e); @@ -63,7 +69,7 @@ export function MontonioCheckoutCallback() { } void verifyToken(); - }, [searchParams]); + }, [searchParams, isFinalized]); if (status === Status.ERROR) { return ( @@ -91,5 +97,5 @@ export function MontonioCheckoutCallback() { ); } - return (); + return ; } diff --git a/app/home/(user)/_components/order/cart-totals.tsx b/app/home/(user)/_components/order/cart-totals.tsx index 69dadde..dc25aad 100644 --- a/app/home/(user)/_components/order/cart-totals.tsx +++ b/app/home/(user)/_components/order/cart-totals.tsx @@ -67,7 +67,7 @@ export default function CartTotals({ order }: {
- + } /> +
+
diff --git a/app/home/(user)/_components/order/order-item.tsx b/app/home/(user)/_components/order/order-item.tsx index 658f91b..f938360 100644 --- a/app/home/(user)/_components/order/order-item.tsx +++ b/app/home/(user)/_components/order/order-item.tsx @@ -11,13 +11,13 @@ export default function OrderItem({ item, currencyCode }: { }) { return ( - {/* + {/*
*/} - + - - + + {item.quantity}x{" "} diff --git a/app/home/(user)/_components/order/order-items.tsx b/app/home/(user)/_components/order/order-items.tsx index b08db72..25dbe31 100644 --- a/app/home/(user)/_components/order/order-items.tsx +++ b/app/home/(user)/_components/order/order-items.tsx @@ -2,7 +2,6 @@ import repeat from "@lib/util/repeat" import { StoreOrder } from "@medusajs/types" import { Table, TableBody } from "@kit/ui/table" -import Divider from "@modules/common/components/divider" import SkeletonLineItem from "@modules/skeletons/components/skeleton-line-item" import OrderItem from "./order-item" import { Heading } from "@kit/ui/heading" @@ -19,8 +18,7 @@ export default function OrderItems({ order }: {
- -
+
{items?.length ? items diff --git a/instrumentation.ts b/instrumentation.ts index 7fb6d8f..631b255 100644 --- a/instrumentation.ts +++ b/instrumentation.ts @@ -21,10 +21,10 @@ export async function register() { * @param err */ export const onRequestError: Instrumentation.onRequestError = async (err) => { - const { getServerMonitoringService } = await import('@kit/monitoring/server'); + // const { getServerMonitoringService } = await import('@kit/monitoring/server'); - const service = await getServerMonitoringService(); + // const service = await getServerMonitoringService(); - await service.ready(); - await service.captureException(err as Error); + // await service.ready(); + // await service.captureException(err as Error); }; diff --git a/lib/services/medusaCart.service.ts b/lib/services/medusaCart.service.ts index 2813846..c3a59a6 100644 --- a/lib/services/medusaCart.service.ts +++ b/lib/services/medusaCart.service.ts @@ -73,7 +73,7 @@ export async function handleNavigateToPayment({ language }: { language: string } currency: cart.currency_code.toUpperCase(), description: `Order from Medreport`, locale: language, - merchantReference: `${account.id}:${Date.now()}`, + merchantReference: `${account.id}:${cart.id}:${Date.now()}`, }); const { error } = await supabase diff --git a/packages/billing/montonio/src/services/montonio-webhook-handler.service.ts b/packages/billing/montonio/src/services/montonio-webhook-handler.service.ts index 20fa308..792d103 100644 --- a/packages/billing/montonio/src/services/montonio-webhook-handler.service.ts +++ b/packages/billing/montonio/src/services/montonio-webhook-handler.service.ts @@ -84,7 +84,7 @@ export class MontonioWebhookHandlerService }, `Received Montonio webhook event`); if (event.paymentStatus === 'PAID') { - const accountId = event.merchantReferenceDisplay.split(':')[0]; + const [accountId] = event.merchantReferenceDisplay.split(':'); if (!accountId) { throw new Error('Invalid merchant reference'); } diff --git a/public/locales/et/cart.json b/public/locales/et/cart.json index 8db2419..f5bcc75 100644 --- a/public/locales/et/cart.json +++ b/public/locales/et/cart.json @@ -45,7 +45,7 @@ }, "orderConfirmed": { "title": "Tellimus on edukalt esitatud", - "summary": "Summa", + "summary": "Teenused", "subtotal": "Vahesumma", "taxes": "Maksud", "giftCard": "Kinkekaart",