Moved Page, AllPages & Site Info

This commit is contained in:
cond0r 2021-05-24 09:40:50 +03:00
parent 184d1ca0f2
commit 470cbdc329
9 changed files with 159 additions and 127 deletions

View File

@ -2,20 +2,16 @@ import {
CommerceAPI, CommerceAPI,
CommerceAPIConfig, CommerceAPIConfig,
getCommerceApi as commerceApi, getCommerceApi as commerceApi,
getEndpoint,
} from '@commerce/api' } from '@commerce/api'
import { import { API_URL, API_TOKEN, SHOPIFY_CUSTOMER_TOKEN_COOKIE } from '../const'
API_URL,
API_TOKEN,
SHOPIFY_CHECKOUT_ID_COOKIE,
SHOPIFY_CUSTOMER_TOKEN_COOKIE,
} from '../const'
import fetchGraphqlApi from './utils/fetch-graphql-api' import fetchGraphqlApi from './utils/fetch-graphql-api'
import login from './operations/login'
import getAllPages from './operations/get-all-pages'
import getPage from './operations/get-page'
import getSiteInfo from './operations/get-site-info' import getSiteInfo from './operations/get-site-info'
import { NextApiHandler } from 'next'
if (!API_URL) { if (!API_URL) {
throw new Error( throw new Error(
@ -32,8 +28,28 @@ export interface ShopifyConfig extends CommerceAPIConfig {
applyLocale?: boolean applyLocale?: boolean
} }
export class Config {
private config: ShopifyConfig
constructor(config: ShopifyConfig) {
this.config = config
}
getConfig(userConfig: Partial<ShopifyConfig> = {}) {
return Object.entries(userConfig).reduce<ShopifyConfig>(
(cfg, [key, value]) => Object.assign(cfg, { [key]: value }),
{ ...this.config }
)
}
setConfig(newConfig: Partial<ShopifyConfig>) {
Object.assign(this.config, newConfig)
}
}
const ONE_DAY = 60 * 60 * 24 const ONE_DAY = 60 * 60 * 24
const config: ShopifyConfig = {
const configJson: ShopifyConfig = {
commerceUrl: API_URL, commerceUrl: API_URL,
apiToken: API_TOKEN, apiToken: API_TOKEN,
customerCookie: SHOPIFY_CUSTOMER_TOKEN_COOKIE, customerCookie: SHOPIFY_CUSTOMER_TOKEN_COOKIE,
@ -43,11 +59,27 @@ const config: ShopifyConfig = {
applyLocale: true, applyLocale: true,
} }
const config = new Config(configJson)
export const provider = { export const provider = {
config: config, config: configJson,
operations: { getSiteInfo }, operations: { getSiteInfo, getPage, getAllPages, login },
} }
export type Provider = typeof provider export type Provider = typeof provider
export default provider export type ShopifyAPI<P extends Provider = Provider> = CommerceAPI<P>
export function getCommerceApi<P extends Provider>(
customProvider: P = provider as any
): ShopifyAPI<P> {
return commerceApi(customProvider)
}
export function getConfig(userConfig?: Partial<ShopifyConfig>) {
return config.getConfig(userConfig)
}
export function setConfig(newConfig: Partial<ShopifyConfig>) {
return config.setConfig(newConfig)
}

View File

@ -0,0 +1,31 @@
import type { OperationContext } from '@commerce/api/operations'
import { GetAllPagesQuery, GetAllPagesQueryVariables } from '@framework/schema'
import type { ShopifyConfig, Provider } from '..'
import { GetAllPagesOperation } from '../../types/page'
import getAllPagesQuery from '../../utils/queries/get-all-pages-query'
export default function getSiteInfoOperation({
commerce,
}: OperationContext<Provider>) {
async function getPage<T extends GetAllPagesOperation>({
query = getAllPagesQuery,
config,
}: {
query?: string
config?: ShopifyConfig
preview?: boolean
} = {}): Promise<T['data']> {
config = commerce.getConfig(config)
const { data } = await config.fetch<
GetAllPagesQuery,
GetAllPagesQueryVariables
>(query)
return {
pages: data.pages.edges,
}
}
return getPage
}

View File

@ -0,0 +1,33 @@
import type { OperationContext } from '@commerce/api/operations'
import type { ShopifyConfig, Provider } from '..'
import { GetPageQuery, GetPageQueryVariables, Page } from '../../schema'
import { GetPageOperation } from '../../types/page'
import getPageQuery from '../../utils/queries/get-page-query'
export default function getSiteInfoOperation({
commerce,
}: OperationContext<Provider>) {
async function getPage<T extends GetPageOperation>({
query = getPageQuery,
config,
}: {
query?: string
config?: ShopifyConfig
preview?: boolean
} = {}): Promise<T['data']> {
config = commerce.getConfig(config)
const { data } = await config.fetch<GetPageQuery, GetPageQueryVariables>(
query
)
if (data.node) {
return {}
}
return {}
}
return getPage
}

View File

@ -1,7 +1,5 @@
import type { OperationContext } from '@commerce/api/operations' import type { OperationContext } from '@commerce/api/operations'
import type { GetSiteInfoQuery } from '../../schema' import type { GetSiteInfoQuery } from '../../schema'
import type { ShopifyConfig, Provider } from '..' import type { ShopifyConfig, Provider } from '..'
import { GetSiteInfoOperation } from '../../types/site' import { GetSiteInfoOperation } from '../../types/site'
@ -24,7 +22,7 @@ export default function getSiteInfoOperation({
const categories = await getCategories(config) const categories = await getCategories(config)
const brands = await getVendors(config) const brands = await getVendors(config)
const { data } = await config.fetch<GetSiteInfoQuery>(query) // const { data } = await config.fetch<GetSiteInfoQuery>(query)
return { return {
categories, categories,

View File

@ -0,0 +1,48 @@
import type { ServerResponse } from 'http'
import type { OperationContext } from '@commerce/api/operations'
import type { LoginOperation } from '../../types/login'
import type { ShopifyConfig, Provider } from '..'
import {
customerAccessTokenCreateMutation,
setCustomerToken,
throwUserErrors,
} from '../../utils'
import { CustomerAccessTokenCreateMutation } from '../../schema'
export default function loginOperation({
commerce,
}: OperationContext<Provider>) {
async function login<T extends LoginOperation>({
query = customerAccessTokenCreateMutation,
variables,
config,
}: {
query?: string
variables: T['variables']
res: ServerResponse
config?: ShopifyConfig
}): Promise<T['data']> {
config = commerce.getConfig(config)
const {
data: { customerAccessTokenCreate },
} = await config.fetch<CustomerAccessTokenCreateMutation>(query, {
variables,
})
throwUserErrors(customerAccessTokenCreate?.customerUserErrors)
const customerAccessToken = customerAccessTokenCreate?.customerAccessToken
const accessToken = customerAccessToken?.accessToken
if (accessToken) {
setCustomerToken(accessToken)
}
return {
result: customerAccessToken?.accessToken,
}
}
return login
}

View File

@ -1,42 +0,0 @@
import { getConfig, ShopifyConfig } from '../api'
import { PageEdge } from '../schema'
import { getAllPagesQuery } from '../utils/queries'
type Variables = {
first?: number
}
type ReturnType = {
pages: Page[]
}
export type Page = {
id: string
name: string
url: string
sort_order?: number
body: string
}
const getAllPages = async (options?: {
variables?: Variables
config: ShopifyConfig
preview?: boolean
}): Promise<ReturnType> => {
let { config, variables = { first: 250 } } = options ?? {}
config = getConfig(config)
const { locale } = config
const { data } = await config.fetch(getAllPagesQuery, { variables })
const pages = data.pages?.edges?.map(
({ node: { title: name, handle, ...node } }: PageEdge) => ({
...node,
url: `/${locale}/${handle}`,
name,
})
)
return { pages }
}
export default getAllPages

View File

@ -1,37 +0,0 @@
import { getConfig, ShopifyConfig } from '../api'
import getPageQuery from '../utils/queries/get-page-query'
import { Page } from './get-all-pages'
type Variables = {
id: string
}
export type GetPageResult<T extends { page?: any } = { page?: Page }> = T
const getPage = async (options: {
variables: Variables
config: ShopifyConfig
preview?: boolean
}): Promise<GetPageResult> => {
let { config, variables } = options ?? {}
config = getConfig(config)
const { locale } = config
const { data } = await config.fetch(getPageQuery, {
variables,
})
const page = data.node
return {
page: page
? {
...page,
name: page.title,
url: `/${locale}/${page.handle}`,
}
: null,
}
}
export default getPage

View File

@ -1,31 +0,0 @@
import getCategories, { Category } from '../utils/get-categories'
import getVendors, { Brands } from '../utils/get-vendors'
import { getConfig, ShopifyConfig } from '../api'
export type GetSiteInfoResult<
T extends { categories: any[]; brands: any[] } = {
categories: Category[]
brands: Brands
}
> = T
const getSiteInfo = async (options?: {
variables?: any
config: ShopifyConfig
preview?: boolean
}): Promise<GetSiteInfoResult> => {
let { config } = options ?? {}
config = getConfig(config)
const categories = await getCategories(config)
const brands = await getVendors(config)
return {
categories,
brands,
}
}
export default getSiteInfo

View File

@ -1,8 +1,8 @@
import * as Core from '@commerce/types/login' import * as Core from '@commerce/types/login'
import type { LoginMutationVariables } from '../schema' import type { CustomerAccessTokenCreateInput } from '../schema'
export * from '@commerce/types/login' export * from '@commerce/types/login'
export type LoginOperation = Core.LoginOperation & { export type LoginOperation = Core.LoginOperation & {
variables: LoginMutationVariables variables: CustomerAccessTokenCreateInput
} }