Passed
Push — dev ( 215397...f312c9 )
by Tristan
06:19 queued 16s
created

resources/assets/js/components/Application/helpers.ts   A

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 162
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 99
mnd 3
bc 3
fnc 0
dl 0
loc 162
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import {
2
  Criteria,
3
  Experience,
4
  ExperienceSkill,
5
  Skill,
6
} from "../../models/types";
7
import { mapToObject, getId, hasKey } from "../../helpers/queries";
8
9
/**
10
 * Retrieves Skill associated to Criterion by ID.
11
 *
12
 * @param criterion Criteria object.
13
 * @param skills Array of Skill objects.
14
 * @returns null if not found or Skill object.
15
 */
16
export const getSkillOfCriteria = (
17
  criterion: Criteria,
18
  skills: Skill[],
19
): Skill | null => {
20
  const skillsById = mapToObject(skills, getId);
21
  return hasKey(skillsById, criterion.skill_id)
22
    ? skillsById[criterion.skill_id]
23
    : null;
24
};
25
26
/**
27
 * Retrieves array of ExperienceSkill objects associated to
28
 * Skill by ID.
29
 * @param skill Skill object.
30
 * @param experiences Array of ExperienceSkill objects.
31
 * @returns Array of ExperienceSkill objects.
32
 */
33
export const getExperiencesOfSkill = (
34
  skill: Skill,
35
  experiences: ExperienceSkill[],
36
): ExperienceSkill[] =>
37
  experiences.filter((experience) => experience.skill_id === skill.id);
38
39
/**
40
 * Retrieves Experience associated to ExperienceSkill by Type and ID.
41
 *
42
 * @param experienceSkill ExperienceSkill object.
43
 * @param experiences Array of ExperienceSkill objects.
44
 * @returns null if not found or Experience object.
45
 */
46
export const getExperienceOfExperienceSkill = (
47
  experienceSkill: ExperienceSkill,
48
  experiences: Experience[],
49
): Experience | null => {
50
  const experiencesByType = experiences.filter(
51
    (experience) => experience.type === experienceSkill.experience_type,
52
  );
53
  const experiencesById = mapToObject(experiencesByType, getId);
54
  return hasKey(experiencesById, experienceSkill.experience_id)
55
    ? experiencesById[experienceSkill.experience_id]
56
    : null;
57
};
58
59
/**
60
 * Returns a justification for a combination Skill and Experience record.
61
 *
62
 * @param skill Skill object.
63
 * @param experience Experience object.
64
 * @param experienceSkills Array of ExperienceSkill objects.
65
 * @returns null if not found or Experience object.
66
 */
67
export const getJustificationOfExperience = (
68
  skill: Skill,
69
  experience: Experience,
70
  experienceSkills: ExperienceSkill[],
71
): string => {
72
  const filteredExperienceSkills = experienceSkills.filter(
73
    (experienceSkill) =>
74
      experienceSkill.skill_id === skill.id &&
75
      experienceSkill.experience_id === experience.id &&
76
      experienceSkill.experience_type === experience.type,
77
  );
78
  if (
79
    filteredExperienceSkills.length === 1 &&
80
    filteredExperienceSkills[0].justification
81
  ) {
82
    return filteredExperienceSkills[0].justification;
83
  }
84
  return "";
85
};
86
87
export const getIrrelevantSkillCount = (
88
  criteria: Criteria[],
89
  experience: Experience,
90
  experienceSkills: ExperienceSkill[],
91
): number => {
92
  const relatedSkills = experienceSkills.filter(
93
    (experienceSkill) =>
94
      experienceSkill.experience_type === experience.type &&
95
      experienceSkill.experience_id === experience.id,
96
  );
97
  const irrelevantSkills = relatedSkills.filter(
98
    (experienceSkill) =>
99
      !criteria.some(
100
        (criterion) => criterion.skill_id === experienceSkill.skill_id,
101
      ),
102
  );
103
  return irrelevantSkills.length;
104
};
105
106
/**
107
 * Returns list of Skills attached to an Experience.
108
 *
109
 * @param experienceSkills Array of ExperienceSkill objects.
110
 * @param experience Experience object.
111
 * @param skill Skill object.
112
 * @returns An Array of Skill objects
113
 */
114
export const getSkillsOfExperience = (
115
  experienceSkills: ExperienceSkill[],
116
  experience: Experience,
117
  skills: Skill[],
118
): Skill[] => {
119
  const experienceSkillsByType = experienceSkills.filter(
120
    (experienceSkill) =>
121
      experience.type === experienceSkill.experience_type &&
122
      experience.id === experienceSkill.experience_id,
123
  );
124
125
  const experiencesBySkillId = mapToObject(
126
    experienceSkillsByType,
127
    (item) => item.skill_id,
128
  );
129
  return skills.filter((skill) => hasKey(experiencesBySkillId, skill.id));
130
};
131
132
/**
133
 * Returns a list of all essential skills that haven't been connected to a experience yet.
134
 *
135
 * @param experienceSkills Array of ExperienceSkill objects.
136
 * @param experiences Array of Experience objects.
137
 * @param essentialSkills Array of Skill objects (essential skills).
138
 * @returns An Array of Skill objects
139
 */
140
export const getDisconnectedRequiredSkills = (
141
  experiences: Experience[],
142
  experienceSkills: ExperienceSkill[],
143
  essentialSkills: Skill[],
144
): Skill[] => {
145
  const connectedRequiredSkills = experiences.reduce(
146
    (skills: Skill[], experience: Experience) => {
147
      const requiredSkills = getSkillsOfExperience(
148
        experienceSkills,
149
        experience,
150
        essentialSkills,
151
      ).filter((skill) => !skills.includes(skill));
152
153
      return [...skills, ...requiredSkills];
154
    },
155
    [],
156
  );
157
158
  return essentialSkills.filter(
159
    (skill) => !connectedRequiredSkills.includes(skill),
160
  );
161
};
162