39 lines
1.6 KiB
TypeScript
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(),
|
|
};
|
|
});
|
|
}
|
|
}
|