65 lines
2.3 KiB
TypeScript
65 lines
2.3 KiB
TypeScript
import { EducationType } from "@/education/education.types";
|
|
import { DocumentBuilder } from "@nestjs/swagger";
|
|
import { RedocOptions } from "@juicyllama/nestjs-redoc";
|
|
import educationDataset from "@/education/education.dataset";
|
|
|
|
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: [],
|
|
};
|
|
redocOptions.tagGroups.push(educationTagGroup);
|
|
}
|
|
|
|
educationDataset
|
|
.getData()
|
|
.slice(0, count)
|
|
.forEach((education) => {
|
|
educationTagGroup.tags.push(education.institute);
|
|
document.addTag(education.institute, formatEducation(education));
|
|
});
|
|
|
|
educationTagGroup.tags.push("Education");
|
|
document.addTag("Education", "For my complete education, take a look at the GetEducation API endpoint.");
|
|
|
|
return document;
|
|
};
|