206 lines
4.7 KiB
TypeScript
206 lines
4.7 KiB
TypeScript
import type { StoreOrder } from '@medusajs/types';
|
|
|
|
import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client';
|
|
import { getSupabaseServerClient } from '@kit/supabase/server-client';
|
|
|
|
import type { AnalysisOrder, TTOOrder } from '../types/order';
|
|
|
|
export async function createAnalysisOrder({
|
|
medusaOrder,
|
|
orderedAnalysisElements,
|
|
}: {
|
|
medusaOrder: StoreOrder;
|
|
orderedAnalysisElements: {
|
|
analysisElementId?: number;
|
|
analysisId?: number;
|
|
}[];
|
|
}) {
|
|
const supabase = getSupabaseServerClient();
|
|
|
|
const {
|
|
data: { user },
|
|
} = await supabase.auth.getUser();
|
|
if (!user) {
|
|
throw new Error('User not found');
|
|
}
|
|
const orderResult = await supabase
|
|
.schema('medreport')
|
|
.from('analysis_orders')
|
|
.insert({
|
|
analysis_element_ids: orderedAnalysisElements
|
|
.map(({ analysisElementId }) => analysisElementId)
|
|
.filter(Boolean) as number[],
|
|
analysis_ids: orderedAnalysisElements
|
|
.map(({ analysisId }) => analysisId)
|
|
.filter(Boolean) as number[],
|
|
status: 'QUEUED',
|
|
user_id: user.id,
|
|
medusa_order_id: medusaOrder.id,
|
|
})
|
|
.select('id')
|
|
.single()
|
|
.throwOnError();
|
|
|
|
if (orderResult.error || !orderResult.data?.id) {
|
|
throw new Error(
|
|
`Failed to create order, message=${orderResult.error}, data=${JSON.stringify(orderResult)}`,
|
|
);
|
|
}
|
|
|
|
return orderResult.data.id;
|
|
}
|
|
|
|
export async function getAnalysisOrder({
|
|
medusaOrderId,
|
|
analysisOrderId,
|
|
}: {
|
|
medusaOrderId?: string;
|
|
analysisOrderId?: number;
|
|
}) {
|
|
const query = getSupabaseServerAdminClient()
|
|
.schema('medreport')
|
|
.from('analysis_orders')
|
|
.select('*');
|
|
if (medusaOrderId) {
|
|
query.eq('medusa_order_id', medusaOrderId);
|
|
} else if (analysisOrderId) {
|
|
query.eq('id', analysisOrderId);
|
|
} else {
|
|
throw new Error('Either medusaOrderId or orderId must be provided');
|
|
}
|
|
|
|
const { data: order, error } = await query.single();
|
|
if (error) {
|
|
console.error("Get analysis order error", error);
|
|
throw new Error(
|
|
`Failed to get order by medusaOrderId=${medusaOrderId} or analysisOrderId=${analysisOrderId}, message=${error.message}, data=${JSON.stringify(order)}`,
|
|
);
|
|
}
|
|
return order as AnalysisOrder;
|
|
}
|
|
|
|
export async function getAnalysisOrders({
|
|
orderStatus,
|
|
}: {
|
|
orderStatus?: AnalysisOrder['status'];
|
|
} = {}) {
|
|
const client = getSupabaseServerClient();
|
|
|
|
const {
|
|
data: { user },
|
|
} = await client.auth.getUser();
|
|
if (!user) {
|
|
throw new Error('Unauthorized');
|
|
}
|
|
|
|
const query = client
|
|
.schema('medreport')
|
|
.from('analysis_orders')
|
|
.select('*')
|
|
.eq('user_id', user.id);
|
|
if (orderStatus) {
|
|
query.eq('status', orderStatus);
|
|
}
|
|
const orders = await query
|
|
.order('created_at', { ascending: false })
|
|
.throwOnError();
|
|
return orders.data;
|
|
}
|
|
|
|
export async function getAnalysisOrdersAdmin({
|
|
orderStatus,
|
|
medusaOrderId,
|
|
}: {
|
|
orderStatus?: AnalysisOrder['status'];
|
|
medusaOrderId?: string | null;
|
|
} = {}) {
|
|
const query = getSupabaseServerAdminClient()
|
|
.schema('medreport')
|
|
.from('analysis_orders')
|
|
.select('*');
|
|
if (orderStatus) {
|
|
query.eq('status', orderStatus);
|
|
}
|
|
if (medusaOrderId) {
|
|
query.eq('medusa_order_id', medusaOrderId);
|
|
}
|
|
const orders = await query
|
|
.order('created_at', { ascending: false })
|
|
.throwOnError();
|
|
return orders.data;
|
|
}
|
|
|
|
export async function getTtoOrders({
|
|
orderStatus,
|
|
lineItemIds,
|
|
}: {
|
|
orderStatus?: TTOOrder['status'];
|
|
lineItemIds?: string[];
|
|
} = {}) {
|
|
const client = getSupabaseServerClient();
|
|
|
|
const {
|
|
data: { user },
|
|
} = await client.auth.getUser();
|
|
if (!user) {
|
|
throw new Error('Unauthorized');
|
|
}
|
|
|
|
const query = client
|
|
.schema('medreport')
|
|
.from('connected_online_reservation')
|
|
.select('*')
|
|
.eq('user_id', user.id);
|
|
|
|
if (orderStatus) {
|
|
query.eq('status', orderStatus);
|
|
}
|
|
|
|
if (lineItemIds?.length) {
|
|
query.in('medusa_cart_line_item_id', lineItemIds);
|
|
}
|
|
|
|
const orders = await query
|
|
.order('created_at', { ascending: false })
|
|
.throwOnError();
|
|
|
|
const ordersWithLocation = await Promise.all(
|
|
orders.data.map(async (order) => ({
|
|
...order,
|
|
location: await getTtoLocation(order.location_sync_id),
|
|
})),
|
|
);
|
|
|
|
return ordersWithLocation;
|
|
}
|
|
|
|
export async function getTtoLocation(syncId?: number | null) {
|
|
if (!syncId) {
|
|
return null;
|
|
}
|
|
|
|
const client = getSupabaseServerClient();
|
|
|
|
const {
|
|
data: { user },
|
|
} = await client.auth.getUser();
|
|
|
|
if (!user) {
|
|
throw new Error('Unauthorized');
|
|
}
|
|
|
|
const { data, error } = await client
|
|
.schema('medreport')
|
|
.from('connected_online_locations')
|
|
.select('name')
|
|
.eq('sync_id', syncId)
|
|
.limit(1)
|
|
.single();
|
|
|
|
if (error) {
|
|
throw new Error('Could not receive online locations: ', error);
|
|
}
|
|
|
|
return data;
|
|
}
|