CV/src/experiences/experiences.service.ts

39 lines
1.6 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: readonly 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 Array<[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: readonly SkillDto[] }> {
return experiences.map((experience) => {
return {
...experience,
skills: experience.skills.map((partialSkill) => this.skillsService.getMany(partialSkill)).flat(),
};
});
}
}