diff options
| author | Armand Philippot <git@armandphilippot.com> | 2021-12-20 00:15:20 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2021-12-20 00:15:20 +0100 |
| commit | fa6adedc42e9c6ec39cc30df16b54900c220b094 (patch) | |
| tree | 6bb498beadaa382245cecb86ce56931580313c6f /src/utils | |
| parent | 2ff898626c5c0abc6b8195224067b992403e313b (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.ts | 226 | ||||
| -rw-r--r-- | src/utils/helpers/sort.ts | 4 |
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]; }); }); |
