Initial commit related to getAllPages

This commit is contained in:
amolnadagonde 2021-08-30 19:02:05 +05:30
parent 9e92abdda0
commit bb285ec67c
5 changed files with 135 additions and 23 deletions

View File

@ -1,6 +1,6 @@
import type { CommerceAPI, CommerceAPIConfig } from '@commerce/api' import type { CommerceAPI, CommerceAPIConfig } from '@commerce/api'
import { getCommerceApi as commerceApi } 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 getAllPages from './operations/get-all-pages'
import getPage from './operations/get-page' 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 getAllProducts from './operations/get-all-products'
import getProduct from './operations/get-product' import getProduct from './operations/get-product'
export interface KiboCommerceConfig extends CommerceAPIConfig {} export interface KiboCommerceConfig extends CommerceAPIConfig { }
const config: KiboCommerceConfig = { const config: KiboCommerceConfig = {
commerceUrl: process.env.KIBO_API_URL || '', commerceUrl: process.env.KIBO_API_URL || '',
apiToken: process.env.KIBO_API_TOKEN || '', apiToken: process.env.KIBO_API_TOKEN || '',
cartCookie: process.env.KIBO_CART_COOKIE || '', cartCookie: process.env.KIBO_CART_COOKIE || '',
customerCookie: process.env.KIBO_CUSTOMER_COOKIE || '', customerCookie: process.env.KIBO_CUSTOMER_COOKIE || '',
cartCookieMaxAge: 2592000, cartCookieMaxAge: 2592000,
fetch: createFetcher(() => getCommerceApi().getConfig()), fetch: createFetchGraphqlApi(() => getCommerceApi().getConfig()),
} }
const operations = { const operations = {
@ -35,7 +35,7 @@ export const provider = { config, operations }
export type KiboCommerceProvider = typeof provider export type KiboCommerceProvider = typeof provider
export type KiboCommerceAPI< export type KiboCommerceAPI<
P extends KiboCommerceProvider = KiboCommerceProvider P extends KiboCommerceProvider = KiboCommerceProvider
> = CommerceAPI<P | any> > = CommerceAPI<P | any>
export function getCommerceApi<P extends KiboCommerceProvider>( export function getCommerceApi<P extends KiboCommerceProvider>(
customProvider: P = provider as any customProvider: P = provider as any

View File

@ -1,19 +1,43 @@
export type Page = { url: string } import type { OperationContext } from '@commerce/api/operations'
export type GetAllPagesResult = { pages: Page[] } // import { QueryPagesArgs, PageCountableEdge } from '../../schema'
// import type { SaleorConfig, Provider } from '..'
// import * as Query from '../../utils/queries'
import type { KiboCommerceConfig } from '../index' import type { KiboCommerceConfig } from '../index'
import { documentListDocumentsQuery } from '../queries/getDocumentListDocuments'
export default function getAllPagesOperation() { export type Page = any
function getAllPages({
export type GetAllPagesResult<
T extends { pages: any[] } = { pages: Page[] }
> = T
export default function getAllPagesOperation({
commerce,
}: OperationContext<any>) {
async function getAllPages({
query = documentListDocumentsQuery,
config, config,
preview, variables,
}: { }: {
url?: string url?: string
config?: Partial<KiboCommerceConfig> config?: Partial<KiboCommerceConfig>
variables?: any
preview?: boolean preview?: boolean
}): Promise<GetAllPagesResult> { query?: string
return Promise.resolve({ } = {}): Promise<GetAllPagesResult> {
pages: [], 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 return getAllPages
} }

View File

@ -1,13 +1,54 @@
export type Page = any import type {
export type GetPageResult = { page?: Page } 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 = { export default function getPageOperation({
id: number commerce,
} }: OperationContext<KiboCommerceProvider>) {
async function getPage<T extends any>(opts: {
variables: any
config?: Partial<KiboCommerceConfig>
preview?: boolean
}): Promise<any>
export default function getPageOperation() { async function getPage<T extends any>(
function getPage(): Promise<GetPageResult> { opts: {
return Promise.resolve({}) variables: any
config?: Partial<KiboCommerceConfig>
preview?: boolean
} & OperationOptions
): Promise<any>
async function getPage<T extends any>({
url,
variables,
config,
preview,
}: {
url?: string
variables: any
config?: Partial<KiboCommerceConfig>
preview?: boolean
}): Promise<any> {
// 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 return getPage
} }

View File

@ -0,0 +1,11 @@
export const documentListDocumentsQuery = /* GraphQL */`
query {
documentListDocuments(documentListName:"siteSnippets@mozu"){
items {
id
name
listFQN
properties
}
}
}`;

View File

@ -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