CV/src/experiences/experiences.service.ts

36 lines
1.5 KiB
TypeScript

import { Injectable } from "@nestjs/common";
import { ExperienceDto, ExperienceType } from "@/experiences/experiences.types";
import { SkillsService } from "@/skills/skills.service";
import { experiences } from "@/experiences/experiences";
import { SkillDto } from "@/skills/skills.types";
@Injectable()
export class ExperiencesService {
private readonly experiences: ReadonlyArray<ExperienceDto>;
constructor(
private readonly skillsService: SkillsService
) {
this.experiences = ExperienceDto.asDto(this.linkSkills(experiences))
.sort((experienceA, experienceB) => experienceA.startDate > experienceB.startDate ? 1 : -1);
}
getMany(filter?: Partial<Omit<ExperienceType, "startDate" | "endDate" | "skills">>) {
const filtersValues = Object.entries(filter ?? {}).map(([key, filterValue]) => ([key, new RegExp(filterValue, "i")])) as [keyof Omit<ExperienceType, "startDate" | "endDate" | "skills">, RegExp][];
if (!filter || filtersValues.length === 0) {
return this.experiences;
}
return this.experiences.filter((experience) => filtersValues.every(([key, filterValue]) => filterValue.test(experience[key])));
}
private linkSkills(experiences: ExperienceType[]): Array<ExperienceType & { skills: ReadonlyArray<SkillDto> }> {
return experiences.map((experience) => {
return {
...experience,
skills: experience.skills.map(partialSkill => this.skillsService.getMany(partialSkill)).flat()
}
})
}
}