aboutsummaryrefslogtreecommitdiffstats
path: root/src/services
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2021-12-15 18:18:49 +0100
committerArmand Philippot <git@armandphilippot.com>2021-12-15 18:18:49 +0100
commit102121498b45ef221191401f6216260f072f78a9 (patch)
treefb9ef1e648929b24bdbeefc719b5831458ef1a4b /src/services
parent0bc323a777a607090af87636026f668104cf8a0c (diff)
chore: create single post view
Diffstat (limited to 'src/services')
-rw-r--r--src/services/graphql/blog.ts33
-rw-r--r--src/services/graphql/post.ts136
2 files changed, 165 insertions, 4 deletions
diff --git a/src/services/graphql/blog.ts b/src/services/graphql/blog.ts
index 1cfdd44..127eb1e 100644
--- a/src/services/graphql/blog.ts
+++ b/src/services/graphql/blog.ts
@@ -1,13 +1,15 @@
import { ArticlePreview } from '@ts/types/articles';
import {
- fetchPostsListReturn,
- getPostsListReturn,
+ AllPostsSlugReponse,
+ FetchAllPostsSlugReturn,
+ FetchPostsListReturn,
+ GetPostsListReturn,
PostsListResponse,
} from '@ts/types/blog';
import { gql } from 'graphql-request';
import { getGraphQLClient } from './client';
-export const fetchPublishedPosts: fetchPostsListReturn = async (
+export const fetchPublishedPosts: FetchPostsListReturn = async (
first = 10,
after = ''
) => {
@@ -85,7 +87,7 @@ export const fetchPublishedPosts: fetchPostsListReturn = async (
}
};
-export const getPublishedPosts: getPostsListReturn = async ({
+export const getPublishedPosts: GetPostsListReturn = async ({
first = 10,
after = '',
}) => {
@@ -128,3 +130,26 @@ export const getPublishedPosts: getPostsListReturn = async ({
return { posts: postsList, pageInfo: rawPostsList.posts.pageInfo };
};
+
+export const fetchAllPostsSlug: FetchAllPostsSlugReturn = async () => {
+ const client = getGraphQLClient();
+
+ // 10 000 is an arbitrary number for small websites.
+ const query = gql`
+ query AllPostsSlug {
+ posts(first: 10000) {
+ nodes {
+ slug
+ }
+ }
+ }
+ `;
+
+ try {
+ const response: AllPostsSlugReponse = await client.request(query);
+ return response.posts.nodes;
+ } catch (error) {
+ console.error(JSON.stringify(error, undefined, 2));
+ process.exit(1);
+ }
+};
diff --git a/src/services/graphql/post.ts b/src/services/graphql/post.ts
new file mode 100644
index 0000000..c7144fc
--- /dev/null
+++ b/src/services/graphql/post.ts
@@ -0,0 +1,136 @@
+import {
+ Article,
+ FetchPostByReturn,
+ GetPostByReturn,
+ PostByResponse,
+} from '@ts/types/articles';
+import { gql } from 'graphql-request';
+import { getGraphQLClient } from './client';
+
+const fetchPostBySlug: FetchPostByReturn = async (slug: string) => {
+ const client = getGraphQLClient();
+ const query = gql`
+ query PostBySlug($slug: String!) {
+ postBy(slug: $slug) {
+ acfPosts {
+ postsInSubject {
+ ... on Subject {
+ id
+ featuredImage {
+ node {
+ altText
+ sourceUrl
+ title
+ }
+ }
+ slug
+ title
+ }
+ }
+ postsInThematic {
+ ... on Thematic {
+ id
+ slug
+ title
+ }
+ }
+ }
+ commentCount
+ comments {
+ nodes {
+ approved
+ author {
+ node {
+ gravatarUrl
+ name
+ url
+ }
+ }
+ commentId
+ content
+ date
+ id
+ parentDatabaseId
+ parentId
+ }
+ }
+ contentParts {
+ afterMore
+ beforeMore
+ }
+ date
+ featuredImage {
+ node {
+ altText
+ sourceUrl
+ title
+ }
+ }
+ modified
+ seo {
+ metaDesc
+ opengraphAuthor
+ opengraphDescription
+ opengraphImage {
+ altText
+ sourceUrl
+ srcSet
+ }
+ opengraphModifiedTime
+ opengraphPublishedTime
+ opengraphPublisher
+ opengraphSiteName
+ opengraphTitle
+ opengraphType
+ opengraphUrl
+ readingTime
+ }
+ title
+ }
+ }
+ `;
+
+ const variables = { slug };
+
+ try {
+ const response: PostByResponse = await client.request(query, variables);
+ return response;
+ } catch (error) {
+ console.error(JSON.stringify(error, undefined, 2));
+ process.exit(1);
+ }
+};
+
+export const getPostBySlug: GetPostByReturn = async (slug: string) => {
+ const rawPost = await fetchPostBySlug(slug);
+
+ const comments = rawPost.postBy.comments.nodes;
+ const content = rawPost.postBy.contentParts.afterMore;
+ const featuredImage = rawPost.postBy.featuredImage
+ ? rawPost.postBy.featuredImage.node
+ : {};
+ const date = {
+ publication: rawPost.postBy.date,
+ update: rawPost.postBy.modified,
+ };
+ const intro = rawPost.postBy.contentParts.beforeMore;
+ const subjects = rawPost.postBy.acfPosts.postsInSubject
+ ? rawPost.postBy.acfPosts.postsInSubject
+ : [];
+ const thematics = rawPost.postBy.acfPosts.postsInThematics
+ ? rawPost.postBy.acfPosts.postsInThematics
+ : [];
+
+ const formattedPost: Article = {
+ ...rawPost.postBy,
+ comments,
+ content,
+ featuredImage,
+ date,
+ intro,
+ subjects,
+ thematics,
+ };
+
+ return formattedPost;
+};