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