core/src/libs/careers.ts
Luciano Giacchetta e953cc454e
All checks were successful
CodyOps Core Builder / build-conteiner (pull_request) Successful in 6m6s
#13: Dynamically populate header careers dropdown
2025-08-21 13:42:47 -03:00

77 lines
2.4 KiB
TypeScript

import directus from './directus';
import { readItems, type Query } from '@directus/sdk';
import type { CodyopsCareers, Careers } from '../types/codyops-careers';
import { sumTimes } from '../utils/time';
const isDev = import.meta.env.DEV; // Astro's way to check for development mode
export async function getCareers(): Promise<Careers[]> {
const careers = await directus.request(
readItems<CodyopsCareers, 'codyops_careers', Query<CodyopsCareers, Careers>>('codyops_careers', {
fields: [
'slug',
'status',
'name',
'description',
'banner',
{
courses: [
{
codyops_courses_id: [
'name',
'level',
'category',
{
modules: [
'duration'
]
}
],
},
],
},
],
filter: {
status: isDev ? { '_neq': 'archived' } : { '_eq': 'published' }
},
})
);
const careersWithCalculatedHours = careers.map(career => {
let totalCareerMinutes = 0;
const coursesWithCalculatedHours = career.courses.map(courseItem => {
const course = courseItem.codyops_courses_id;
if (course && course.modules) {
const moduleDurations = course.modules
.map(module => module.duration)
.filter((duration): duration is string => duration !== undefined && duration !== null); // Filter out undefined/null
const { hours, minutes } = sumTimes(moduleDurations);
const totalCourseMinutes = (hours * 60) + minutes;
totalCareerMinutes += totalCourseMinutes;
return {
...courseItem,
codyops_courses_id: {
...course,
totalCourseHours: hours + (minutes / 60), // Store as decimal hours
totalCourseMinutes: totalCourseMinutes,
}
};
}
return courseItem;
});
const totalCareerHours = Math.floor(totalCareerMinutes / 60);
const remainingCareerMinutes = totalCareerMinutes % 60;
return {
...career,
courses: coursesWithCalculatedHours,
totalCareerHours: totalCareerHours + (remainingCareerMinutes / 60), // Store as decimal hours
totalCareerMinutes: totalCareerMinutes,
};
});
return careersWithCalculatedHours;
}