summaryrefslogtreecommitdiffstats
path: root/src/utils
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2021-12-20 00:15:20 +0100
committerArmand Philippot <git@armandphilippot.com>2021-12-20 00:15:20 +0100
commitfa6adedc42e9c6ec39cc30df16b54900c220b094 (patch)
tree6bb498beadaa382245cecb86ce56931580313c6f /src/utils
parent2ff898626c5c0abc6b8195224067b992403e313b (diff)
refactor: rewrite types and services
I was repeating myself a lot in services. So I rewrited the different functions to improve readability and I extracted some formatting functions to put them in utils. I also rewrited/reorganized some types to keep consistent names.
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/helpers/format.ts226
-rw-r--r--src/utils/helpers/sort.ts4
2 files changed, 229 insertions, 1 deletions
diff --git a/src/utils/helpers/format.ts b/src/utils/helpers/format.ts
new file mode 100644
index 0000000..8c5e545
--- /dev/null
+++ b/src/utils/helpers/format.ts
@@ -0,0 +1,226 @@
+import {
+ Article,
+ ArticlePreview,
+ RawArticle,
+ RawArticlePreview,
+} from '@ts/types/articles';
+import { Comment, RawComment } from '@ts/types/comments';
+import { Page, RawPage } from '@ts/types/pages';
+import {
+ RawSubject,
+ RawThematic,
+ Subject,
+ Thematic,
+} from '@ts/types/taxonomies';
+
+/**
+ * Format a post preview from RawArticlePreview to ArticlePreview type.
+ * @param rawPost - A post preview coming from WP GraphQL.
+ * @returns A formatted post preview.
+ */
+export const getFormattedPostPreview = (rawPost: RawArticlePreview) => {
+ const {
+ acfPosts,
+ commentCount,
+ contentParts,
+ date,
+ featuredImage,
+ id,
+ modified,
+ slug,
+ title,
+ } = rawPost;
+
+ const dates = {
+ publication: date,
+ update: modified,
+ };
+
+ const thematics = acfPosts.postsInThematic ? acfPosts.postsInThematic : [];
+
+ const formattedPost: ArticlePreview = {
+ commentCount,
+ dates,
+ featuredImage: featuredImage ? featuredImage.node : null,
+ id,
+ intro: contentParts.beforeMore,
+ slug,
+ thematics,
+ title,
+ };
+
+ return formattedPost;
+};
+
+/**
+ * Format an array of posts list from RawArticlePreview to ArticlePreview type.
+ * @param rawPosts - A posts list coming from WP GraphQL.
+ * @returns A formatted posts list.
+ */
+export const getFormattedPostsList = (
+ rawPosts: RawArticlePreview[]
+): ArticlePreview[] => {
+ const formattedPosts = rawPosts
+ .filter((post) => Object.getOwnPropertyNames(post).length > 0)
+ .map((post) => {
+ const formattedPost = getFormattedPostPreview(post);
+
+ return formattedPost;
+ });
+
+ return formattedPosts;
+};
+
+/**
+ * Format a subject from RawSubject to Subject type.
+ * @param rawSubject - A subject coming from WP GraphQL.
+ * @returns A formatted subject.
+ */
+export const getFormattedSubject = (rawSubject: RawSubject): Subject => {
+ const {
+ acfSubjects,
+ contentParts,
+ databaseId,
+ date,
+ featuredImage,
+ id,
+ modified,
+ title,
+ } = rawSubject;
+
+ const dates = {
+ publication: date,
+ update: modified,
+ };
+
+ const posts = getFormattedPostsList(acfSubjects.postsInSubject);
+
+ const formattedSubject: Subject = {
+ content: contentParts.afterMore,
+ databaseId,
+ dates,
+ featuredImage: featuredImage ? featuredImage.node : null,
+ id,
+ intro: contentParts.beforeMore,
+ officialWebsite: acfSubjects.officialWebsite,
+ posts,
+ title,
+ };
+
+ return formattedSubject;
+};
+
+/**
+ * Format a thematic from RawThematic to Thematic type.
+ * @param rawThematic - A thematic coming from wP GraphQL.
+ * @returns A formatted thematic.
+ */
+export const getFormattedThematic = (rawThematic: RawThematic): Thematic => {
+ const { acfThematics, contentParts, databaseId, date, id, modified, title } =
+ rawThematic;
+
+ const dates = {
+ publication: date,
+ update: modified,
+ };
+
+ const posts = getFormattedPostsList(acfThematics.postsInThematic);
+
+ const formattedThematic: Thematic = {
+ content: contentParts.afterMore,
+ databaseId,
+ dates,
+ id,
+ intro: contentParts.beforeMore,
+ posts,
+ title,
+ };
+
+ return formattedThematic;
+};
+
+/**
+ * Format a comments list from RawComment to Comment type.
+ * @param rawComments - A comments list coming from WP GraphQL.
+ * @returns A formatted comments list.
+ */
+export const getFormattedComments = (rawComments: RawComment[]): Comment[] => {
+ const formattedComments: Comment[] = rawComments.map((comment) => {
+ const formattedComment: Comment = {
+ ...comment,
+ author: comment.author.node,
+ replies: [],
+ };
+
+ return formattedComment;
+ });
+
+ return formattedComments;
+};
+
+/**
+ * Format an article from RawArticle to Article type.
+ * @param rawPost - An article coming from WP GraphQL.
+ * @returns A formatted article.
+ */
+export const getFormattedPost = (rawPost: RawArticle): Article => {
+ const {
+ acfPosts,
+ author,
+ commentCount,
+ comments,
+ contentParts,
+ databaseId,
+ date,
+ id,
+ modified,
+ seo,
+ title,
+ } = rawPost;
+
+ const dates = {
+ publication: date,
+ update: modified,
+ };
+
+ const formattedComments = getFormattedComments(comments.nodes);
+
+ const formattedPost: Article = {
+ author: author.node,
+ commentCount,
+ comments: formattedComments,
+ content: contentParts.afterMore,
+ databaseId,
+ dates,
+ id,
+ intro: contentParts.beforeMore,
+ seo,
+ subjects: acfPosts.postsInSubject ? acfPosts.postsInSubject : [],
+ thematics: acfPosts.postsInThematic ? acfPosts.postsInThematic : [],
+ title,
+ };
+
+ return formattedPost;
+};
+
+/**
+ * Format a page from RawPage to Page type.
+ * @param page - A page coming from WP GraphQL.
+ * @returns A formatted page.
+ */
+export const getFormattedPage = (rawPage: RawPage): Page => {
+ const { date, modified } = rawPage;
+ const dates = {
+ publication: date,
+ update: modified,
+ };
+
+ const formattedPage: Page = {
+ ...rawPage,
+ content: rawPage.contentParts.afterMore,
+ dates,
+ intro: rawPage.contentParts.beforeMore,
+ };
+
+ return formattedPage;
+};
diff --git a/src/utils/helpers/sort.ts b/src/utils/helpers/sort.ts
index ade82d0..c1ee35d 100644
--- a/src/utils/helpers/sort.ts
+++ b/src/utils/helpers/sort.ts
@@ -10,7 +10,9 @@ export const sortPostsByYear = (data: PostsList[]) => {
data.forEach((page) => {
page.posts.forEach((post) => {
- const postYear = new Date(post.date.publication).getFullYear().toString();
+ const postYear = new Date(post.dates.publication)
+ .getFullYear()
+ .toString();
yearCollection[postYear] = [...(yearCollection[postYear] || []), post];
});
});