-
Notifications
You must be signed in to change notification settings - Fork 0
/
get-projects.ts
57 lines (45 loc) · 1.57 KB
/
get-projects.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
'use server';
import { getLang } from '@/shared/config/i18n';
import { CategoryMetadata, getMdx, ProjectMetadata } from '@/shared/config/mdx';
import fs from 'fs/promises';
import path from 'path';
import { ProjectsResponse } from '../types/project.type';
export async function getProjects(): Promise<ProjectsResponse[]> {
const lang = await getLang();
const rootDir = path.join(process.cwd(), 'projects');
const categoryDirs = await fs.readdir(rootDir, { withFileTypes: true });
const projectsByCategory: ProjectsResponse[] = [];
for (const dirent of categoryDirs) {
if (dirent.isDirectory()) {
const categoryDir = path.join(rootDir, dirent.name);
const projectFile = path.join(categoryDir, `${lang}.mdx`);
const mdxCategory = await getMdx<CategoryMetadata>(projectFile);
const metadataCategory = mdxCategory.metadata;
const projectDirs = await fs.readdir(categoryDir, {
withFileTypes: true,
});
const projects: ProjectMetadata[] = [];
for (const projectDirent of projectDirs) {
if (projectDirent.isDirectory()) {
const projectFile = path.join(
categoryDir,
projectDirent.name,
`${lang}.mdx`,
);
const mdxProject = await getMdx<CategoryMetadata>(projectFile);
const projectMetadata = mdxProject.metadata;
projects.push({
...projectMetadata,
link: `/projects/${dirent.name}/${projectDirent.name}`,
} as ProjectMetadata);
}
}
projectsByCategory.push({
title: metadataCategory.title,
link: `/projects/${dirent.name}`,
projects,
});
}
}
return projectsByCategory;
}