Passed
Push — dev ( b9ff43...d72998 )
by
unknown
04:36
created

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

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 179
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 107
mnd 3
bc 3
fnc 0
dl 0
loc 179
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 ExperienceSkills attached to an Experience.
108
 *
109
 * @param experienceSkills Array of all ExperienceSkill objects.
110
 * @param experience Experience object.
111
 * @returns A filtered array of ExperienceSkill objects attached to experience.
112
 */
113
export const getExperienceSkillsOfExperience = (
114
  experienceSkills: ExperienceSkill[],
115
  experience: Experience,
116
): ExperienceSkill[] => {
117
  return experienceSkills.filter(
118
    (experienceSkill) =>
119
      experience.type === experienceSkill.experience_type &&
120
      experience.id === experienceSkill.experience_id,
121
  );
122
};
123
124
/**
125
 * Returns list of Skills attached to an Experience.
126
 *
127
 * @param experienceSkills Array of ExperienceSkill objects.
128
 * @param experience Experience object.
129
 * @param skill Skill object.
130
 * @returns An Array of Skill objects
131
 */
132
export const getSkillsOfExperience = (
133
  experienceSkills: ExperienceSkill[],
134
  experience: Experience,
135
  skills: Skill[],
136
): Skill[] => {
137
  const experienceSkillsByType = getExperienceSkillsOfExperience(
138
    experienceSkills,
139
    experience,
140
  );
141
142
  const experiencesBySkillId = mapToObject(
143
    experienceSkillsByType,
144
    (item) => item.skill_id,
145
  );
146
  return skills.filter((skill) => hasKey(experiencesBySkillId, skill.id));
147
};
148
149
/**
150
 * Returns a list of all essential skills that haven't been connected to a experience yet.
151
 *
152
 * @param experienceSkills Array of ExperienceSkill objects.
153
 * @param experiences Array of Experience objects.
154
 * @param essentialSkills Array of Skill objects (essential skills).
155
 * @returns An Array of Skill objects
156
 */
157
export const getDisconnectedRequiredSkills = (
158
  experiences: Experience[],
159
  experienceSkills: ExperienceSkill[],
160
  essentialSkills: Skill[],
161
): Skill[] => {
162
  const connectedRequiredSkills = experiences.reduce(
163
    (skills: Skill[], experience: Experience) => {
164
      const requiredSkills = getSkillsOfExperience(
165
        experienceSkills,
166
        experience,
167
        essentialSkills,
168
      ).filter((skill) => !skills.includes(skill));
169
170
      return [...skills, ...requiredSkills];
171
    },
172
    [],
173
  );
174
175
  return essentialSkills.filter(
176
    (skill) => !connectedRequiredSkills.includes(skill),
177
  );
178
};
179