36 lines
1.5 KiB
TypeScript
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()
|
|
}
|
|
})
|
|
}
|
|
}
|