return data with get functions
This commit is contained in:
parent
1c533394b1
commit
532909d0d4
15 changed files with 394 additions and 380 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
import { EducationType } from "@/education/education.types";
|
import { EducationType } from "@/education/education.types";
|
||||||
import { DocumentBuilder } from "@nestjs/swagger";
|
import { DocumentBuilder } from "@nestjs/swagger";
|
||||||
import { RedocOptions } from "@juicyllama/nestjs-redoc";
|
import { RedocOptions } from "@juicyllama/nestjs-redoc";
|
||||||
import { education } from "@/education/education";
|
import { getEducationData } from "@/education/getEducationData";
|
||||||
|
|
||||||
const formatEducation = (education: EducationType) => {
|
const formatEducation = (education: EducationType) => {
|
||||||
const period = `${formatDate(education.startDate)} - ${
|
const period = `${formatDate(education.startDate)} - ${
|
||||||
|
|
@ -50,7 +50,7 @@ export const addEducation = (
|
||||||
redocOptions.tagGroups.push(educationTagGroup);
|
redocOptions.tagGroups.push(educationTagGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
education.slice(0, count).forEach((education) => {
|
getEducationData.slice(0, count).forEach((education) => {
|
||||||
educationTagGroup.tags.push(education.institute);
|
educationTagGroup.tags.push(education.institute);
|
||||||
document.addTag(education.institute, formatEducation(education));
|
document.addTag(education.institute, formatEducation(education));
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { ExperienceType } from "@/experiences/experiences.types";
|
import { ExperienceType } from "@/experiences/experiences.types";
|
||||||
import { DocumentBuilder } from "@nestjs/swagger";
|
import { DocumentBuilder } from "@nestjs/swagger";
|
||||||
import { RedocOptions } from "@juicyllama/nestjs-redoc";
|
import { RedocOptions } from "@juicyllama/nestjs-redoc";
|
||||||
import { experiences } from "@/experiences/experiences";
|
import { experiencesDataset } from "@/experiences/experiences.dataset";
|
||||||
|
|
||||||
const formatExperience = (experience: ExperienceType) => {
|
const formatExperience = (experience: ExperienceType) => {
|
||||||
const workPeriod = `${formatDate(experience.startDate)} - ${
|
const workPeriod = `${formatDate(experience.startDate)} - ${
|
||||||
|
|
@ -50,7 +50,7 @@ export const addExperiences = (
|
||||||
redocOptions.tagGroups.push(experienceTagGroup);
|
redocOptions.tagGroups.push(experienceTagGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
experiences.slice(0, count).forEach((experience) => {
|
experiencesDataset.slice(0, count).forEach((experience) => {
|
||||||
experienceTagGroup.tags.push(experience.name);
|
experienceTagGroup.tags.push(experience.name);
|
||||||
document.addTag(experience.name, formatExperience(experience));
|
document.addTag(experience.name, formatExperience(experience));
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { DocumentBuilder } from "@nestjs/swagger";
|
import { DocumentBuilder } from "@nestjs/swagger";
|
||||||
import { RedocOptions } from "@juicyllama/nestjs-redoc";
|
import { RedocOptions } from "@juicyllama/nestjs-redoc";
|
||||||
import { skills } from "@/skills/skills";
|
import { skillsDataset } from "@/skills/skills.dataset";
|
||||||
|
|
||||||
export const addSkills = (
|
export const addSkills = (
|
||||||
document: DocumentBuilder,
|
document: DocumentBuilder,
|
||||||
|
|
@ -18,7 +18,7 @@ export const addSkills = (
|
||||||
}
|
}
|
||||||
|
|
||||||
const intro = "A short excerpt of my skills are";
|
const intro = "A short excerpt of my skills are";
|
||||||
const skillList = skills
|
const skillList = skillsDataset
|
||||||
.slice(0, count)
|
.slice(0, count)
|
||||||
.reduce((list, skill) => list.concat(`<li><strong>${skill.name}</strong> ${skill.description}</li>`), "");
|
.reduce((list, skill) => list.concat(`<li><strong>${skill.name}</strong> ${skill.description}</li>`), "");
|
||||||
|
|
||||||
|
|
|
||||||
50
src/education/education.dataset.ts
Normal file
50
src/education/education.dataset.ts
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
import { EducationType } from "@/education/education.types";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
getData: (): EducationType[] =>
|
||||||
|
[
|
||||||
|
{
|
||||||
|
institute: "Hogeschool Utrecht",
|
||||||
|
city: "Utrecht",
|
||||||
|
url: "https://hu.nl",
|
||||||
|
course: "Mediatechnologie",
|
||||||
|
level: "HBO",
|
||||||
|
startDate: new Date(2010, 8),
|
||||||
|
endDate: new Date(2015, 9),
|
||||||
|
description: `My time at Hogeschool Utrecht was a period of academic and personal growth.
|
||||||
|
While pursuing my Media Technology degree, I took a gap year to co-found and serve as treasurer of Sv. Ingenium, a university-affiliated student society. This experience sharpened my organizational, communication, and leadership skills, proving invaluable throughout my studies and beyond.
|
||||||
|
Additionally, active participation in projects and presentations enhanced my presentation skills and public speaking confidence.`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
institute: "Mediacollege Amsterdam",
|
||||||
|
city: "Amsterdam",
|
||||||
|
url: "https://www.ma-web.nl/",
|
||||||
|
course: "Interactive Design & Media technology",
|
||||||
|
level: "MBO 4",
|
||||||
|
startDate: new Date(2006, 8),
|
||||||
|
endDate: new Date(2010, 5),
|
||||||
|
description: `My time at Mediacollege Amsterdam began with Interactive Design, but programming quickly captured my interest. ActionScript 2, now a relic of the past, marked my introduction to the world of programming, while PHP and JavaScript truly sparked my passion.
|
||||||
|
With help of my teachers and a careful consideration of course, I transitioned towards Media Technology, paving the way for my future in software development.`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
institute: "Clusius college",
|
||||||
|
city: "Castricum",
|
||||||
|
url: "https://www.vonknh.nl/vmbo/castricum",
|
||||||
|
course: "General secondary education",
|
||||||
|
level: "VMBO - GL",
|
||||||
|
startDate: new Date(2002, 8),
|
||||||
|
endDate: new Date(2006, 5),
|
||||||
|
description: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
institute: "Watermolen",
|
||||||
|
city: "Koog aan de zaan",
|
||||||
|
url: "https://www.obsdewatermolen.nl/",
|
||||||
|
course: "General primary education",
|
||||||
|
level: "Primary education",
|
||||||
|
startDate: new Date(1994, 8),
|
||||||
|
endDate: new Date(2002, 5),
|
||||||
|
description: "",
|
||||||
|
},
|
||||||
|
] satisfies EducationType[],
|
||||||
|
};
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { Test, TestingModule } from "@nestjs/testing";
|
import { Test, TestingModule } from "@nestjs/testing";
|
||||||
import { EducationService } from "@/education/education.service";
|
import { EducationService } from "@/education/education.service";
|
||||||
import { education } from "@/education/education";
|
import educationDataset from "@/education/education.dataset";
|
||||||
|
|
||||||
describe("SkillsService", () => {
|
describe("SkillsService", () => {
|
||||||
let service: EducationService;
|
let service: EducationService;
|
||||||
|
|
@ -10,9 +10,8 @@ describe("SkillsService", () => {
|
||||||
providers: [EducationService],
|
providers: [EducationService],
|
||||||
}).compile();
|
}).compile();
|
||||||
|
|
||||||
education.splice(0);
|
jest.spyOn(educationDataset, "getData").mockImplementation(() => [
|
||||||
|
{
|
||||||
education.push({
|
|
||||||
institute: "Oxford University",
|
institute: "Oxford University",
|
||||||
city: "Oxford",
|
city: "Oxford",
|
||||||
url: "https://www.ox.ac.uk/",
|
url: "https://www.ox.ac.uk/",
|
||||||
|
|
@ -21,9 +20,8 @@ describe("SkillsService", () => {
|
||||||
startDate: new Date(2023, 0),
|
startDate: new Date(2023, 0),
|
||||||
endDate: new Date(2023, 1),
|
endDate: new Date(2023, 1),
|
||||||
description: "Got my english degree",
|
description: "Got my english degree",
|
||||||
});
|
},
|
||||||
|
{
|
||||||
education.push({
|
|
||||||
institute: "Massachusetts Institute of Technology",
|
institute: "Massachusetts Institute of Technology",
|
||||||
city: "Cambridge",
|
city: "Cambridge",
|
||||||
url: "https://www.mit.edu/",
|
url: "https://www.mit.edu/",
|
||||||
|
|
@ -32,7 +30,8 @@ describe("SkillsService", () => {
|
||||||
startDate: new Date(2023, 2),
|
startDate: new Date(2023, 2),
|
||||||
endDate: new Date(2023, 3),
|
endDate: new Date(2023, 3),
|
||||||
description: "Got my PHD in neuroscience",
|
description: "Got my PHD in neuroscience",
|
||||||
});
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
service = module.get<EducationService>(EducationService);
|
service = module.get<EducationService>(EducationService);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
import { Injectable } from "@nestjs/common";
|
import { Injectable } from "@nestjs/common";
|
||||||
import { EducationDto, EducationType } from "@/education/education.types";
|
import { EducationDto, EducationType } from "@/education/education.types";
|
||||||
import { education } from "@/education/education";
|
import educationDataset from "@/education/education.dataset";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class EducationService {
|
export class EducationService {
|
||||||
private readonly education: readonly EducationDto[];
|
private readonly education: readonly EducationDto[];
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.education = EducationDto.asDto(education).sort((educationA, educationB) =>
|
this.education = EducationDto.asDto(educationDataset.getData()).sort((educationA, educationB) =>
|
||||||
educationA.startDate < educationB.startDate ? 1 : -1
|
educationA.startDate < educationB.startDate ? 1 : -1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
import { EducationType } from "@/education/education.types";
|
|
||||||
|
|
||||||
export const education: EducationType[] = [
|
|
||||||
{
|
|
||||||
institute: "Hogeschool Utrecht",
|
|
||||||
city: "Utrecht",
|
|
||||||
url: "https://hu.nl",
|
|
||||||
course: "Mediatechnologie",
|
|
||||||
level: "HBO",
|
|
||||||
startDate: new Date(2010, 8),
|
|
||||||
endDate: new Date(2015, 9),
|
|
||||||
description: `My time at Hogeschool Utrecht was a period of academic and personal growth.
|
|
||||||
While pursuing my Media Technology degree, I took a gap year to co-found and serve as treasurer of Sv. Ingenium, a university-affiliated student society. This experience sharpened my organizational, communication, and leadership skills, proving invaluable throughout my studies and beyond.
|
|
||||||
Additionally, active participation in projects and presentations enhanced my presentation skills and public speaking confidence.`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
institute: "Mediacollege Amsterdam",
|
|
||||||
city: "Amsterdam",
|
|
||||||
url: "https://www.ma-web.nl/",
|
|
||||||
course: "Interactive Design & Media technology",
|
|
||||||
level: "MBO 4",
|
|
||||||
startDate: new Date(2006, 8),
|
|
||||||
endDate: new Date(2010, 5),
|
|
||||||
description: `My time at Mediacollege Amsterdam began with Interactive Design, but programming quickly captured my interest. ActionScript 2, now a relic of the past, marked my introduction to the world of programming, while PHP and JavaScript truly sparked my passion.
|
|
||||||
With help of my teachers and a careful consideration of course, I transitioned towards Media Technology, paving the way for my future in software development.`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
institute: "Clusius college",
|
|
||||||
city: "Castricum",
|
|
||||||
url: "https://www.vonknh.nl/vmbo/castricum",
|
|
||||||
course: "General secondary education",
|
|
||||||
level: "VMBO - GL",
|
|
||||||
startDate: new Date(2002, 8),
|
|
||||||
endDate: new Date(2006, 5),
|
|
||||||
description: "",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
institute: "Watermolen",
|
|
||||||
city: "Koog aan de zaan",
|
|
||||||
url: "https://www.obsdewatermolen.nl/",
|
|
||||||
course: "General primary education",
|
|
||||||
level: "Primary education",
|
|
||||||
startDate: new Date(1994, 8),
|
|
||||||
endDate: new Date(2002, 5),
|
|
||||||
description: "",
|
|
||||||
},
|
|
||||||
] satisfies EducationType[];
|
|
||||||
116
src/experiences/experiences.dataset.ts
Normal file
116
src/experiences/experiences.dataset.ts
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
import { ExperienceType } from "@/experiences/experiences.types";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
getData: () =>
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name: "Saysimple / Just Internet Group",
|
||||||
|
city: "Haarlem",
|
||||||
|
url: "https://saysimple.com/",
|
||||||
|
jobTitle: "Senior Developer / DevOps",
|
||||||
|
startDate: new Date(2018, 9, 1),
|
||||||
|
endDate: null,
|
||||||
|
description: `My journey at Just Internet Group began in 2018 with Cocoon, a SaaS digital asset management (DAM) system. Here I implemented ElasticSearch & Kibana to effectively monitor asset uploads and downloads.
|
||||||
|
In 2019, I transitioned to Saysimple, where I had the opportunity to contribute to the development of our Customer Communication Platform from the ground up. I participated in creating a microservice architecture using Docker and NodeJS, enabling modularity, scalability, and efficient resource allocation. Additionally, I am responsible for establishing and maintaining our CI/CD pipelines, the EKS cluster, and HAProxy load balancers, contributing to the overall system operation and efficient development processes.
|
||||||
|
Furthermore, I am a member of the team that handles outages and maintenance during off-hours.
|
||||||
|
`,
|
||||||
|
skills: [
|
||||||
|
{
|
||||||
|
category:
|
||||||
|
"AWS|Containerization|DevOps|Business Intelligence|Team Management|Problem-solving|Collaboration",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "NodeJs|Git|PHP",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Blackorange",
|
||||||
|
city: "Amsterdam",
|
||||||
|
url: "http://blackorange.nl/",
|
||||||
|
jobTitle: "Junior Developer / System Administrator",
|
||||||
|
startDate: new Date(2014, 9, 1),
|
||||||
|
endDate: new Date(2018, 8, 30),
|
||||||
|
description: `My internship at Blackorange transformed into a full-time role as a Junior Developer and System Administrator, where I actively contributed to the development and maintenance of various web projects.
|
||||||
|
Notably, I lead to the migration from managed hosting to self-hosted infrastructure using Nginx and PHP-FPM, and I participated in the development of our in-house CMS system using PHP Laravel.`,
|
||||||
|
skills: [
|
||||||
|
{
|
||||||
|
name: "PHP|Git|Server|Communication|Problem-solving",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Mediacollege Amsterdam",
|
||||||
|
city: "Amsterdam",
|
||||||
|
url: "https://ma-web.nl",
|
||||||
|
jobTitle: "Internship / Teacher in training",
|
||||||
|
startDate: new Date(2013, 7, 1),
|
||||||
|
endDate: new Date(2014, 1, 31),
|
||||||
|
description: `My internship as a teacher-in-training at Mediacollege Amsterdam during my Education minor was an enriching experience. I guided students through the intricacies of PHP and JavaScript programming, fostering their comprehension of essential concepts. Alongside teaching, I provided individualized support, assisting students with coursework challenges and promoting their academic success. This internship honed my communication, problem-solving, and event organization skills, shaping my approach to effective and engaging teaching.`,
|
||||||
|
skills: [
|
||||||
|
{
|
||||||
|
name: "Communication|Problem-solving|Event Organization",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Werring Webdevelopment",
|
||||||
|
city: "Middenbeemster",
|
||||||
|
jobTitle: "ZZP",
|
||||||
|
startDate: new Date(2012, 9, 1),
|
||||||
|
endDate: new Date(2016, 11, 31),
|
||||||
|
description: `During my college years, I started as a freelancer as Werring Webdevelopment. I catered to the web development needs of small businesses, primarily building WordPress websites and assisting with domain registration and email setup.`,
|
||||||
|
skills: [
|
||||||
|
{
|
||||||
|
name: "PHP|Web",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Sv. Ingenium",
|
||||||
|
city: "Utrecht",
|
||||||
|
url: "http://ingeniumcabobianci.nl/",
|
||||||
|
jobTitle: "Treasurer",
|
||||||
|
startDate: new Date(2012, 8, 1),
|
||||||
|
endDate: new Date(2014, 7, 31),
|
||||||
|
description: `At Sv. Ingenium, a student society affiliated with Hogeschool Utrecht, I served as Treasurer during a period of significant transformation.
|
||||||
|
In 2012, multiple smaller study societies merged at the request of the university to form Sv. Ingenium. During my tenure, I oversaw financial operations, ensuring the society's stability and growth. I also played a key role in organizing educational international trips to CERN (Switzerland) and Volvo (Sweden), among others.
|
||||||
|
In late 2014, Sv. Ingenium merged with a larger society to become Ingenium Cabo Bianci.`,
|
||||||
|
skills: [
|
||||||
|
{
|
||||||
|
name: "Finances|Communication",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
category: "Organization",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Chellomedia / Film1",
|
||||||
|
city: "Amsterdam",
|
||||||
|
url: "http://film1.nl/",
|
||||||
|
jobTitle: "Internship",
|
||||||
|
startDate: new Date(2008, 2, 1),
|
||||||
|
endDate: new Date(2008, 5, 30),
|
||||||
|
description: `My internship at Chellomedia/Film1 immersed me in the world of digital media and caffeine. Apart from crafting animated banners and modifying movie promotional websites with ActionScript 3, I discovered a hidden talent for serving coffee that kept the team energized and creatively fueled. `,
|
||||||
|
skills: [
|
||||||
|
{
|
||||||
|
name: "Teamwork|Communication",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Pressofoon B.V.",
|
||||||
|
city: "Heemskerk",
|
||||||
|
jobTitle: "Internship",
|
||||||
|
startDate: new Date(2007, 8, 1),
|
||||||
|
endDate: new Date(2009, 11, 31),
|
||||||
|
description: `My internship at Pressofoon B.V. was an opportunity to learn and contribute alongside experienced professionals. Guided by mentors, I applied my developing programming skills, crafting JavaScript, HTML, and PHP scripts for multiple websites. I also assisted in redesigning the company website, learning from the design team's expertise. Alongside these technical contributions, I observed and participated in a new product launch, gaining valuable insights into product marketing and customer engagement. Throughout my internship, I strived to be a team player, collaborating effectively to achieve common goals.`,
|
||||||
|
skills: [
|
||||||
|
{
|
||||||
|
name: "Teamwork|Communication",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
] satisfies ExperienceType[],
|
||||||
|
};
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import { Test, TestingModule } from "@nestjs/testing";
|
import { Test, TestingModule } from "@nestjs/testing";
|
||||||
import { ExperiencesService } from "./experiences.service";
|
import { ExperiencesService } from "./experiences.service";
|
||||||
import { SkillsService } from "@/skills/skills.service";
|
import { SkillsService } from "@/skills/skills.service";
|
||||||
import { experiences } from "@/experiences/experiences";
|
import experiencesDataset from "@/experiences/experiences.dataset";
|
||||||
import { skills } from "@/skills/skills";
|
import skillsDataset from "@/skills/skills.dataset";
|
||||||
|
|
||||||
describe("ExperiencesService", () => {
|
describe("ExperiencesService", () => {
|
||||||
let service: ExperiencesService;
|
let service: ExperiencesService;
|
||||||
|
|
@ -12,9 +12,8 @@ describe("ExperiencesService", () => {
|
||||||
providers: [ExperiencesService, SkillsService],
|
providers: [ExperiencesService, SkillsService],
|
||||||
}).compile();
|
}).compile();
|
||||||
|
|
||||||
experiences.splice(0);
|
jest.spyOn(experiencesDataset, "getData").mockImplementation(() => [
|
||||||
|
{
|
||||||
experiences.push({
|
|
||||||
name: "Employer A",
|
name: "Employer A",
|
||||||
city: "City A",
|
city: "City A",
|
||||||
url: "https://example.com/",
|
url: "https://example.com/",
|
||||||
|
|
@ -27,8 +26,8 @@ describe("ExperiencesService", () => {
|
||||||
category: "Testing",
|
category: "Testing",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
},
|
||||||
experiences.push({
|
{
|
||||||
name: "Employer B",
|
name: "Employer B",
|
||||||
city: "City B",
|
city: "City B",
|
||||||
url: "https://example.com/",
|
url: "https://example.com/",
|
||||||
|
|
@ -41,24 +40,26 @@ describe("ExperiencesService", () => {
|
||||||
category: "Programming",
|
category: "Programming",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
skills.splice(0);
|
jest.spyOn(skillsDataset, "getData").mockImplementation(() => [
|
||||||
skills.push({
|
{
|
||||||
name: "Writing tests",
|
name: "Writing tests",
|
||||||
description: "Writing tests",
|
description: "Writing tests",
|
||||||
category: "Testing",
|
category: "Testing",
|
||||||
});
|
},
|
||||||
skills.push({
|
{
|
||||||
name: "TDD",
|
name: "TDD",
|
||||||
description: "Test Driven Development",
|
description: "Test Driven Development",
|
||||||
category: "Testing",
|
category: "Testing",
|
||||||
});
|
},
|
||||||
skills.push({
|
{
|
||||||
name: "OOP",
|
name: "OOP",
|
||||||
description: "Object Orientated Programming",
|
description: "Object Orientated Programming",
|
||||||
category: "Programming style",
|
category: "Programming style",
|
||||||
});
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
service = module.get<ExperiencesService>(ExperiencesService);
|
service = module.get<ExperiencesService>(ExperiencesService);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { Injectable } from "@nestjs/common";
|
import { Injectable } from "@nestjs/common";
|
||||||
import { ExperienceDto, ExperienceType } from "@/experiences/experiences.types";
|
import { ExperienceDto, ExperienceType } from "@/experiences/experiences.types";
|
||||||
import { SkillsService } from "@/skills/skills.service";
|
import { SkillsService } from "@/skills/skills.service";
|
||||||
import { experiences } from "@/experiences/experiences";
|
import experiencesDataset from "@/experiences/experiences.dataset";
|
||||||
import { SkillDto } from "@/skills/skills.types";
|
import { SkillDto } from "@/skills/skills.types";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
|
@ -9,8 +9,8 @@ export class ExperiencesService {
|
||||||
private readonly experiences: readonly ExperienceDto[];
|
private readonly experiences: readonly ExperienceDto[];
|
||||||
|
|
||||||
constructor(private readonly skillsService: SkillsService) {
|
constructor(private readonly skillsService: SkillsService) {
|
||||||
this.experiences = ExperienceDto.asDto(this.linkSkills(experiences)).sort((experienceA, experienceB) =>
|
this.experiences = ExperienceDto.asDto(this.linkSkills(experiencesDataset.getData())).sort(
|
||||||
experienceA.startDate < experienceB.startDate ? 1 : -1
|
(experienceA, experienceB) => (experienceA.startDate < experienceB.startDate ? 1 : -1)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,113 +0,0 @@
|
||||||
import { ExperienceType } from "@/experiences/experiences.types";
|
|
||||||
|
|
||||||
export const experiences: ExperienceType[] = [
|
|
||||||
{
|
|
||||||
name: "Saysimple / Just Internet Group",
|
|
||||||
city: "Haarlem",
|
|
||||||
url: "https://saysimple.com/",
|
|
||||||
jobTitle: "Senior Developer / DevOps",
|
|
||||||
startDate: new Date(2018, 9, 1),
|
|
||||||
endDate: null,
|
|
||||||
description: `My journey at Just Internet Group began in 2018 with Cocoon, a SaaS digital asset management (DAM) system. Here I implemented ElasticSearch & Kibana to effectively monitor asset uploads and downloads.
|
|
||||||
In 2019, I transitioned to Saysimple, where I had the opportunity to contribute to the development of our Customer Communication Platform from the ground up. I participated in creating a microservice architecture using Docker and NodeJS, enabling modularity, scalability, and efficient resource allocation. Additionally, I am responsible for establishing and maintaining our CI/CD pipelines, the EKS cluster, and HAProxy load balancers, contributing to the overall system operation and efficient development processes.
|
|
||||||
Furthermore, I am a member of the team that handles outages and maintenance during off-hours.
|
|
||||||
`,
|
|
||||||
skills: [
|
|
||||||
{
|
|
||||||
category:
|
|
||||||
"AWS|Containerization|DevOps|Business Intelligence|Team Management|Problem-solving|Collaboration",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "NodeJs|Git|PHP",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Blackorange",
|
|
||||||
city: "Amsterdam",
|
|
||||||
url: "http://blackorange.nl/",
|
|
||||||
jobTitle: "Junior Developer / System Administrator",
|
|
||||||
startDate: new Date(2014, 9, 1),
|
|
||||||
endDate: new Date(2018, 8, 30),
|
|
||||||
description: `My internship at Blackorange transformed into a full-time role as a Junior Developer and System Administrator, where I actively contributed to the development and maintenance of various web projects.
|
|
||||||
Notably, I lead to the migration from managed hosting to self-hosted infrastructure using Nginx and PHP-FPM, and I participated in the development of our in-house CMS system using PHP Laravel.`,
|
|
||||||
skills: [
|
|
||||||
{
|
|
||||||
name: "PHP|Git|Server|Communication|Problem-solving",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Mediacollege Amsterdam",
|
|
||||||
city: "Amsterdam",
|
|
||||||
url: "https://ma-web.nl",
|
|
||||||
jobTitle: "Internship / Teacher in training",
|
|
||||||
startDate: new Date(2013, 7, 1),
|
|
||||||
endDate: new Date(2014, 1, 31),
|
|
||||||
description: `My internship as a teacher-in-training at Mediacollege Amsterdam during my Education minor was an enriching experience. I guided students through the intricacies of PHP and JavaScript programming, fostering their comprehension of essential concepts. Alongside teaching, I provided individualized support, assisting students with coursework challenges and promoting their academic success. This internship honed my communication, problem-solving, and event organization skills, shaping my approach to effective and engaging teaching.`,
|
|
||||||
skills: [
|
|
||||||
{
|
|
||||||
name: "Communication|Problem-solving|Event Organization",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Werring Webdevelopment",
|
|
||||||
city: "Middenbeemster",
|
|
||||||
jobTitle: "ZZP",
|
|
||||||
startDate: new Date(2012, 9, 1),
|
|
||||||
endDate: new Date(2016, 11, 31),
|
|
||||||
description: `During my college years, I started as a freelancer as Werring Webdevelopment. I catered to the web development needs of small businesses, primarily building WordPress websites and assisting with domain registration and email setup.`,
|
|
||||||
skills: [
|
|
||||||
{
|
|
||||||
name: "PHP|Web",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Sv. Ingenium",
|
|
||||||
city: "Utrecht",
|
|
||||||
url: "http://ingeniumcabobianci.nl/",
|
|
||||||
jobTitle: "Treasurer",
|
|
||||||
startDate: new Date(2012, 8, 1),
|
|
||||||
endDate: new Date(2014, 7, 31),
|
|
||||||
description: `At Sv. Ingenium, a student society affiliated with Hogeschool Utrecht, I served as Treasurer during a period of significant transformation.
|
|
||||||
In 2012, multiple smaller study societies merged at the request of the university to form Sv. Ingenium. During my tenure, I oversaw financial operations, ensuring the society's stability and growth. I also played a key role in organizing educational international trips to CERN (Switzerland) and Volvo (Sweden), among others.
|
|
||||||
In late 2014, Sv. Ingenium merged with a larger society to become Ingenium Cabo Bianci.`,
|
|
||||||
skills: [
|
|
||||||
{
|
|
||||||
name: "Finances|Communication",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: "Organization",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Chellomedia / Film1",
|
|
||||||
city: "Amsterdam",
|
|
||||||
url: "http://film1.nl/",
|
|
||||||
jobTitle: "Internship",
|
|
||||||
startDate: new Date(2008, 2, 1),
|
|
||||||
endDate: new Date(2008, 5, 30),
|
|
||||||
description: `My internship at Chellomedia/Film1 immersed me in the world of digital media and caffeine. Apart from crafting animated banners and modifying movie promotional websites with ActionScript 3, I discovered a hidden talent for serving coffee that kept the team energized and creatively fueled. `,
|
|
||||||
skills: [
|
|
||||||
{
|
|
||||||
name: "Teamwork|Communication",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Pressofoon B.V.",
|
|
||||||
city: "Heemskerk",
|
|
||||||
jobTitle: "Internship",
|
|
||||||
startDate: new Date(2007, 8, 1),
|
|
||||||
endDate: new Date(2009, 11, 31),
|
|
||||||
description: `My internship at Pressofoon B.V. was an opportunity to learn and contribute alongside experienced professionals. Guided by mentors, I applied my developing programming skills, crafting JavaScript, HTML, and PHP scripts for multiple websites. I also assisted in redesigning the company website, learning from the design team's expertise. Alongside these technical contributions, I observed and participated in a new product launch, gaining valuable insights into product marketing and customer engagement. Throughout my internship, I strived to be a team player, collaborating effectively to achieve common goals.`,
|
|
||||||
skills: [
|
|
||||||
{
|
|
||||||
name: "Teamwork|Communication",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
] satisfies ExperienceType[];
|
|
||||||
122
src/skills/skills.dataset.ts
Normal file
122
src/skills/skills.dataset.ts
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
import { SkillType } from "@/skills/skills.types";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
getData: () =>
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name: "Git",
|
||||||
|
description:
|
||||||
|
"Efficiently manage Git repositories, handling pull/merge requests, and ensuring version control integrity.",
|
||||||
|
category: "Version control systems",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "NodeJs, TypeScript, and Javascript",
|
||||||
|
description: "Develop and maintain scalable microservices using NodeJs, TypeScript, and Javascript.",
|
||||||
|
category: "Programming languages",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Docker",
|
||||||
|
description:
|
||||||
|
"Containerize and orchestrate microservices in local development environments using Docker.",
|
||||||
|
category: "Containerization",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Kubernetes",
|
||||||
|
description: "Deploy and manage containerized microservices on AWS (EKS) using Kubernetes.",
|
||||||
|
category: "Containerization",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "EKS",
|
||||||
|
description: "Administer and optimize Elastic Kubernetes Service (EKS) on AWS.",
|
||||||
|
category: "AWS",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "API Gateway",
|
||||||
|
description: "Design, implement, and deploy cloud-based applications using API Gateway on AWS.",
|
||||||
|
category: "AWS",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Lambda",
|
||||||
|
description: "Develop and deploy serverless cloud-based applications using Lambda on AWS.",
|
||||||
|
category: "AWS",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CloudWatch",
|
||||||
|
description: "Monitor and analyze cloud-based applications using CloudWatch on AWS.",
|
||||||
|
category: "AWS",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ElasticSearch, Logstash and Kibana (ELK Stack)",
|
||||||
|
description:
|
||||||
|
"Extract valuable insights and generate comprehensive statistics from SaaS platform data using the ELK Stack.",
|
||||||
|
category: "Business Intelligence",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CI/CD pipelines",
|
||||||
|
description: "Automate testing, building, and deployment processes using CI/CD pipelines.",
|
||||||
|
category: "DevOps",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Server Management",
|
||||||
|
description: "Configure, maintain, and troubleshoot hosting servers to ensure optimal performance.",
|
||||||
|
category: "DevOps",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Webhosting",
|
||||||
|
description: "Provision and manage web hosting environments for websites and email services.",
|
||||||
|
category: "DevOps",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Web development",
|
||||||
|
description: "Design and develop custom WordPress websites using industry best practices.",
|
||||||
|
category: "Web development",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "PHP",
|
||||||
|
description: "Build and maintain dynamic websites and applications using PHP Laravel framework.",
|
||||||
|
category: "Programming languages",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "One-on-ones",
|
||||||
|
description:
|
||||||
|
"Conduct regular one-on-one meetings with junior developers and interns to guide their professional growth.",
|
||||||
|
category: "Team Management",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Scrum Master",
|
||||||
|
description:
|
||||||
|
"Facilitate Scrum meetings, manage sprint backlogs, refine user stories, and collaborate with the Product Owner.",
|
||||||
|
category: "Collaboration",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Finances",
|
||||||
|
description:
|
||||||
|
"Oversee financial operations, manage budgets, and ensure financial compliance for a student organization.",
|
||||||
|
category: "Finance",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Event Organization",
|
||||||
|
description:
|
||||||
|
"Plan, organize, and execute educational events for students, ensuring engaging and informative experiences.",
|
||||||
|
category: "Organization",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Communication",
|
||||||
|
description:
|
||||||
|
"Effectively communicate ideas and information both verbally and in writing, adapting communication style to suit the audience and purpose.",
|
||||||
|
category: "Collaboration",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Problem-solving",
|
||||||
|
description:
|
||||||
|
"Apply analytical and creative thinking to identify, analyze, and resolve complex technical challenges, considering multiple perspectives and potential solutions.",
|
||||||
|
category: "Problem-solving",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Teamwork",
|
||||||
|
description:
|
||||||
|
"Collaborate effectively with team members in a Scrum environment, sharing knowledge, providing constructive feedback, and contributing to a positive and productive team dynamic.",
|
||||||
|
category: "Collaboration",
|
||||||
|
},
|
||||||
|
] satisfies SkillType[],
|
||||||
|
};
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { Test, TestingModule } from "@nestjs/testing";
|
import { Test, TestingModule } from "@nestjs/testing";
|
||||||
import { SkillsService } from "./skills.service";
|
import { SkillsService } from "./skills.service";
|
||||||
import { skills } from "@/skills/skills";
|
import skillsDataset from "@/skills/skills.dataset";
|
||||||
|
|
||||||
describe("SkillsService", () => {
|
describe("SkillsService", () => {
|
||||||
let service: SkillsService;
|
let service: SkillsService;
|
||||||
|
|
@ -10,22 +10,24 @@ describe("SkillsService", () => {
|
||||||
providers: [SkillsService],
|
providers: [SkillsService],
|
||||||
}).compile();
|
}).compile();
|
||||||
|
|
||||||
skills.splice(0);
|
jest.spyOn(skillsDataset, "getData").mockImplementation(() => [
|
||||||
skills.push({
|
{
|
||||||
name: "Writing tests",
|
name: "Writing tests",
|
||||||
description: "Writing tests",
|
description: "Writing tests",
|
||||||
category: "Testing",
|
category: "Testing",
|
||||||
});
|
},
|
||||||
skills.push({
|
{
|
||||||
name: "TDD",
|
name: "TDD",
|
||||||
description: "Test Driven Development",
|
description: "Test Driven Development",
|
||||||
category: "Testing",
|
category: "Testing",
|
||||||
});
|
},
|
||||||
skills.push({
|
{
|
||||||
name: "OOP",
|
name: "OOP",
|
||||||
description: "Object Orientated Programming",
|
description: "Object Orientated Programming",
|
||||||
category: "Programming style",
|
category: "Programming style",
|
||||||
});
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
service = module.get<SkillsService>(SkillsService);
|
service = module.get<SkillsService>(SkillsService);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,15 @@
|
||||||
import { Injectable } from "@nestjs/common";
|
import { Injectable } from "@nestjs/common";
|
||||||
import { SkillDto, SkillType } from "@/skills/skills.types";
|
import { SkillDto, SkillType } from "@/skills/skills.types";
|
||||||
import { skills } from "@/skills/skills";
|
import skillsDataset from "@/skills/skills.dataset";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class SkillsService {
|
export class SkillsService {
|
||||||
private readonly skills: readonly SkillDto[];
|
private readonly skills: readonly SkillDto[];
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.skills = SkillDto.asDto(skills).sort((skillA, skillB) => (skillA.category > skillB.category ? 1 : -1));
|
this.skills = SkillDto.asDto(skillsDataset.getData()).sort((skillA, skillB) =>
|
||||||
|
skillA.category > skillB.category ? 1 : -1
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
getMany(filter?: Partial<SkillType>) {
|
getMany(filter?: Partial<SkillType>) {
|
||||||
|
|
|
||||||
|
|
@ -1,118 +0,0 @@
|
||||||
import { SkillType } from "@/skills/skills.types";
|
|
||||||
|
|
||||||
export const skills: SkillType[] = [
|
|
||||||
{
|
|
||||||
name: "Git",
|
|
||||||
description:
|
|
||||||
"Efficiently manage Git repositories, handling pull/merge requests, and ensuring version control integrity.",
|
|
||||||
category: "Version control systems",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "NodeJs, TypeScript, and Javascript",
|
|
||||||
description: "Develop and maintain scalable microservices using NodeJs, TypeScript, and Javascript.",
|
|
||||||
category: "Programming languages",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Docker",
|
|
||||||
description: "Containerize and orchestrate microservices in local development environments using Docker.",
|
|
||||||
category: "Containerization",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Kubernetes",
|
|
||||||
description: "Deploy and manage containerized microservices on AWS (EKS) using Kubernetes.",
|
|
||||||
category: "Containerization",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "EKS",
|
|
||||||
description: "Administer and optimize Elastic Kubernetes Service (EKS) on AWS.",
|
|
||||||
category: "AWS",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "API Gateway",
|
|
||||||
description: "Design, implement, and deploy cloud-based applications using API Gateway on AWS.",
|
|
||||||
category: "AWS",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Lambda",
|
|
||||||
description: "Develop and deploy serverless cloud-based applications using Lambda on AWS.",
|
|
||||||
category: "AWS",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "CloudWatch",
|
|
||||||
description: "Monitor and analyze cloud-based applications using CloudWatch on AWS.",
|
|
||||||
category: "AWS",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "ElasticSearch, Logstash and Kibana (ELK Stack)",
|
|
||||||
description:
|
|
||||||
"Extract valuable insights and generate comprehensive statistics from SaaS platform data using the ELK Stack.",
|
|
||||||
category: "Business Intelligence",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "CI/CD pipelines",
|
|
||||||
description: "Automate testing, building, and deployment processes using CI/CD pipelines.",
|
|
||||||
category: "DevOps",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Server Management",
|
|
||||||
description: "Configure, maintain, and troubleshoot hosting servers to ensure optimal performance.",
|
|
||||||
category: "DevOps",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Webhosting",
|
|
||||||
description: "Provision and manage web hosting environments for websites and email services.",
|
|
||||||
category: "DevOps",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Web development",
|
|
||||||
description: "Design and develop custom WordPress websites using industry best practices.",
|
|
||||||
category: "Web development",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "PHP",
|
|
||||||
description: "Build and maintain dynamic websites and applications using PHP Laravel framework.",
|
|
||||||
category: "Programming languages",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "One-on-ones",
|
|
||||||
description:
|
|
||||||
"Conduct regular one-on-one meetings with junior developers and interns to guide their professional growth.",
|
|
||||||
category: "Team Management",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Scrum Master",
|
|
||||||
description:
|
|
||||||
"Facilitate Scrum meetings, manage sprint backlogs, refine user stories, and collaborate with the Product Owner.",
|
|
||||||
category: "Collaboration",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Finances",
|
|
||||||
description:
|
|
||||||
"Oversee financial operations, manage budgets, and ensure financial compliance for a student organization.",
|
|
||||||
category: "Finance",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Event Organization",
|
|
||||||
description:
|
|
||||||
"Plan, organize, and execute educational events for students, ensuring engaging and informative experiences.",
|
|
||||||
category: "Organization",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Communication",
|
|
||||||
description:
|
|
||||||
"Effectively communicate ideas and information both verbally and in writing, adapting communication style to suit the audience and purpose.",
|
|
||||||
category: "Collaboration",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Problem-solving",
|
|
||||||
description:
|
|
||||||
"Apply analytical and creative thinking to identify, analyze, and resolve complex technical challenges, considering multiple perspectives and potential solutions.",
|
|
||||||
category: "Problem-solving",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Teamwork",
|
|
||||||
description:
|
|
||||||
"Collaborate effectively with team members in a Scrum environment, sharing knowledge, providing constructive feedback, and contributing to a positive and productive team dynamic.",
|
|
||||||
category: "Collaboration",
|
|
||||||
},
|
|
||||||
] satisfies SkillType[];
|
|
||||||
Loading…
Reference in a new issue