Compare commits

..

6 Commits

Author SHA1 Message Date
Kamran Ahmed
67530bdbc5 Update .github/workflows/sync-content-to-repo.yml 2025-08-20 13:47:16 +01:00
Kamran Ahmed
29162e9de1 Update .github/workflows/sync-content-to-repo.yml 2025-08-20 13:46:05 +01:00
Arik Chakma
fe047b23db fix: sync repo to db 2025-08-20 14:38:44 +06:00
Arik Chakma
8841fe1ce8 chore: sync repo to database 2025-08-20 13:57:24 +06:00
Arik Chakma
819550f0b0 fix: replace the api endpoint 2025-08-20 12:28:03 +06:00
Arik Chakma
ea0934b0bd chore: sync content to repo 2025-08-20 12:19:06 +06:00
8 changed files with 23 additions and 59 deletions

View File

@@ -54,7 +54,7 @@ jobs:
automated pr
reviewers: arikchakma
commit-message: "chore: sync content to repo"
title: "chore: sync content to repository"
title: "Sync Content to Repo - Automated"
body: |
## Sync Content to Repo

View File

@@ -10,7 +10,6 @@ on:
jobs:
sync-on-changes:
runs-on: ubuntu-latest
if: github.actor != 'github-actions[bot]' && github.actor != 'dependabot[bot]'
steps:
- uses: actions/checkout@v4
with:
@@ -64,4 +63,4 @@ jobs:
echo "Changed files: ${{ steps.changed-files.outputs.changed_files }}"
# Run your script with the changed file paths
npm run sync:repo-to-database -- --files="${{ steps.changed-files.outputs.changed_files }}" --secret=${{ secrets.GH_SYNC_SECRET }}
npm run sync:repo-to-database -- --files="${{ steps.changed-files.outputs.changed_files }}" --secret=${{ secrets.TOPIC_CONTENT_SYNC_SECRET }}

View File

