diff options
Diffstat (limited to 'src/services/graphql')
| -rw-r--r-- | src/services/graphql/blog.ts | 33 | ||||
| -rw-r--r-- | src/services/graphql/post.ts | 136 | 
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; +}; | 
