CV/src/cvdocs/education.ts
2023-10-22 15:11:35 +02:00

59 lines
2.1 KiB
TypeScript

import { EducationType } from "@/education/education.types";
import { DocumentBuilder } from "@nestjs/swagger";
import { RedocOptions } from "@juicyllama/nestjs-redoc";
import { education } from "@/education/education";
const formatEducation = (education: EducationType) => {
const period = `${formatDate(education.startDate)} - ${
education.endDate ? formatDate(education.endDate) : "present"
}`;
const institute = education.url
? `<a target="_blank" href="${education.url}">${education.institute}</a>`
: education.institute;
const description = education.description.split("\n").join("</p><p>");
return `<header><strong>${institute}</strong>, <em>${education.city}</em><br/>
<strong>${education.level}</strong> - ${education.course}<br/>
<time>${period}</time></header>
<p>${description}</p>`;
};
const formatDate = (date: Date, locale: string | string[] = "en-GB"): string => {
const dateFormatter = new Intl.DateTimeFormat(locale, {
dateStyle: "long",
});
const dateParts = dateFormatter.formatToParts(date).reduce<Record<"day" | "month" | "year", string>>(
(result, datePart: Intl.DateTimeFormatPart) => {
if (datePart.type !== "literal") {
result[datePart.type] = datePart.value;
}
return result;
},
{ day: "", month: "", year: "" }
);
return `${dateParts.month} ${dateParts.year}`;
};
export const addEducation = (
document: DocumentBuilder,
count: number = 5,
redocOptions: RedocOptions
): DocumentBuilder => {
let educationTagGroup = redocOptions.tagGroups.find((tagGroup) => tagGroup.name === "Education");
if (!educationTagGroup) {
educationTagGroup = {
name: "Education",
tags: ["Education"],
};
redocOptions.tagGroups.push(educationTagGroup);
}
education.slice(0, count).forEach((education) => {
educationTagGroup.tags.push(education.institute);
document.addTag(education.institute, formatEducation(education));
});
return document;
};