@@ -2,7 +2,6 @@ import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { slugify } from '../src/lib/slugger';
import type { OfficialRoadmapDocument } from '../src/queries/official-roadmap';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
@@ -44,6 +43,7 @@ export interface OfficialRoadmapTopicContentDocument {
_id?: string;
roadmapSlug: string;
nodeId: string;
title: string;
description: string;
resources: OfficialRoadmapTopicResource[];
createdAt: Date;
@@ -68,25 +68,6 @@ export async function roadmapTopics(
return data;
}
export async function fetchRoadmapJson(
roadmapId: string,
): Promise<OfficialRoadmapDocument> {
const response = await fetch(
`https://roadmap.sh/api/v1-official-roadmap/${roadmapId}`,
);
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;
}
// Directory containing the roadmaps
const ROADMAP_CONTENT_DIR = path.join(
__dirname,
@@ -95,27 +76,12 @@ const ROADMAP_CONTENT_DIR = path.join(
);
const allTopics = await roadmapTopics(roadmapSlug, secret);
const roadmap = await fetchRoadmapJson(roadmapSlug);
const { nodes } = roadmap;
for (const topic of allTopics) {
const { nodeId } = topic;
const { title, nodeId } = topic;
const node = nodes.find((node) => node.id === nodeId);
if (!node) {
console.error(`Node not found: ${nodeId}`);
continue;
}
const topicSlug = `${slugify(title)}@${nodeId}.md`;
const label = node?.data?.label as string;
if (!label) {
console.error(`Label not found: ${nodeId}`);
continue;
}
const topicSlug = `${slugify(label)}@${nodeId}.md`;
const topicPath = path.join(ROADMAP_CONTENT_DIR, 'content', topicSlug);
const topicPath = path.join(ROADMAP_CONTENT_DIR, topicSlug);
const topicDir = path.dirname(topicPath);
const topicDirExists = await fs
.stat(topicDir)
@@ -133,10 +99,12 @@ for (const topic of allTopics) {
function prepareTopicContent(topic: OfficialRoadmapTopicContentDocument) {
const { description, resources = [] } = topic;
let content = description;
if (resources.length > 0) {
content += `\n\nVisit the following resources to learn more:\n\n${resources.map((resource) => `- [@${resource.type}@${resource.title}](${resource.url})`).join('\n')}`;
}
const content = `${description}
Visit the following resources to learn more:
${resources.map((resource) => `- [@${resource.type}@${resource.title}](${resource.url})`).join('\n')}
`.trim();
return content;
}

View File

@@ -1,6 +1,7 @@
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { slugify } from '../src/lib/slugger';
import type { OfficialRoadmapDocument } from '../src/queries/official-roadmap';
import { parse } from 'node-html-parser';
import { markdownToHtml } from '../src/lib/markdown';
@@ -191,8 +192,9 @@ try {
const htmlStringWithoutLinks = rootHtml.toString();
const description = htmlToMarkdown(htmlStringWithoutLinks);
const updatedDescription =
`# ${title?.textContent}\n\n${description}`.trim();
const updatedDescription = `# ${title?.textContent}
${description}`.trim();
const label = node?.data?.label as string;
if (!label) {
@@ -203,6 +205,7 @@ try {
topics.push({
roadmapSlug,
nodeId,
title: label,
description: updatedDescription,
resources: listLinks,
});

View File

@@ -25,7 +25,7 @@ export function ForkCourseAlert(props: ForkCourseAlertProps) {
)}
>
<p className="text-sm text-balance">
Fork the course to track you progress and make changes to the course.
Fork the course to track progress and make changes to the course.
</p>
<button

View File

@@ -4,9 +4,9 @@ pdfUrl: '/pdfs/roadmaps/data-engineer.pdf'
order: 4.6
renderer: "editor"
briefTitle: 'Data Engineer'
briefDescription: 'Step by step guide to becoming a Data Engineer in 2025'
briefDescription: 'Step by step guide to becoming an Data Engineer in 2025'
title: 'Data Engineer Roadmap'
description: 'Step by step guide to becoming a Data Engineer in 2025'
description: 'Step by step guide to becoming an Data Engineer in 2025'
hasTopics: true
isNew: true
dimensions:
@@ -28,17 +28,17 @@ courses:
title: 'Founder - roadmap.sh'
schema:
headline: 'Data Engineer Roadmap'
description: 'Learn how to become a Data Engineer with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.'
description: 'Learn how to become an Data Engineer with this interactive step by step guide in 2025. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.'
imageUrl: 'https://roadmap.sh/roadmaps/data-engineer.png'
datePublished: '2025-08-13'
dateModified: '2025-08-13'
seo:
title: 'Data Engineer Roadmap'
description: 'Learn to become a Data Engineer using this roadmap. Community driven, articles, resources, guides, interview questions, quizzes for modern data engineers.'
description: 'Learn to become an Data Engineer using this roadmap. Community driven, articles, resources, guides, interview questions, quizzes for modern data engineers.'
keywords:
- 'data engineer roadmap 2025'
- 'data engineering roadmap 2025'
- 'guide to becoming a data engineer'
- 'guide to becoming an data engineer'
- 'easy data engineer roadmap'
- 'data engineer'
- 'data engineer roadmap'

View File

@@ -1,3 +0,0 @@
# Introduction to Machine Learning
Machine learning is about creating computer programs that can learn from data. Instead of being explicitly programmed to perform a task, these programs improve their performance on a specific task as they are exposed to more data. This learning process allows them to make predictions or decisions without being directly told how to do so.

View File

@@ -1,3 +0,0 @@
# ML Engineer
An ML Engineer focuses on building, deploying, and maintaining machine learning systems in production. They bridge the gap between data science and software engineering, taking models developed by data scientists and making them scalable, reliable, and efficient for real-world applications. This involves tasks like data pipeline construction, model deployment, performance monitoring, and infrastructure management.