diff --git a/src/cvdocs/education.ts b/src/cvdocs/education.ts index e8af285..0785003 100644 --- a/src/cvdocs/education.ts +++ b/src/cvdocs/education.ts @@ -1,7 +1,7 @@ import { EducationType } from "@/education/education.types"; import { DocumentBuilder } from "@nestjs/swagger"; import { RedocOptions } from "@juicyllama/nestjs-redoc"; -import { education } from "@/education/education"; +import { getEducationData } from "@/education/getEducationData"; const formatEducation = (education: EducationType) => { const period = `${formatDate(education.startDate)} - ${ @@ -50,7 +50,7 @@ export const addEducation = ( redocOptions.tagGroups.push(educationTagGroup); } - education.slice(0, count).forEach((education) => { + getEducationData.slice(0, count).forEach((education) => { educationTagGroup.tags.push(education.institute); document.addTag(education.institute, formatEducation(education)); }); diff --git a/src/cvdocs/experience.ts b/src/cvdocs/experience.ts index 2ab3396..0547655 100644 --- a/src/cvdocs/experience.ts +++ b/src/cvdocs/experience.ts @@ -1,7 +1,7 @@ import { ExperienceType } from "@/experiences/experiences.types"; import { DocumentBuilder } from "@nestjs/swagger"; import { RedocOptions } from "@juicyllama/nestjs-redoc"; -import { experiences } from "@/experiences/experiences"; +import { experiencesDataset } from "@/experiences/experiences.dataset"; const formatExperience = (experience: ExperienceType) => { const workPeriod = `${formatDate(experience.startDate)} - ${ @@ -50,7 +50,7 @@ export const addExperiences = ( redocOptions.tagGroups.push(experienceTagGroup); } - experiences.slice(0, count).forEach((experience) => { + experiencesDataset.slice(0, count).forEach((experience) => { experienceTagGroup.tags.push(experience.name); document.addTag(experience.name, formatExperience(experience)); }); diff --git a/src/cvdocs/skills.ts b/src/cvdocs/skills.ts index 93be08d..558cd15 100644 --- a/src/cvdocs/skills.ts +++ b/src/cvdocs/skills.ts @@ -1,6 +1,6 @@ import { DocumentBuilder } from "@nestjs/swagger"; import { RedocOptions } from "@juicyllama/nestjs-redoc"; -import { skills } from "@/skills/skills"; +import { skillsDataset } from "@/skills/skills.dataset"; export const addSkills = ( document: DocumentBuilder, @@ -18,7 +18,7 @@ export const addSkills = ( } const intro = "A short excerpt of my skills are"; - const skillList = skills + const skillList = skillsDataset .slice(0, count) .reduce((list, skill) => list.concat(`
  • ${skill.name} ${skill.description}
  • `), ""); diff --git a/src/education/education.dataset.ts b/src/education/education.dataset.ts new file mode 100644 index 0000000..3465e0b --- /dev/null +++ b/src/education/education.dataset.ts @@ -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[], +}; diff --git a/src/education/education.service.spec.ts b/src/education/education.service.spec.ts index 499545c..2951adc 100644 --- a/src/education/education.service.spec.ts +++ b/src/education/education.service.spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from "@nestjs/testing"; import { EducationService } from "@/education/education.service"; -import { education } from "@/education/education"; +import educationDataset from "@/education/education.dataset"; describe("SkillsService", () => { let service: EducationService; @@ -10,29 +10,28 @@ describe("SkillsService", () => { providers: [EducationService], }).compile(); - education.splice(0); - - education.push({ - institute: "Oxford University", - city: "Oxford", - url: "https://www.ox.ac.uk/", - course: "English", - level: "Masters", - startDate: new Date(2023, 0), - endDate: new Date(2023, 1), - description: "Got my english degree", - }); - - education.push({ - institute: "Massachusetts Institute of Technology", - city: "Cambridge", - url: "https://www.mit.edu/", - course: "Neuroscience", - level: "PHD", - startDate: new Date(2023, 2), - endDate: new Date(2023, 3), - description: "Got my PHD in neuroscience", - }); + jest.spyOn(educationDataset, "getData").mockImplementation(() => [ + { + institute: "Oxford University", + city: "Oxford", + url: "https://www.ox.ac.uk/", + course: "English", + level: "Masters", + startDate: new Date(2023, 0), + endDate: new Date(2023, 1), + description: "Got my english degree", + }, + { + institute: "Massachusetts Institute of Technology", + city: "Cambridge", + url: "https://www.mit.edu/", + course: "Neuroscience", + level: "PHD", + startDate: new Date(2023, 2), + endDate: new Date(2023, 3), + description: "Got my PHD in neuroscience", + }, + ]); service = module.get(EducationService); }); diff --git a/src/education/education.service.ts b/src/education/education.service.ts index 89b6006..56bc0c3 100644 --- a/src/education/education.service.ts +++ b/src/education/education.service.ts @@ -1,13 +1,13 @@ import { Injectable } from "@nestjs/common"; import { EducationDto, EducationType } from "@/education/education.types"; -import { education } from "@/education/education"; +import educationDataset from "@/education/education.dataset"; @Injectable() export class EducationService { private readonly education: readonly EducationDto[]; constructor() { - this.education = EducationDto.asDto(education).sort((educationA, educationB) => + this.education = EducationDto.asDto(educationDataset.getData()).sort((educationA, educationB) => educationA.startDate < educationB.startDate ? 1 : -1 ); } diff --git a/src/education/education.ts b/src/education/education.ts deleted file mode 100644 index 911b7f7..0000000 --- a/src/education/education.ts +++ /dev/null @@ -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[]; diff --git a/src/experiences/experiences.dataset.ts b/src/experiences/experiences.dataset.ts new file mode 100644 index 0000000..e0a29d7 --- /dev/null +++ b/src/experiences/experiences.dataset.ts @@ -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[], +}; diff --git a/src/experiences/experiences.service.spec.ts b/src/experiences/experiences.service.spec.ts index 5b82972..c6c1ab5 100644 --- a/src/experiences/experiences.service.spec.ts +++ b/src/experiences/experiences.service.spec.ts @@ -1,8 +1,8 @@ import { Test, TestingModule } from "@nestjs/testing"; import { ExperiencesService } from "./experiences.service"; import { SkillsService } from "@/skills/skills.service"; -import { experiences } from "@/experiences/experiences"; -import { skills } from "@/skills/skills"; +import experiencesDataset from "@/experiences/experiences.dataset"; +import skillsDataset from "@/skills/skills.dataset"; describe("ExperiencesService", () => { let service: ExperiencesService; @@ -12,53 +12,54 @@ describe("ExperiencesService", () => { providers: [ExperiencesService, SkillsService], }).compile(); - experiences.splice(0); + jest.spyOn(experiencesDataset, "getData").mockImplementation(() => [ + { + name: "Employer A", + city: "City A", + url: "https://example.com/", + jobTitle: "Tester", + startDate: new Date(2023, 0), + endDate: new Date(2023, 1), + description: `Description of work`, + skills: [ + { + category: "Testing", + }, + ], + }, + { + name: "Employer B", + city: "City B", + url: "https://example.com/", + jobTitle: "Developer", + startDate: new Date(2023, 1), + endDate: new Date(2023, 2), + description: `Description of work`, + skills: [ + { + category: "Programming", + }, + ], + }, + ]); - experiences.push({ - name: "Employer A", - city: "City A", - url: "https://example.com/", - jobTitle: "Tester", - startDate: new Date(2023, 0), - endDate: new Date(2023, 1), - description: `Description of work`, - skills: [ - { - category: "Testing", - }, - ], - }); - experiences.push({ - name: "Employer B", - city: "City B", - url: "https://example.com/", - jobTitle: "Developer", - startDate: new Date(2023, 1), - endDate: new Date(2023, 2), - description: `Description of work`, - skills: [ - { - category: "Programming", - }, - ], - }); - - skills.splice(0); - skills.push({ - name: "Writing tests", - description: "Writing tests", - category: "Testing", - }); - skills.push({ - name: "TDD", - description: "Test Driven Development", - category: "Testing", - }); - skills.push({ - name: "OOP", - description: "Object Orientated Programming", - category: "Programming style", - }); + jest.spyOn(skillsDataset, "getData").mockImplementation(() => [ + { + name: "Writing tests", + description: "Writing tests", + category: "Testing", + }, + { + name: "TDD", + description: "Test Driven Development", + category: "Testing", + }, + { + name: "OOP", + description: "Object Orientated Programming", + category: "Programming style", + }, + ]); service = module.get(ExperiencesService); }); diff --git a/src/experiences/experiences.service.ts b/src/experiences/experiences.service.ts index d9add27..434eb9d 100644 --- a/src/experiences/experiences.service.ts +++ b/src/experiences/experiences.service.ts @@ -1,7 +1,7 @@ import { Injectable } from "@nestjs/common"; import { ExperienceDto, ExperienceType } from "@/experiences/experiences.types"; import { SkillsService } from "@/skills/skills.service"; -import { experiences } from "@/experiences/experiences"; +import experiencesDataset from "@/experiences/experiences.dataset"; import { SkillDto } from "@/skills/skills.types"; @Injectable() @@ -9,8 +9,8 @@ export class ExperiencesService { private readonly experiences: readonly ExperienceDto[]; constructor(private readonly skillsService: SkillsService) { - this.experiences = ExperienceDto.asDto(this.linkSkills(experiences)).sort((experienceA, experienceB) => - experienceA.startDate < experienceB.startDate ? 1 : -1 + this.experiences = ExperienceDto.asDto(this.linkSkills(experiencesDataset.getData())).sort( + (experienceA, experienceB) => (experienceA.startDate < experienceB.startDate ? 1 : -1) ); } diff --git a/src/experiences/experiences.ts b/src/experiences/experiences.ts deleted file mode 100644 index 8437a07..0000000 --- a/src/experiences/experiences.ts +++ /dev/null @@ -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[]; diff --git a/src/skills/skills.dataset.ts b/src/skills/skills.dataset.ts new file mode 100644 index 0000000..f358ab3 --- /dev/null +++ b/src/skills/skills.dataset.ts @@ -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[], +}; diff --git a/src/skills/skills.service.spec.ts b/src/skills/skills.service.spec.ts index 4649df3..0cb82a6 100644 --- a/src/skills/skills.service.spec.ts +++ b/src/skills/skills.service.spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from "@nestjs/testing"; import { SkillsService } from "./skills.service"; -import { skills } from "@/skills/skills"; +import skillsDataset from "@/skills/skills.dataset"; describe("SkillsService", () => { let service: SkillsService; @@ -10,22 +10,24 @@ describe("SkillsService", () => { providers: [SkillsService], }).compile(); - skills.splice(0); - skills.push({ - name: "Writing tests", - description: "Writing tests", - category: "Testing", - }); - skills.push({ - name: "TDD", - description: "Test Driven Development", - category: "Testing", - }); - skills.push({ - name: "OOP", - description: "Object Orientated Programming", - category: "Programming style", - }); + jest.spyOn(skillsDataset, "getData").mockImplementation(() => [ + { + name: "Writing tests", + description: "Writing tests", + category: "Testing", + }, + { + name: "TDD", + description: "Test Driven Development", + category: "Testing", + }, + { + name: "OOP", + description: "Object Orientated Programming", + category: "Programming style", + }, + ]); + service = module.get(SkillsService); }); diff --git a/src/skills/skills.service.ts b/src/skills/skills.service.ts index 0b71144..ef1407e 100644 --- a/src/skills/skills.service.ts +++ b/src/skills/skills.service.ts @@ -1,13 +1,15 @@ import { Injectable } from "@nestjs/common"; import { SkillDto, SkillType } from "@/skills/skills.types"; -import { skills } from "@/skills/skills"; +import skillsDataset from "@/skills/skills.dataset"; @Injectable() export class SkillsService { private readonly skills: readonly SkillDto[]; 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) { diff --git a/src/skills/skills.ts b/src/skills/skills.ts deleted file mode 100644 index 84579d2..0000000 --- a/src/skills/skills.ts +++ /dev/null @@ -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[];