Skip to content
This repository was archived by the owner on Feb 27, 2024. It is now read-only.

Commit d9a498b

Browse files
committed
Abstract post type query handling
1 parent f3c4074 commit d9a498b

File tree

2 files changed

+99
-77
lines changed

2 files changed

+99
-77
lines changed
Lines changed: 2 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
import queryPostById from '../posts/queryPostById'
2-
import {initializeWpApollo, createWpApolloClient} from '../connector'
32
import queryPageById from '../pages/queryPageById'
43
import {isHierarchicalPostType} from './postTypes'
5-
import formatBlockData from '@/functions/formatBlockData'
64
import queryEventById from '../events/queryEventById'
75
import queryCareerById from '../careers/queryCareerById'
86
import queryServiceById from '../services/queryServiceById'
97
import queryTeamById from '../teams/queryTeamById'
108
import queryPortfolioById from '../portfolios/queryPortfolioById'
119
import queryTestimonialById from '../testimonials/queryTestimonialById'
12-
import formatDefaultSeoData from '@/functions/formatDefaultSeoData'
13-
import getMenus from '../menus/getMenus'
10+
import processPostTypeQuery from './processPostTypeQuery'
1411

1512
/**
1613
* Retrieve single post by specified identifier.
@@ -49,77 +46,5 @@ export default async function getPostTypeById(
4946
// Retrieve post type query.
5047
const query = postTypeQuery?.[postType] ?? null
5148

52-
// Get/create Apollo instance.
53-
const apolloClient = preview
54-
? createWpApolloClient(true)
55-
: initializeWpApollo()
56-
57-
// Set up return object.
58-
const response = {
59-
apolloClient,
60-
error: false,
61-
errorMessage: null
62-
}
63-
64-
// If no query is set for given post type, return error message.
65-
if (!query) {
66-
return {
67-
apolloClient,
68-
error: true,
69-
errorMessage: `Post type \`${postType}\` is not supported.`
70-
}
71-
}
72-
73-
// Execute query.
74-
response.post = await apolloClient
75-
.query({query, variables: {id, idType}})
76-
.then((res) => {
77-
const {homepageSettings, siteSeo, menus, ...postData} = res.data
78-
79-
// Retrieve menus.
80-
response.menus = getMenus(menus)
81-
82-
// Retrieve default SEO data.
83-
response.defaultSeo = formatDefaultSeoData({homepageSettings, siteSeo})
84-
85-
const post = postData?.[postType]
86-
87-
// Set error props if data not found.
88-
if (!post) {
89-
response.error = true
90-
response.errorMessage = `An error occurred while trying to retrieve data for ${postType} "${id}."`
91-
92-
return null
93-
}
94-
95-
return post
96-
})
97-
.then(async (post) => {
98-
// Add slug/ID to post.
99-
const newPost = {
100-
...post,
101-
slug: id
102-
}
103-
104-
if ('basic' === preview || !post || !post?.blocksJSON) {
105-
return post
106-
}
107-
108-
// Handle blocks.
109-
newPost.blocks = await formatBlockData(
110-
JSON.parse(newPost.blocksJSON) ?? []
111-
)
112-
113-
delete newPost.blocksJSON
114-
115-
return newPost
116-
})
117-
.catch((error) => {
118-
response.error = true
119-
response.errorMessage = error.message
120-
121-
return null
122-
})
123-
124-
return response
49+
return processPostTypeQuery(postType, id, query, {id, idType}, preview)
12550
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import {initializeWpApollo, createWpApolloClient} from '../connector'
2+
import formatBlockData from '@/functions/formatBlockData'
3+
import formatDefaultSeoData from '@/functions/formatDefaultSeoData'
4+
import getMenus from '../menus/getMenus'
5+
6+
/**
7+
* Retrieve single post.
8+
*
9+
* @author WebDevStudios
10+
* @param {string} postType WP post type.
11+
* @param {number | string} id Post identifier.
12+
* @param {object} query Post retrieval query.
13+
* @param {object} variables Query variables.
14+
* @param {string} preview Whether query is for a regular post view (null), a preview check (basic), or full post preview (full).
15+
* @return {object} Object containing Apollo client instance and post data or error object.
16+
*/
17+
export default async function processPostTypeQuery(
18+
postType,
19+
id,
20+
query,
21+
variables = {},
22+
preview = null
23+
) {
24+
// Get/create Apollo instance.
25+
const apolloClient = preview
26+
? createWpApolloClient(true)
27+
: initializeWpApollo()
28+
29+
// Set up return object.
30+
const response = {
31+
apolloClient,
32+
error: false,
33+
errorMessage: null
34+
}
35+
36+
// If no query is set for given post type, return error message.
37+
if (!query) {
38+
return {
39+
apolloClient,
40+
error: true,
41+
errorMessage: `Post type \`${postType}\` is not supported.`
42+
}
43+
}
44+
45+
// Execute query.
46+
response.post = await apolloClient
47+
.query({query, variables})
48+
.then((res) => {
49+
const {homepageSettings, siteSeo, menus, ...postData} = res.data
50+
51+
// Retrieve menus.
52+
response.menus = getMenus(menus)
53+
54+
// Retrieve default SEO data.
55+
response.defaultSeo = formatDefaultSeoData({homepageSettings, siteSeo})
56+
57+
const post = postData?.[postType]
58+
59+
// Set error props if data not found.
60+
if (!post) {
61+
response.error = true
62+
response.errorMessage = `An error occurred while trying to retrieve data for ${postType} "${id}."`
63+
64+
return null
65+
}
66+
67+
return post
68+
})
69+
.then(async (post) => {
70+
// Add slug/ID to post.
71+
const newPost = {
72+
...post,
73+
slug: id
74+
}
75+
76+
if ('basic' === preview || !post || !post?.blocksJSON) {
77+
return post
78+
}
79+
80+
// Handle blocks.
81+
newPost.blocks = await formatBlockData(
82+
JSON.parse(newPost.blocksJSON) ?? []
83+
)
84+
85+
delete newPost.blocksJSON
86+
87+
return newPost
88+
})
89+
.catch((error) => {
90+
response.error = true
91+
response.errorMessage = error.message
92+
93+
return null
94+
})
95+
96+
return response
97+
}

0 commit comments

Comments
 (0)