@websolutespa/bom-mixer-checkout 3.1.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @websolutespa/bom-mixer-checkout
2
2
 
3
+ ## 3.1.1
4
+
3
5
  ## 3.1.0
4
6
 
5
7
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","names":[],"sources":["../../src/models/article/article.service.ts","../../src/models/cart/cart.service.ts","../../src/models/checkout/checkout.service.ts","../../src/models/delivery/delivery.service.ts","../../src/models/discount/discount.service.ts","../../src/models/order/order.service.ts","../../src/models/payment/payment.service.ts","../../src/models/retailer/retailer.service.ts"],"sourcesContent":["import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IArticle } from './article';\r\n\r\nexport async function getArticles(params: QueryParams = {}): Promise<IArticle[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.article!.findMany<IArticle>(params);\r\n return items;\r\n}\r\n\r\nexport async function getArticle(id: IEquatable, params: QueryParams = {}): Promise<IArticle | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.article!.findOne<IArticle>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getArticlesPagination(params: QueryParams = {}): Promise<IPaginationResult<IArticle>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.article!.findPaged<IArticle>(params);\r\n return pagination;\r\n}\r\n","import { IEquatable } from '@websolutespa/bom-core';\r\nimport { getCurrentUser } from '@websolutespa/bom-mixer-auth/server';\r\nimport { apiHandler } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutItem } from '../checkout/checkout';\r\nimport { ICartItem } from './cart';\r\n\r\nexport async function getItems(items: ICartItem[], market: string, locale: string, user?: { id: IEquatable }): Promise<ICheckoutItem[]> {\r\n if (user) {\r\n // !!! todo calculate user discount price\r\n return items.map(x => ({ ...x, price: x.article.price * 0.9, fullPrice: x.article.price }));\r\n } else {\r\n return items.map(x => ({ ...x, price: x.article.price, fullPrice: x.article.price }));\r\n }\r\n}\r\n\r\nexport function checkoutItemsHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutItem[]>) => {\r\n const items = request.body.items;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const user = await getCurrentUser(request, response);\r\n /*\r\n if (!user) {\r\n return response.status(400);\r\n }\r\n */\r\n const data = await getItems(items, market, locale, user);\r\n return response.status(200).json(data);\r\n },\r\n });\r\n}\r\n","import { IEntity, IOption } from '@websolutespa/bom-core';\nimport { IUserAddress } from '@websolutespa/bom-mixer-auth';\nimport { IEmailComponent, IEmailLayoutComponent } from '@websolutespa/bom-mixer-emails';\nimport { getCountries, getProvinces, getRegions, getRoutesForSchemas } from '@websolutespa/bom-mixer-models/server';\nimport { remoteApiPost, StoreStrategy, storeStrategy } from '@websolutespa/bom-mixer-store';\nimport { apiHandler } from '@websolutespa/bom-mixer-store/server';\nimport { NextApiRequest, NextApiResponse } from 'next';\nimport { IDiscountType } from '../discount/discount';\nimport { ICheckoutPartial, ICheckoutPaymentRedirect } from './checkout';\n\n// step 1. Items\n// step 2. Info\n// step 3. Deliveries\n// step 4. Stores\n// step 5. Payments\n// step 6. Confirm\n\nexport function checkoutInfoHandler() {\n return apiHandler({\n options: async (request: NextApiRequest, response: NextApiResponse) => {\n response.status(200).end();\n },\n post: async (request: NextApiRequest, response: NextApiResponse<{\n countries: IOption[],\n regions: IOption[],\n provinces: IOption[]\n }>) => {\n const checkout = request.body;\n const locale: string | undefined = request.query.locale as string;\n const market: string | undefined = request.query.market as string;\n const countries = await getCountries(locale) as IOption[];\n const provinces = await getProvinces(locale) as IOption[];\n const regions = await getRegions(locale) as IOption[];\n const data = { countries, regions, provinces };\n response.status(200).json(data);\n },\n });\n}\n\n// update\nexport async function updateCheckout(checkout: ICheckoutPartial, action: string, market: string, locale: string): Promise<ICheckoutPartial> {\n // generic checkout update\n switch (action) {\n case 'basket':\n break;\n case 'info':\n break;\n case 'delivery':\n checkout.delivery = checkout.delivery ? {\n ...checkout.delivery,\n delivery: {\n ...checkout.delivery,\n },\n } : undefined;\n break;\n case 'retailer':\n break;\n case 'discount':\n break;\n case 'payment':\n break;\n }\n // recalculate price\n const subTotal = checkout.items ? checkout.items.reduce((p, c) => {\n return p + c.price * c.qty;\n }, 0) : 0;\n const subTotalFull = checkout.items ? checkout.items.reduce((p, c) => {\n return p + c.fullPrice * c.qty;\n }, 0) : 0;\n const today = new Date();\n const subTotalDiscountPrice = (checkout.discounts || []).reduce((p, c) => {\n let value = 0;\n const discount = c.discount;\n if (\n (!discount.validFrom || new Date(discount.validFrom) < today)\n && (!discount.validTo || new Date(discount.validTo) > today)\n ) {\n switch (discount.type) {\n case IDiscountType.Percent: {\n value = Math.round(subTotal * discount.value * -1) / 100;\n c.price = value;\n }\n break;\n case IDiscountType.Fixed: {\n value = discount.value * -1;\n c.price = value;\n }\n break;\n }\n }\n return p + value;\n }, 0);\n console.log('subTotalDiscountPrice', subTotalDiscountPrice);\n const deliveryPrice = checkout.delivery?.price || 0;\n const afterTaxesDiscountPrice = (checkout.discounts || []).reduce((p, c) => {\n let value = 0;\n const discount = c.discount;\n if (\n (!discount.validFrom || new Date(discount.validFrom) < today) &&\n (!discount.validTo || new Date(discount.validTo) > today)\n ) {\n switch (discount.type) {\n case IDiscountType.Shipping: {\n value = deliveryPrice * -1;\n c.price = value;\n }\n break;\n }\n }\n return p + value;\n }, 0);\n console.log('afterTaxesDiscountPrice', afterTaxesDiscountPrice);\n // const totalDiscountPrice = subTotalDiscountPrice + afterTaxesDiscountPrice;\n const taxes = (subTotal + subTotalDiscountPrice) * 0.2;\n const total = subTotal + subTotalDiscountPrice + taxes + deliveryPrice + afterTaxesDiscountPrice;\n checkout.subTotal = subTotal;\n checkout.subTotalFull = subTotalFull;\n checkout.taxes = taxes;\n checkout.total = total;\n return checkout;\n}\n\nexport function checkoutUpdateHandler() {\n return apiHandler({\n options: async (request: NextApiRequest, response: NextApiResponse) => {\n response.status(200).end();\n },\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPartial>) => {\n const locale: string | undefined = request.query.locale as string;\n const market: string | undefined = request.query.market as string;\n const action: string = request.body.action;\n const checkout: ICheckoutPartial = request.body.checkout;\n const updatedCheckout = await updateCheckout(checkout, action, market, locale);\n response.status(200).json(updatedCheckout);\n },\n });\n}\n\nasync function getOrCreateAddress(address: IUserAddress | undefined, market: string, locale: string) {\n if (address) {\n if (address.id) {\n return address;\n }\n const result = await remoteApiPost<{ doc: IUserAddress }>(`/address?market=${market}&locale=${locale}`, {\n ...address,\n country: address.country ? address.country.id : undefined,\n region: address.region ? address.region.id : undefined,\n province: address.province ? address.province.id : undefined,\n });\n return result.doc;\n }\n return undefined;\n}\n\n/*\nasync function getOrCreateEndUser(user: Partial<IUser> | undefined, address: IUserAddress | undefined, market: string, locale: string) {\n if (user && user.id) {\n return user as IUser;\n }\n if (address && address.id) {\n const result = await remoteApiPost<{ doc: IUser }>(`/end_users?market=${market}&locale=${locale}`, {\n firstName: address.firstName,\n lastName: address.lastName,\n email: address.email,\n password: uuid(),\n roles: ['guest'],\n });\n return result.doc;\n }\n return undefined;\n}\n*/\n\n// submit\nexport function checkoutSubmitHandler<T>({\n Component,\n Layout,\n from = 'no-reply@mixer.com',\n bcc = 'lzampetti@gmail.com',\n}: {\n Component: IEmailComponent<T>;\n Layout: IEmailLayoutComponent;\n from?: string; // !!! todo override from app settings in send mail\n bcc?: string;\n}) {\n return apiHandler({\n options: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPaymentRedirect>) => {\n response.status(200).end();\n },\n post: async (request: NextApiRequest, response: NextApiResponse) => {\n try {\n const locale = request.query.locale as (string | undefined);\n const market = request.query.market as (string | undefined);\n if (!market || !locale) {\n return response.status(400).json({ message: 'Missing market or locale' });\n }\n const checkout: ICheckoutPartial = request.body;\n\n /*\n const origin = isDevelopment ? '' : getOrigin(request.headers);\n const layout = await getLayout(market, locale);\n const labelService = new LabelService(layout.labels);\n\n const subject = labelService.getLabel('shop.confirm.subject');\n const html = await renderEmail<ShopConfirmProps>({\n Component: ShopConfirm,\n Layout: LayoutDefault,\n origin,\n layout,\n props,\n preview: subject,\n // optInUrl: `${origin}/api/checkout/confirm/optin?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\n // optOutUrl: `${origin}/api/checkout/confirm/optout?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\n // viewOnWebUrl: `${origin}/api/checkout/confirm?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\n });\n\n const emailData: IActionEmailData[] = [{\n to: props.email,\n from,\n bcc,\n subject,\n html,\n }];\n\n if (storeStrategy !== StoreStrategy.Mock) {\n const action: IShopConfirmAction = {\n firstName: props.firstName,\n lastName: props.lastName,\n email: props.email,\n password: props.password,\n consentPreferences: Object.entries(props).filter(([k, v]) => ['privacy'].includes(k) && v === true).map(([k, v]) => k),\n emailData,\n };\n // console.log('action', action, process.env.STORE_API_KEY);\n const result = await remoteApiPost(`/order_action?market=${market}&locale=${locale}`, action);\n // console.log(result);\n response.status(200).json(result);\n } else {\n response.status(200).json(html);\n }\n */\n\n let shippingAddress: IUserAddress | undefined = undefined;\n let billingAddress: IUserAddress | undefined = undefined;\n if (storeStrategy !== StoreStrategy.Mock) {\n shippingAddress = await getOrCreateAddress(checkout.shippingAddress, market, locale);\n // console.log('shippingAddress', shippingAddress?.id);\n\n billingAddress = await getOrCreateAddress(checkout.billingAddress, market, locale);\n // console.log('billingAddress', billingAddress?.id);\n }\n /*\n const user: IUser | undefined = await getOrCreateEndUser(checkout.user, billingAddress || shippingAddress, market, locale);\n console.log('user', user?.id);\n */\n\n const action = {\n ...checkout,\n billingAddress: billingAddress ? billingAddress.id : undefined,\n delivery: checkout.delivery ? {\n delivery: checkout.delivery.id,\n price: checkout.delivery.price,\n fullPrice: checkout.delivery.fullPrice,\n } : undefined,\n discounts: (checkout.discounts || []).map(x => ({\n discount: x.discount.id,\n price: x.price,\n })),\n items: (checkout.items || []).map(x => ({\n article: x.article.id,\n price: x.price,\n fullPrice: x.fullPrice,\n qty: x.qty,\n })),\n payment: checkout.payment ? checkout.payment.id : undefined,\n shippingAddress: shippingAddress ? shippingAddress.id : undefined,\n retailer: checkout.retailer ? checkout.retailer.id : undefined,\n user: checkout.user ? checkout.user.id : undefined,\n tenant: checkout.tenant ? checkout.tenant.id : undefined,\n };\n\n const knownRoutes = await getRoutesForSchemas(['checkout_result'], market, locale);\n // !!! todo return payment redirectUrl\n\n // console.log('action', action, knownRoutes);\n\n if (storeStrategy !== StoreStrategy.Mock) {\n const result = await remoteApiPost<{ doc: IEntity }>(`/order?market=${market}&locale=${locale}`, action);\n const order = result.doc;\n // const order = await createOrder(checkout);\n // throw 'error';\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=${order.id}&status=OK`;\n const data = { redirectUrl };\n response.status(200).json(data);\n\n } else {\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=1&status=OK`;\n const data = { redirectUrl };\n response.status(200).json(data);\n\n }\n\n } catch (error) {\n response.status(400).json(error);\n }\n },\n });\n}\n\n// result\nexport async function paymentResult(checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPaymentRedirect> {\n console.log('paymentResult', checkout);\n const knownRoutes = await getRoutesForSchemas(['checkout_result'], market, locale);\n // !!! todo return payment redirectUrl\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=1&status=OK`;\n return { redirectUrl };\n}\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutDelivery } from '../checkout/checkout';\r\nimport { IDelivery } from './delivery';\r\n\r\nexport async function getDeliveries(params: QueryParams = {}): Promise<IDelivery[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.delivery!.findMany<IDelivery>(params);\r\n return items;\r\n}\r\n\r\nexport async function getDelivery(id: IEquatable, params: QueryParams = {}): Promise<IDelivery | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.delivery!.findOne<IDelivery>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getDeliveriesPagination(params: QueryParams = {}): Promise<IPaginationResult<IDelivery>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.delivery!.findPaged<IDelivery>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutDeliveryHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const items = await getDeliveries({\r\n market,\r\n locale,\r\n sort: 'createdAt',\r\n });\r\n /**\r\n * todo: calculate price based on checkout.items\r\n */\r\n const deliveries: ICheckoutDelivery[] = items.map(x => {\r\n const delivery = {\r\n ...x,\r\n delivery: x,\r\n price: 0,\r\n fullPrice: 0,\r\n };\r\n switch (x.id) {\r\n case 'in-store':\r\n delivery.price = 0;\r\n delivery.fullPrice = 0;\r\n break;\r\n case 'courier':\r\n delivery.price = 81;\r\n delivery.fullPrice = 81;\r\n break;\r\n case 'in-home':\r\n delivery.price = 156;\r\n delivery.fullPrice = 156;\r\n break;\r\n }\r\n return delivery;\r\n });\r\n response.status(200).json({ deliveries });\r\n },\r\n });\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutDiscount, ICheckoutPartial } from '../checkout/checkout';\r\nimport { updateCheckout } from '../checkout/checkout.service';\r\nimport { IDiscount, IDiscountType } from './discount';\r\n\r\nexport async function getDiscounts(params: QueryParams = {}): Promise<IDiscount[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.discount!.findMany<IDiscount>(params);\r\n return items;\r\n}\r\n\r\nexport async function getDiscount(id: IEquatable, params: QueryParams = {}): Promise<IDiscount | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.discount!.findOne<IDiscount>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getDiscountsPagination(params: QueryParams = {}): Promise<IPaginationResult<IDiscount>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.discount!.findPaged<IDiscount>(params);\r\n return pagination;\r\n}\r\n\r\n// discounts\r\nexport async function setDiscountCode(discountCode: string, checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPartial> {\r\n const discounts: ICheckoutDiscount[] = []; // checkout.discounts || [];\r\n const today = new Date();\r\n const discount = await getDiscount(discountCode, {\r\n market,\r\n locale,\r\n });\r\n console.log('discount', discount);\r\n if (discount &&\r\n (!discount.validFrom || new Date(discount.validFrom) < today) &&\r\n (!discount.validTo || new Date(discount.validTo) > today)\r\n ) {\r\n let price = 0;\r\n switch (discount.type) {\r\n case IDiscountType.Percent: {\r\n const total = (checkout.items || []).reduce((p, c) => p + c.price * c.qty, 0);\r\n price = Math.round(total * discount.value * -1) / 100;\r\n }\r\n break;\r\n case IDiscountType.Fixed:\r\n price = discount.value * -1;\r\n break;\r\n case IDiscountType.Shipping: {\r\n const delivery = checkout.delivery?.price || 0;\r\n price = delivery * -1;\r\n }\r\n break;\r\n }\r\n console.log('discount.price', price);\r\n discounts.push({\r\n discount,\r\n price,\r\n });\r\n }\r\n return await updateCheckout({ ...checkout, discounts }, 'discount', market, locale);\r\n}\r\n\r\nexport function checkoutDiscountHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPartial>) => {\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const discountCode = request.body.discountCode;\r\n const checkout = request.body.checkout;\r\n const updatedCheckout = await setDiscountCode(discountCode, checkout, market, locale);\r\n response.status(200).json(updatedCheckout);\r\n },\r\n });\r\n}\r\n","import { IEquatable, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { getRoutesForTemplates } from '@websolutespa/bom-mixer-models/server';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IOrderDetail } from './order';\r\n\r\nexport async function getOrders(params: QueryParams = {}): Promise<IOrderDetail[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.order!.findMany<IOrderDetail>(params);\r\n const { market, locale } = params;\r\n if (typeof market === 'string' && typeof locale === 'string') {\r\n const knownRoutes = await getRoutesForTemplates(['reserved_area_order_detail'], params.market, params.locale);\r\n return items.map(x => ({\r\n ...x,\r\n href: `${knownRoutes.reserved_area_order_detail}?orderId=${x.id}`,\r\n }));\r\n }\r\n return items;\r\n}\r\n\r\nexport async function getOrder(id: IEquatable, params: QueryParams = {}): Promise<IOrderDetail | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.order!.findOne<IOrderDetail>(id, params);\r\n if (item) {\r\n const { market, locale } = params;\r\n if (typeof market === 'string' && typeof locale === 'string') {\r\n const knownRoutes = await getRoutesForTemplates(['reserved_area_order_detail'], params.market, params.locale);\r\n return {\r\n ...item,\r\n href: `${knownRoutes.reserved_area_order_detail}?orderId=${item.id}`,\r\n };\r\n }\r\n }\r\n return item;\r\n}\r\n\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { IPayment } from './payment';\r\n\r\n// https://github.com/MultiSafepay/MultiSafepay-icons\r\n\r\nexport async function getPayments(params: QueryParams = {}): Promise<IPayment[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.payment!.findMany<IPayment>(params);\r\n return items;\r\n}\r\n\r\nexport async function getPayment(id: IEquatable, params: QueryParams = {}): Promise<IPayment | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.payment!.findOne<IPayment>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getPaymentsPagination(params: QueryParams = {}): Promise<IPaginationResult<IPayment>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.payment!.findPaged<IPayment>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutPaymentsHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<{ payments: IPayment[] }>) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const payments = await getPayments({\r\n market,\r\n locale,\r\n sort: 'createdAt',\r\n });\r\n response.status(200).json({ payments });\r\n },\r\n });\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { IRetailer } from './retailer';\r\n\r\nexport async function getRetailers(params: QueryParams = {}): Promise<IRetailer[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.retailer!.findMany<IRetailer>(params);\r\n return items;\r\n}\r\n\r\nexport async function getRetailer(id: IEquatable, params: QueryParams = {}): Promise<IRetailer | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.retailer!.findOne<IRetailer>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getRetailersPagination(params: QueryParams = {}): Promise<IPaginationResult<IRetailer>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.retailer!.findPaged<IRetailer>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutRetailersHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<{ retailers: IRetailer[] }>) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const retailers = await getRetailers({ market, locale });\r\n response.status(200).json({ retailers });\r\n },\r\n });\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.js","names":[],"sources":["../../src/models/article/article.service.ts","../../src/models/cart/cart.service.ts","../../src/models/checkout/checkout.service.ts","../../src/models/delivery/delivery.service.ts","../../src/models/discount/discount.service.ts","../../src/models/order/order.service.ts","../../src/models/payment/payment.service.ts","../../src/models/retailer/retailer.service.ts"],"sourcesContent":["import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IArticle } from './article';\r\n\r\nexport async function getArticles(params: QueryParams = {}): Promise<IArticle[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.article!.findMany<IArticle>(params);\r\n return items;\r\n}\r\n\r\nexport async function getArticle(id: IEquatable, params: QueryParams = {}): Promise<IArticle | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.article!.findOne<IArticle>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getArticlesPagination(params: QueryParams = {}): Promise<IPaginationResult<IArticle>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.article!.findPaged<IArticle>(params);\r\n return pagination;\r\n}\r\n","import { IEquatable } from '@websolutespa/bom-core';\r\nimport { getCurrentUser } from '@websolutespa/bom-mixer-auth/server';\r\nimport { apiHandler } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutItem } from '../checkout/checkout';\r\nimport { ICartItem } from './cart';\r\n\r\nexport async function getItems(items: ICartItem[], market: string, locale: string, user?: { id: IEquatable }): Promise<ICheckoutItem[]> {\r\n if (user) {\r\n // !!! todo calculate user discount price\r\n return items.map(x => ({ ...x, price: x.article.price * 0.9, fullPrice: x.article.price }));\r\n } else {\r\n return items.map(x => ({ ...x, price: x.article.price, fullPrice: x.article.price }));\r\n }\r\n}\r\n\r\nexport function checkoutItemsHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutItem[]>) => {\r\n const items = request.body.items;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const user = await getCurrentUser(request, response);\r\n /*\r\n if (!user) {\r\n return response.status(400);\r\n }\r\n */\r\n const data = await getItems(items, market, locale, user);\r\n return response.status(200).json(data);\r\n },\r\n });\r\n}\r\n","import { IEntity, IOption } from '@websolutespa/bom-core';\r\nimport { IUserAddress } from '@websolutespa/bom-mixer-auth';\r\nimport { IEmailComponent, IEmailLayoutComponent } from '@websolutespa/bom-mixer-emails';\r\nimport { getCountries, getProvinces, getRegions, getRoutesForSchemas } from '@websolutespa/bom-mixer-models/server';\r\nimport { remoteApiPost, StoreStrategy, storeStrategy } from '@websolutespa/bom-mixer-store';\r\nimport { apiHandler } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { IDiscountType } from '../discount/discount';\r\nimport { ICheckoutPartial, ICheckoutPaymentRedirect } from './checkout';\r\n\r\n// step 1. Items\r\n// step 2. Info\r\n// step 3. Deliveries\r\n// step 4. Stores\r\n// step 5. Payments\r\n// step 6. Confirm\r\n\r\nexport function checkoutInfoHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<{\r\n countries: IOption[],\r\n regions: IOption[],\r\n provinces: IOption[]\r\n }>) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const countries = await getCountries(locale) as IOption[];\r\n const provinces = await getProvinces(locale) as IOption[];\r\n const regions = await getRegions(locale) as IOption[];\r\n const data = { countries, regions, provinces };\r\n response.status(200).json(data);\r\n },\r\n });\r\n}\r\n\r\n// update\r\nexport async function updateCheckout(checkout: ICheckoutPartial, action: string, market: string, locale: string): Promise<ICheckoutPartial> {\r\n // generic checkout update\r\n switch (action) {\r\n case 'basket':\r\n break;\r\n case 'info':\r\n break;\r\n case 'delivery':\r\n checkout.delivery = checkout.delivery ? {\r\n ...checkout.delivery,\r\n delivery: {\r\n ...checkout.delivery,\r\n },\r\n } : undefined;\r\n break;\r\n case 'retailer':\r\n break;\r\n case 'discount':\r\n break;\r\n case 'payment':\r\n break;\r\n }\r\n // recalculate price\r\n const subTotal = checkout.items ? checkout.items.reduce((p, c) => {\r\n return p + c.price * c.qty;\r\n }, 0) : 0;\r\n const subTotalFull = checkout.items ? checkout.items.reduce((p, c) => {\r\n return p + c.fullPrice * c.qty;\r\n }, 0) : 0;\r\n const today = new Date();\r\n const subTotalDiscountPrice = (checkout.discounts || []).reduce((p, c) => {\r\n let value = 0;\r\n const discount = c.discount;\r\n if (\r\n (!discount.validFrom || new Date(discount.validFrom) < today)\r\n && (!discount.validTo || new Date(discount.validTo) > today)\r\n ) {\r\n switch (discount.type) {\r\n case IDiscountType.Percent: {\r\n value = Math.round(subTotal * discount.value * -1) / 100;\r\n c.price = value;\r\n }\r\n break;\r\n case IDiscountType.Fixed: {\r\n value = discount.value * -1;\r\n c.price = value;\r\n }\r\n break;\r\n }\r\n }\r\n return p + value;\r\n }, 0);\r\n console.log('subTotalDiscountPrice', subTotalDiscountPrice);\r\n const deliveryPrice = checkout.delivery?.price || 0;\r\n const afterTaxesDiscountPrice = (checkout.discounts || []).reduce((p, c) => {\r\n let value = 0;\r\n const discount = c.discount;\r\n if (\r\n (!discount.validFrom || new Date(discount.validFrom) < today) &&\r\n (!discount.validTo || new Date(discount.validTo) > today)\r\n ) {\r\n switch (discount.type) {\r\n case IDiscountType.Shipping: {\r\n value = deliveryPrice * -1;\r\n c.price = value;\r\n }\r\n break;\r\n }\r\n }\r\n return p + value;\r\n }, 0);\r\n console.log('afterTaxesDiscountPrice', afterTaxesDiscountPrice);\r\n // const totalDiscountPrice = subTotalDiscountPrice + afterTaxesDiscountPrice;\r\n const taxes = (subTotal + subTotalDiscountPrice) * 0.2;\r\n const total = subTotal + subTotalDiscountPrice + taxes + deliveryPrice + afterTaxesDiscountPrice;\r\n checkout.subTotal = subTotal;\r\n checkout.subTotalFull = subTotalFull;\r\n checkout.taxes = taxes;\r\n checkout.total = total;\r\n return checkout;\r\n}\r\n\r\nexport function checkoutUpdateHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPartial>) => {\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const action: string = request.body.action;\r\n const checkout: ICheckoutPartial = request.body.checkout;\r\n const updatedCheckout = await updateCheckout(checkout, action, market, locale);\r\n response.status(200).json(updatedCheckout);\r\n },\r\n });\r\n}\r\n\r\nasync function getOrCreateAddress(address: IUserAddress | undefined, market: string, locale: string) {\r\n if (address) {\r\n if (address.id) {\r\n return address;\r\n }\r\n const result = await remoteApiPost<{ doc: IUserAddress }>(`/address?market=${market}&locale=${locale}`, {\r\n ...address,\r\n country: address.country ? address.country.id : undefined,\r\n region: address.region ? address.region.id : undefined,\r\n province: address.province ? address.province.id : undefined,\r\n });\r\n return result.doc;\r\n }\r\n return undefined;\r\n}\r\n\r\n/*\r\nasync function getOrCreateEndUser(user: Partial<IUser> | undefined, address: IUserAddress | undefined, market: string, locale: string) {\r\n if (user && user.id) {\r\n return user as IUser;\r\n }\r\n if (address && address.id) {\r\n const result = await remoteApiPost<{ doc: IUser }>(`/end_users?market=${market}&locale=${locale}`, {\r\n firstName: address.firstName,\r\n lastName: address.lastName,\r\n email: address.email,\r\n password: uuid(),\r\n roles: ['guest'],\r\n });\r\n return result.doc;\r\n }\r\n return undefined;\r\n}\r\n*/\r\n\r\n// submit\r\nexport function checkoutSubmitHandler<T>({\r\n Component,\r\n Layout,\r\n from = 'no-reply@mixer.com',\r\n bcc = 'lzampetti@gmail.com',\r\n}: {\r\n Component: IEmailComponent<T>;\r\n Layout: IEmailLayoutComponent;\r\n from?: string; // !!! todo override from app settings in send mail\r\n bcc?: string;\r\n}) {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPaymentRedirect>) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const locale = request.query.locale as (string | undefined);\r\n const market = request.query.market as (string | undefined);\r\n if (!market || !locale) {\r\n return response.status(400).json({ message: 'Missing market or locale' });\r\n }\r\n const checkout: ICheckoutPartial = request.body;\r\n\r\n /*\r\n const origin = isDevelopment ? '' : getOrigin(request.headers);\r\n const layout = await getLayout(market, locale);\r\n const labelService = new LabelService(layout.labels);\r\n\r\n const subject = labelService.getLabel('shop.confirm.subject');\r\n const html = await renderEmail<ShopConfirmProps>({\r\n Component: ShopConfirm,\r\n Layout: LayoutDefault,\r\n origin,\r\n layout,\r\n props,\r\n preview: subject,\r\n // optInUrl: `${origin}/api/checkout/confirm/optin?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\r\n // optOutUrl: `${origin}/api/checkout/confirm/optout?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\r\n // viewOnWebUrl: `${origin}/api/checkout/confirm?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\r\n });\r\n\r\n const emailData: IActionEmailData[] = [{\r\n to: props.email,\r\n from,\r\n bcc,\r\n subject,\r\n html,\r\n }];\r\n\r\n if (storeStrategy !== StoreStrategy.Mock) {\r\n const action: IShopConfirmAction = {\r\n firstName: props.firstName,\r\n lastName: props.lastName,\r\n email: props.email,\r\n password: props.password,\r\n consentPreferences: Object.entries(props).filter(([k, v]) => ['privacy'].includes(k) && v === true).map(([k, v]) => k),\r\n emailData,\r\n };\r\n // console.log('action', action, process.env.STORE_API_KEY);\r\n const result = await remoteApiPost(`/order_action?market=${market}&locale=${locale}`, action);\r\n // console.log(result);\r\n response.status(200).json(result);\r\n } else {\r\n response.status(200).json(html);\r\n }\r\n */\r\n\r\n let shippingAddress: IUserAddress | undefined = undefined;\r\n let billingAddress: IUserAddress | undefined = undefined;\r\n if (storeStrategy !== StoreStrategy.Mock) {\r\n shippingAddress = await getOrCreateAddress(checkout.shippingAddress, market, locale);\r\n // console.log('shippingAddress', shippingAddress?.id);\r\n\r\n billingAddress = await getOrCreateAddress(checkout.billingAddress, market, locale);\r\n // console.log('billingAddress', billingAddress?.id);\r\n }\r\n /*\r\n const user: IUser | undefined = await getOrCreateEndUser(checkout.user, billingAddress || shippingAddress, market, locale);\r\n console.log('user', user?.id);\r\n */\r\n\r\n const action = {\r\n ...checkout,\r\n billingAddress: billingAddress ? billingAddress.id : undefined,\r\n delivery: checkout.delivery ? {\r\n delivery: checkout.delivery.id,\r\n price: checkout.delivery.price,\r\n fullPrice: checkout.delivery.fullPrice,\r\n } : undefined,\r\n discounts: (checkout.discounts || []).map(x => ({\r\n discount: x.discount.id,\r\n price: x.price,\r\n })),\r\n items: (checkout.items || []).map(x => ({\r\n article: x.article.id,\r\n price: x.price,\r\n fullPrice: x.fullPrice,\r\n qty: x.qty,\r\n })),\r\n payment: checkout.payment ? checkout.payment.id : undefined,\r\n shippingAddress: shippingAddress ? shippingAddress.id : undefined,\r\n retailer: checkout.retailer ? checkout.retailer.id : undefined,\r\n user: checkout.user ? checkout.user.id : undefined,\r\n tenant: checkout.tenant ? checkout.tenant.id : undefined,\r\n };\r\n\r\n const knownRoutes = await getRoutesForSchemas(['checkout_result'], market, locale);\r\n // !!! todo return payment redirectUrl\r\n\r\n // console.log('action', action, knownRoutes);\r\n\r\n if (storeStrategy !== StoreStrategy.Mock) {\r\n const result = await remoteApiPost<{ doc: IEntity }>(`/order?market=${market}&locale=${locale}`, action);\r\n const order = result.doc;\r\n // const order = await createOrder(checkout);\r\n // throw 'error';\r\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=${order.id}&status=OK`;\r\n const data = { redirectUrl };\r\n response.status(200).json(data);\r\n\r\n } else {\r\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=1&status=OK`;\r\n const data = { redirectUrl };\r\n response.status(200).json(data);\r\n\r\n }\r\n\r\n } catch (error) {\r\n response.status(400).json(error);\r\n }\r\n },\r\n });\r\n}\r\n\r\n// result\r\nexport async function paymentResult(checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPaymentRedirect> {\r\n console.log('paymentResult', checkout);\r\n const knownRoutes = await getRoutesForSchemas(['checkout_result'], market, locale);\r\n // !!! todo return payment redirectUrl\r\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=1&status=OK`;\r\n return { redirectUrl };\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutDelivery } from '../checkout/checkout';\r\nimport { IDelivery } from './delivery';\r\n\r\nexport async function getDeliveries(params: QueryParams = {}): Promise<IDelivery[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.delivery!.findMany<IDelivery>(params);\r\n return items;\r\n}\r\n\r\nexport async function getDelivery(id: IEquatable, params: QueryParams = {}): Promise<IDelivery | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.delivery!.findOne<IDelivery>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getDeliveriesPagination(params: QueryParams = {}): Promise<IPaginationResult<IDelivery>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.delivery!.findPaged<IDelivery>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutDeliveryHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const items = await getDeliveries({\r\n market,\r\n locale,\r\n sort: 'createdAt',\r\n });\r\n /**\r\n * todo: calculate price based on checkout.items\r\n */\r\n const deliveries: ICheckoutDelivery[] = items.map(x => {\r\n const delivery = {\r\n ...x,\r\n delivery: x,\r\n price: 0,\r\n fullPrice: 0,\r\n };\r\n switch (x.id) {\r\n case 'in-store':\r\n delivery.price = 0;\r\n delivery.fullPrice = 0;\r\n break;\r\n case 'courier':\r\n delivery.price = 81;\r\n delivery.fullPrice = 81;\r\n break;\r\n case 'in-home':\r\n delivery.price = 156;\r\n delivery.fullPrice = 156;\r\n break;\r\n }\r\n return delivery;\r\n });\r\n response.status(200).json({ deliveries });\r\n },\r\n });\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutDiscount, ICheckoutPartial } from '../checkout/checkout';\r\nimport { updateCheckout } from '../checkout/checkout.service';\r\nimport { IDiscount, IDiscountType } from './discount';\r\n\r\nexport async function getDiscounts(params: QueryParams = {}): Promise<IDiscount[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.discount!.findMany<IDiscount>(params);\r\n return items;\r\n}\r\n\r\nexport async function getDiscount(id: IEquatable, params: QueryParams = {}): Promise<IDiscount | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.discount!.findOne<IDiscount>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getDiscountsPagination(params: QueryParams = {}): Promise<IPaginationResult<IDiscount>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.discount!.findPaged<IDiscount>(params);\r\n return pagination;\r\n}\r\n\r\n// discounts\r\nexport async function setDiscountCode(discountCode: string, checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPartial> {\r\n const discounts: ICheckoutDiscount[] = []; // checkout.discounts || [];\r\n const today = new Date();\r\n const discount = await getDiscount(discountCode, {\r\n market,\r\n locale,\r\n });\r\n console.log('discount', discount);\r\n if (discount &&\r\n (!discount.validFrom || new Date(discount.validFrom) < today) &&\r\n (!discount.validTo || new Date(discount.validTo) > today)\r\n ) {\r\n let price = 0;\r\n switch (discount.type) {\r\n case IDiscountType.Percent: {\r\n const total = (checkout.items || []).reduce((p, c) => p + c.price * c.qty, 0);\r\n price = Math.round(total * discount.value * -1) / 100;\r\n }\r\n break;\r\n case IDiscountType.Fixed:\r\n price = discount.value * -1;\r\n break;\r\n case IDiscountType.Shipping: {\r\n const delivery = checkout.delivery?.price || 0;\r\n price = delivery * -1;\r\n }\r\n break;\r\n }\r\n console.log('discount.price', price);\r\n discounts.push({\r\n discount,\r\n price,\r\n });\r\n }\r\n return await updateCheckout({ ...checkout, discounts }, 'discount', market, locale);\r\n}\r\n\r\nexport function checkoutDiscountHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPartial>) => {\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const discountCode = request.body.discountCode;\r\n const checkout = request.body.checkout;\r\n const updatedCheckout = await setDiscountCode(discountCode, checkout, market, locale);\r\n response.status(200).json(updatedCheckout);\r\n },\r\n });\r\n}\r\n","import { IEquatable, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { getRoutesForTemplates } from '@websolutespa/bom-mixer-models/server';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IOrderDetail } from './order';\r\n\r\nexport async function getOrders(params: QueryParams = {}): Promise<IOrderDetail[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.order!.findMany<IOrderDetail>(params);\r\n const { market, locale } = params;\r\n if (typeof market === 'string' && typeof locale === 'string') {\r\n const knownRoutes = await getRoutesForTemplates(['reserved_area_order_detail'], params.market, params.locale);\r\n return items.map(x => ({\r\n ...x,\r\n href: `${knownRoutes.reserved_area_order_detail}?orderId=${x.id}`,\r\n }));\r\n }\r\n return items;\r\n}\r\n\r\nexport async function getOrder(id: IEquatable, params: QueryParams = {}): Promise<IOrderDetail | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.order!.findOne<IOrderDetail>(id, params);\r\n if (item) {\r\n const { market, locale } = params;\r\n if (typeof market === 'string' && typeof locale === 'string') {\r\n const knownRoutes = await getRoutesForTemplates(['reserved_area_order_detail'], params.market, params.locale);\r\n return {\r\n ...item,\r\n href: `${knownRoutes.reserved_area_order_detail}?orderId=${item.id}`,\r\n };\r\n }\r\n }\r\n return item;\r\n}\r\n\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { IPayment } from './payment';\r\n\r\n// https://github.com/MultiSafepay/MultiSafepay-icons\r\n\r\nexport async function getPayments(params: QueryParams = {}): Promise<IPayment[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.payment!.findMany<IPayment>(params);\r\n return items;\r\n}\r\n\r\nexport async function getPayment(id: IEquatable, params: QueryParams = {}): Promise<IPayment | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.payment!.findOne<IPayment>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getPaymentsPagination(params: QueryParams = {}): Promise<IPaginationResult<IPayment>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.payment!.findPaged<IPayment>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutPaymentsHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<{ payments: IPayment[] }>) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const payments = await getPayments({\r\n market,\r\n locale,\r\n sort: 'createdAt',\r\n });\r\n response.status(200).json({ payments });\r\n },\r\n });\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { IRetailer } from './retailer';\r\n\r\nexport async function getRetailers(params: QueryParams = {}): Promise<IRetailer[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.retailer!.findMany<IRetailer>(params);\r\n return items;\r\n}\r\n\r\nexport async function getRetailer(id: IEquatable, params: QueryParams = {}): Promise<IRetailer | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.retailer!.findOne<IRetailer>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getRetailersPagination(params: QueryParams = {}): Promise<IPaginationResult<IRetailer>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.retailer!.findPaged<IRetailer>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutRetailersHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<{ retailers: IRetailer[] }>) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const retailers = await getRetailers({ market, locale });\r\n response.status(200).json({ retailers });\r\n },\r\n });\r\n}\r\n"],"mappings":"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"}