1
0
mirror of https://github.com/kamranahmedse/developer-roadmap.git synced 2025-09-25 16:39:02 +02:00

Update roadmap json endpoint

This commit is contained in:
Kamran Ahmed
2025-05-21 12:47:40 +01:00
parent a1c564534a
commit 4b86af3a70

View File

@@ -1,29 +1,87 @@
import type { APIRoute } from 'astro'; import type { APIRoute } from 'astro';
import path from 'node:path';
import fs from 'node:fs';
import matter from 'gray-matter';
import { fileURLToPath } from 'node:url';
export const prerender = true; export const prerender = false;
export async function getStaticPaths() { // Get the project root directory
const roadmapJsons = import.meta.glob('/src/data/roadmaps/**/*.json', { const __filename = fileURLToPath(import.meta.url);
eager: true, const __dirname = path.dirname(__filename);
});
return Object.keys(roadmapJsons).map((filePath) => { // hack to make it work. TODO: Fix
const roadmapId = filePath.split('/').pop()?.replace('.json', ''); const projectRoot = path.resolve(__dirname, '../..').replace(/dist$/, '');
const roadmapJson = roadmapJsons[filePath] as Record<string, any>;
return { export async function fetchRoadmapJson(roadmapId: string) {
params: { const response = await fetch(
roadmapId, `https://roadmap.sh/api/v1-official-roadmap/${roadmapId}`,
}, );
props: {
roadmapJson: roadmapJson?.default, if (!response.ok) {
}, throw new Error(`Failed to fetch roadmap json: ${response.statusText}`);
}; }
});
const data = await response.json();
if (data.error) {
throw new Error(`Failed to fetch roadmap json: ${data.error}`);
}
return data;
} }
export const GET: APIRoute = async function ({ params, request, props }) { export const GET: APIRoute = async function ({ params, request, props }) {
return new Response(JSON.stringify(props.roadmapJson), { const { roadmapId } = params;
if (!roadmapId) {
return new Response('Roadmap ID is required', {
status: 400,
});
}
// Construct the path to the markdown file
let roadmapFilePath = path.join(
projectRoot,
'src',
'data',
'roadmaps',
roadmapId,
`${roadmapId}.md`,
);
let roadmapJsonPath = path.join(
projectRoot,
'src',
'data',
'roadmaps',
roadmapId,
`${roadmapId}.json`,
);
if (!fs.existsSync(roadmapFilePath)) {
return new Response(JSON.stringify({ error: 'Roadmap file not found' }), {
status: 404,
});
}
// Read and parse the markdown file
const fileContent = fs.readFileSync(roadmapFilePath, 'utf-8');
const { data: frontmatter, content } = matter(fileContent);
if (frontmatter.renderer !== 'editor') {
const roadmapJson = JSON.parse(fs.readFileSync(roadmapJsonPath, 'utf-8'));
return new Response(JSON.stringify(roadmapJson), {
status: 200,
headers: {
'Content-Type': 'application/json',
},
});
}
const roadmapJson = await fetchRoadmapJson(roadmapId);
return new Response(JSON.stringify(roadmapJson), {
status: 200, status: 200,
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',