From 470cbdc329dc2040daa65629ac3f2098b8ffa699 Mon Sep 17 00:00:00 2001 From: cond0r Date: Mon, 24 May 2021 09:40:50 +0300 Subject: [PATCH] Moved Page, AllPages & Site Info --- framework/shopify/api/index.ts | 56 +++++++++++++++---- .../shopify/api/operations/get-all-pages.ts | 31 ++++++++++ framework/shopify/api/operations/get-page.ts | 33 +++++++++++ .../shopify/api/operations/get-site-info.ts | 4 +- framework/shopify/api/operations/login.ts | 48 ++++++++++++++++ framework/shopify/common/get-all-pages.ts | 42 -------------- framework/shopify/common/get-page.ts | 37 ------------ framework/shopify/common/get-site-info.ts | 31 ---------- framework/shopify/types/login.ts | 4 +- 9 files changed, 159 insertions(+), 127 deletions(-) create mode 100644 framework/shopify/api/operations/get-all-pages.ts create mode 100644 framework/shopify/api/operations/get-page.ts create mode 100644 framework/shopify/api/operations/login.ts delete mode 100644 framework/shopify/common/get-all-pages.ts delete mode 100644 framework/shopify/common/get-page.ts delete mode 100644 framework/shopify/common/get-site-info.ts diff --git a/framework/shopify/api/index.ts b/framework/shopify/api/index.ts index 3d49ed8b5..897007348 100644 --- a/framework/shopify/api/index.ts +++ b/framework/shopify/api/index.ts @@ -2,20 +2,16 @@ import { CommerceAPI, CommerceAPIConfig, getCommerceApi as commerceApi, - getEndpoint, } from '@commerce/api' -import { - API_URL, - API_TOKEN, - SHOPIFY_CHECKOUT_ID_COOKIE, - SHOPIFY_CUSTOMER_TOKEN_COOKIE, -} from '../const' +import { API_URL, API_TOKEN, SHOPIFY_CUSTOMER_TOKEN_COOKIE } from '../const' 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 { NextApiHandler } from 'next' if (!API_URL) { throw new Error( @@ -32,8 +28,28 @@ export interface ShopifyConfig extends CommerceAPIConfig { applyLocale?: boolean } +export class Config { + private config: ShopifyConfig + + constructor(config: ShopifyConfig) { + this.config = config + } + + getConfig(userConfig: Partial = {}) { + return Object.entries(userConfig).reduce( + (cfg, [key, value]) => Object.assign(cfg, { [key]: value }), + { ...this.config } + ) + } + + setConfig(newConfig: Partial) { + Object.assign(this.config, newConfig) + } +} + const ONE_DAY = 60 * 60 * 24 -const config: ShopifyConfig = { + +const configJson: ShopifyConfig = { commerceUrl: API_URL, apiToken: API_TOKEN, customerCookie: SHOPIFY_CUSTOMER_TOKEN_COOKIE, @@ -43,11 +59,27 @@ const config: ShopifyConfig = { applyLocale: true, } +const config = new Config(configJson) + export const provider = { - config: config, - operations: { getSiteInfo }, + config: configJson, + operations: { getSiteInfo, getPage, getAllPages, login }, } export type Provider = typeof provider -export default provider +export type ShopifyAPI

= CommerceAPI

+ +export function getCommerceApi

( + customProvider: P = provider as any +): ShopifyAPI

{ + return commerceApi(customProvider) +} + +export function getConfig(userConfig?: Partial) { + return config.getConfig(userConfig) +} + +export function setConfig(newConfig: Partial) { + return config.setConfig(newConfig) +} diff --git a/framework/shopify/api/operations/get-all-pages.ts b/framework/shopify/api/operations/get-all-pages.ts new file mode 100644 index 000000000..353a3dda5 --- /dev/null +++ b/framework/shopify/api/operations/get-all-pages.ts @@ -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) { + async function getPage({ + query = getAllPagesQuery, + config, + }: { + query?: string + config?: ShopifyConfig + preview?: boolean + } = {}): Promise { + config = commerce.getConfig(config) + + const { data } = await config.fetch< + GetAllPagesQuery, + GetAllPagesQueryVariables + >(query) + + return { + pages: data.pages.edges, + } + } + + return getPage +} diff --git a/framework/shopify/api/operations/get-page.ts b/framework/shopify/api/operations/get-page.ts new file mode 100644 index 000000000..527b6930a --- /dev/null +++ b/framework/shopify/api/operations/get-page.ts @@ -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) { + async function getPage({ + query = getPageQuery, + config, + }: { + query?: string + config?: ShopifyConfig + preview?: boolean + } = {}): Promise { + config = commerce.getConfig(config) + + const { data } = await config.fetch( + query + ) + + if (data.node) { + return {} + } + + return {} + } + + return getPage +} diff --git a/framework/shopify/api/operations/get-site-info.ts b/framework/shopify/api/operations/get-site-info.ts index 4a9f41576..14238220c 100644 --- a/framework/shopify/api/operations/get-site-info.ts +++ b/framework/shopify/api/operations/get-site-info.ts @@ -1,7 +1,5 @@ import type { OperationContext } from '@commerce/api/operations' - import type { GetSiteInfoQuery } from '../../schema' - import type { ShopifyConfig, Provider } from '..' import { GetSiteInfoOperation } from '../../types/site' @@ -24,7 +22,7 @@ export default function getSiteInfoOperation({ const categories = await getCategories(config) const brands = await getVendors(config) - const { data } = await config.fetch(query) + // const { data } = await config.fetch(query) return { categories, diff --git a/framework/shopify/api/operations/login.ts b/framework/shopify/api/operations/login.ts new file mode 100644 index 000000000..41e837a3f --- /dev/null +++ b/framework/shopify/api/operations/login.ts @@ -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) { + async function login({ + query = customerAccessTokenCreateMutation, + variables, + config, + }: { + query?: string + variables: T['variables'] + res: ServerResponse + config?: ShopifyConfig + }): Promise { + config = commerce.getConfig(config) + + const { + data: { customerAccessTokenCreate }, + } = await config.fetch(query, { + variables, + }) + + throwUserErrors(customerAccessTokenCreate?.customerUserErrors) + + const customerAccessToken = customerAccessTokenCreate?.customerAccessToken + const accessToken = customerAccessToken?.accessToken + + if (accessToken) { + setCustomerToken(accessToken) + } + + return { + result: customerAccessToken?.accessToken, + } + } + + return login +} diff --git a/framework/shopify/common/get-all-pages.ts b/framework/shopify/common/get-all-pages.ts deleted file mode 100644 index 54231ed03..000000000 --- a/framework/shopify/common/get-all-pages.ts +++ /dev/null @@ -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 => { - 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 diff --git a/framework/shopify/common/get-page.ts b/framework/shopify/common/get-page.ts deleted file mode 100644 index be934aa42..000000000 --- a/framework/shopify/common/get-page.ts +++ /dev/null @@ -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 - -const getPage = async (options: { - variables: Variables - config: ShopifyConfig - preview?: boolean -}): Promise => { - 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 diff --git a/framework/shopify/common/get-site-info.ts b/framework/shopify/common/get-site-info.ts deleted file mode 100644 index cbbacf5b6..000000000 --- a/framework/shopify/common/get-site-info.ts +++ /dev/null @@ -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 => { - let { config } = options ?? {} - - config = getConfig(config) - - const categories = await getCategories(config) - const brands = await getVendors(config) - - return { - categories, - brands, - } -} - -export default getSiteInfo diff --git a/framework/shopify/types/login.ts b/framework/shopify/types/login.ts index 24d5077ff..964ac89e2 100644 --- a/framework/shopify/types/login.ts +++ b/framework/shopify/types/login.ts @@ -1,8 +1,8 @@ import * as Core from '@commerce/types/login' -import type { LoginMutationVariables } from '../schema' +import type { CustomerAccessTokenCreateInput } from '../schema' export * from '@commerce/types/login' export type LoginOperation = Core.LoginOperation & { - variables: LoginMutationVariables + variables: CustomerAccessTokenCreateInput }