Merge pull request #38 from MR-medreport/MED-48

feat(MED-48 MED-100): update products -> cart -> montonio -> orders flow, send email
This commit is contained in:
2025-07-24 10:26:34 +03:00
committed by GitHub
51 changed files with 2570 additions and 327 deletions

View File

@@ -4,6 +4,10 @@ import { Database } from '@kit/supabase/database';
import { UserAnalysis } from '../types/accounts';
export type AccountWithParams = Database['medreport']['Tables']['accounts']['Row'] & {
account_params: Pick<Database['medreport']['Tables']['account_params']['Row'], 'weight' | 'height'> | null;
};
/**
* Class representing an API for interacting with user accounts.
* @constructor
@@ -17,11 +21,11 @@ class AccountsApi {
* @description Get the account data for the given ID.
* @param id
*/
async getAccount(id: string) {
async getAccount(id: string): Promise<AccountWithParams> {
const { data, error } = await this.client
.schema('medreport')
.from('accounts')
.select('*')
.select('*, account_params: account_params (weight, height)')
.eq('id', id)
.single();

View File

@@ -14,6 +14,7 @@ import {
} from "./cookies";
import { getRegion } from "./regions";
import { sdk } from "@lib/config";
import { retrieveOrder } from "./orders";
/**
* Retrieves a cart by its ID. If no ID is provided, it will use the cart ID from the cookies.
@@ -161,9 +162,11 @@ export async function addToCart({
export async function updateLineItem({
lineId,
quantity,
metadata,
}: {
lineId: string;
quantity: number;
metadata?: Record<string, any>;
}) {
if (!lineId) {
throw new Error("Missing lineItem ID when updating line item");
@@ -180,7 +183,7 @@ export async function updateLineItem({
};
await sdk.store.cart
.updateLineItem(cartId, lineId, { quantity }, {}, headers)
.updateLineItem(cartId, lineId, { quantity, metadata }, {}, headers)
.then(async () => {
const cartCacheTag = await getCacheTag("carts");
revalidateTag(cartCacheTag);
@@ -392,7 +395,7 @@ export async function setAddresses(currentState: unknown, formData: FormData) {
* @param cartId - optional - The ID of the cart to place an order for.
* @returns The cart object if the order was successful, or null if not.
*/
export async function placeOrder(cartId?: string) {
export async function placeOrder(cartId?: string, options: { revalidateCacheTags: boolean } = { revalidateCacheTags: true }) {
const id = cartId || (await getCartId());
if (!id) {
@@ -406,21 +409,26 @@ export async function placeOrder(cartId?: string) {
const cartRes = await sdk.store.cart
.complete(id, {}, headers)
.then(async (cartRes) => {
const cartCacheTag = await getCacheTag("carts");
revalidateTag(cartCacheTag);
if (options?.revalidateCacheTags) {
const cartCacheTag = await getCacheTag("carts");
revalidateTag(cartCacheTag);
}
return cartRes;
})
.catch(medusaError);
if (cartRes?.type === "order") {
const orderCacheTag = await getCacheTag("orders");
revalidateTag(orderCacheTag);
if (options?.revalidateCacheTags) {
const orderCacheTag = await getCacheTag("orders");
revalidateTag(orderCacheTag);
}
removeCartId();
redirect(`/home/order/${cartRes?.order.id}/confirmed`);
} else {
throw new Error("Cart is not an order");
}
return retrieveOrder(cartRes.order.id);
}
/**

View File

@@ -14,7 +14,7 @@ export const listProducts = async ({
regionId,
}: {
pageParam?: number
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductParams & { collection_id?: string }
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductParams & { "type_id[0]"?: string }
countryCode?: string
regionId?: string
}): Promise<{
@@ -134,3 +134,24 @@ export const listProductsWithSort = async ({
queryParams,
}
}
export const listProductTypes = async (): Promise<{ productTypes: HttpTypes.StoreProductType[]; count: number }> => {
const next = {
...(await getCacheOptions("productTypes")),
};
return sdk.client
.fetch<{ product_types: HttpTypes.StoreProductType[]; count: number }>(
"/store/product-types",
{
next,
cache: "force-cache",
query: {
fields: "id,value,metadata",
},
}
)
.then(({ product_types, count }) => {
return { productTypes: product_types, count };
});
};