diff --git a/framework/kibocommerce/api/index.ts b/framework/kibocommerce/api/index.ts
index 3999d6b48..857bc3ae8 100644
--- a/framework/kibocommerce/api/index.ts
+++ b/framework/kibocommerce/api/index.ts
@@ -1,6 +1,6 @@
import type { CommerceAPI, CommerceAPIConfig } from '@commerce/api'
import { getCommerceApi as commerceApi } from '@commerce/api'
-import createFetcher from './utils/fetch-local'
+import createFetchGraphqlApi from "../api/utils/fetch-graphql-api"
import getAllPages from './operations/get-all-pages'
import getPage from './operations/get-page'
@@ -10,14 +10,14 @@ import getAllProductPaths from './operations/get-all-product-paths'
import getAllProducts from './operations/get-all-products'
import getProduct from './operations/get-product'
-export interface KiboCommerceConfig extends CommerceAPIConfig {}
+export interface KiboCommerceConfig extends CommerceAPIConfig { }
const config: KiboCommerceConfig = {
commerceUrl: process.env.KIBO_API_URL || '',
apiToken: process.env.KIBO_API_TOKEN || '',
cartCookie: process.env.KIBO_CART_COOKIE || '',
customerCookie: process.env.KIBO_CUSTOMER_COOKIE || '',
cartCookieMaxAge: 2592000,
- fetch: createFetcher(() => getCommerceApi().getConfig()),
+ fetch: createFetchGraphqlApi(() => getCommerceApi().getConfig()),
}
const operations = {
@@ -35,7 +35,7 @@ export const provider = { config, operations }
export type KiboCommerceProvider = typeof provider
export type KiboCommerceAPI<
P extends KiboCommerceProvider = KiboCommerceProvider
-> = CommerceAPI
+ > = CommerceAPI
export function getCommerceApi
(
customProvider: P = provider as any
diff --git a/framework/kibocommerce/api/operations/get-all-pages.ts b/framework/kibocommerce/api/operations/get-all-pages.ts
index 7d14893b2..2e7788f82 100644
--- a/framework/kibocommerce/api/operations/get-all-pages.ts
+++ b/framework/kibocommerce/api/operations/get-all-pages.ts
@@ -1,19 +1,43 @@
-export type Page = { url: string }
-export type GetAllPagesResult = { pages: Page[] }
+import type { OperationContext } from '@commerce/api/operations'
+// import { QueryPagesArgs, PageCountableEdge } from '../../schema'
+// import type { SaleorConfig, Provider } from '..'
+// import * as Query from '../../utils/queries'
import type { KiboCommerceConfig } from '../index'
+import { documentListDocumentsQuery } from '../queries/getDocumentListDocuments'
-export default function getAllPagesOperation() {
- function getAllPages({
+export type Page = any
+
+export type GetAllPagesResult<
+ T extends { pages: any[] } = { pages: Page[] }
+ > = T
+
+export default function getAllPagesOperation({
+ commerce,
+}: OperationContext) {
+
+ async function getAllPages({
+ query = documentListDocumentsQuery,
config,
- preview,
+ variables,
}: {
url?: string
config?: Partial
+ variables?: any
preview?: boolean
- }): Promise {
- return Promise.resolve({
- pages: [],
- })
+ query?: string
+ } = {}): Promise {
+ const cfg = commerce.getConfig(config)
+ const { data } = await cfg.fetch(query);
+
+ const pages = data.documentListDocuments.items.map((page: any) => {
+ return {
+ name: page.name.charAt(0).toUpperCase() + page.name.slice(1),
+ url: page.properties.url.split('/')[1],
+ }
+ });
+
+ return { pages }
}
+
return getAllPages
-}
+}
\ No newline at end of file
diff --git a/framework/kibocommerce/api/operations/get-page.ts b/framework/kibocommerce/api/operations/get-page.ts
index b0cfdf58f..db757b575 100644
--- a/framework/kibocommerce/api/operations/get-page.ts
+++ b/framework/kibocommerce/api/operations/get-page.ts
@@ -1,13 +1,54 @@
-export type Page = any
-export type GetPageResult = { page?: Page }
+import type {
+ OperationContext,
+ OperationOptions,
+} from '@commerce/api/operations'
+// import type { GetPageOperation, Page } from '../../types/page'
+// import type { RecursivePartial, RecursiveRequired } from '../utils/types'
+import type { KiboCommerceConfig, KiboCommerceProvider } from '..'
+import { normalizePage } from '../../../bigcommerce/lib/normalize'
-export type PageVariables = {
- id: number
-}
+export default function getPageOperation({
+ commerce,
+}: OperationContext) {
+ async function getPage(opts: {
+ variables: any
+ config?: Partial
+ preview?: boolean
+ }): Promise
-export default function getPageOperation() {
- function getPage(): Promise {
- return Promise.resolve({})
+ async function getPage(
+ opts: {
+ variables: any
+ config?: Partial
+ preview?: boolean
+ } & OperationOptions
+ ): Promise
+
+ async function getPage({
+ url,
+ variables,
+ config,
+ preview,
+ }: {
+ url?: string
+ variables: any
+ config?: Partial
+ preview?: boolean
+ }): Promise {
+ // RecursivePartial forces the method to check for every prop in the data, which is
+ // required in case there's a custom `url`
+ const cfg = commerce.getConfig(config)
+ const { data } = await cfg.fetch<
+ any
+ >(url || `/v3/content/pages?id=${variables.id}&include=body`)
+ const firstPage = data?.[0]
+ const page = firstPage as any
+
+ if (preview || page?.is_visible) {
+ return { page: normalizePage(page as any) }
+ }
+ return {}
}
+
return getPage
-}
+}
\ No newline at end of file
diff --git a/framework/kibocommerce/api/queries/getDocumentListDocuments/index.ts b/framework/kibocommerce/api/queries/getDocumentListDocuments/index.ts
new file mode 100644
index 000000000..9b751d913
--- /dev/null
+++ b/framework/kibocommerce/api/queries/getDocumentListDocuments/index.ts
@@ -0,0 +1,11 @@
+export const documentListDocumentsQuery = /* GraphQL */`
+query {
+ documentListDocuments(documentListName:"siteSnippets@mozu"){
+ items {
+ id
+ name
+ listFQN
+ properties
+ }
+ }
+ }`;
\ No newline at end of file
diff --git a/framework/kibocommerce/api/utils/fetch-graphql-api.ts b/framework/kibocommerce/api/utils/fetch-graphql-api.ts
new file mode 100644
index 000000000..f7ee9182c
--- /dev/null
+++ b/framework/kibocommerce/api/utils/fetch-graphql-api.ts
@@ -0,0 +1,36 @@
+import { FetcherError } from '@commerce/utils/errors'
+import type { GraphQLFetcher } from '@commerce/api'
+import type { KiboCommerceConfig } from '../index'
+import fetch from './fetch'
+
+const fetchGraphqlApi: (getConfig: () => KiboCommerceConfig) => GraphQLFetcher =
+ (getConfig) =>
+ async (query: string, { variables, preview } = {}, fetchOptions) => {
+ // log.warn(query)
+ const config = getConfig()
+ const res = await fetch(config.commerceUrl + (preview ? '/preview' : ''), {
+ ...fetchOptions,
+ method: 'POST',
+ headers: {
+ Authorization: `Bearer ${config.apiToken}`,
+ ...fetchOptions?.headers,
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ query,
+ variables,
+ }),
+ })
+
+ const json = await res.json()
+ if (json.errors) {
+ throw new FetcherError({
+ errors: json.errors ?? [{ message: 'Failed to fetch KiboCommerce API' }],
+ status: res.status,
+ })
+ }
+
+ return { data: json.data, res }
+ }
+
+export default fetchGraphqlApi