Passed
Push — feature/application-review-ui ( afbf92 )
by Chris
06:55
created

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

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 104
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 64
mnd 3
bc 3
fnc 0
dl 0
loc 104
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 getExperienceOfExperienceSkills = (
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
  );
77
  if (
78
    filteredExperienceSkills.length === 1 &&
79
    filteredExperienceSkills[0].justification
80
  ) {
81
    return filteredExperienceSkills[0].justification;
82
  }
83
  return "";
84
};
85
86
export const getIrrelevantSkillCount = (
87
  criteria: Criteria[],
88
  experience: Experience,
89
  experienceSkills: ExperienceSkill[],
90
): number => {
91
  const relatedSkills = experienceSkills.filter(
92
    (experienceSkill) =>
93
      experienceSkill.experience_type === experience.type &&
94
      experienceSkill.experience_id === experience.id,
95
  );
96
  const irrelevantSkills = relatedSkills.filter(
97
    (experienceSkill) =>
98
      !criteria.some(
99
        (criterion) => criterion.skill_id === experienceSkill.skill_id,
100
      ),
101
  );
102
  return irrelevantSkills.length;
103
};
104