mirror of
https://github.com/kamranahmedse/developer-roadmap.git
synced 2025-09-02 13:52:46 +02:00
Add sponsor action
This commit is contained in:
109
bin/roadmap-ads.cjs
Normal file
109
bin/roadmap-ads.cjs
Normal file
@@ -0,0 +1,109 @@
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const yaml = require('js-yaml');
|
||||
|
||||
const apiKey = process.env.SPONSOR_SHEET_API_KEY;
|
||||
const sheetId = process.env.SPONSOR_SHEET_ID;
|
||||
|
||||
if (!apiKey || !sheetId) {
|
||||
console.error('Missing API key or sheet ID');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const sheetRange = 'A3:I1001';
|
||||
const sheetUrl = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/${sheetRange}?key=${apiKey}`;
|
||||
|
||||
function populateRoadmapAds({
|
||||
roadmapUrl,
|
||||
company,
|
||||
redirectUrl,
|
||||
imageUrl,
|
||||
adTitle,
|
||||
adDescription,
|
||||
startDate,
|
||||
endDate,
|
||||
isActive,
|
||||
}) {
|
||||
const isConfiguredActive = isActive.toLowerCase() === 'yes';
|
||||
|
||||
const currentDate = new Date();
|
||||
const isDateInRange = currentDate >= new Date(startDate) && currentDate <= new Date(endDate);
|
||||
const shouldShowAd = isConfiguredActive && isDateInRange;
|
||||
|
||||
// get id from the roadmap URL
|
||||
const roadmapId = roadmapUrl
|
||||
.split('/')
|
||||
.pop()
|
||||
.replace(/\?.+?$/, '');
|
||||
|
||||
const roadmapFilePath = path.join(__dirname, '../src/data/roadmaps', `${roadmapId}/${roadmapId}.md`);
|
||||
|
||||
if (!fs.existsSync(roadmapFilePath)) {
|
||||
console.error(`Roadmap file not found: ${roadmapFilePath}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`Updating roadmap: ${roadmapId}`);
|
||||
const roadmapFileContent = fs.readFileSync(roadmapFilePath, 'utf8');
|
||||
|
||||
const frontMatterRegex = /---\n([\s\S]*?)\n---/;
|
||||
|
||||
const existingFrontmatter = roadmapFileContent.match(frontMatterRegex)[1];
|
||||
const contentWithoutFrontmatter = roadmapFileContent.replace(frontMatterRegex, ``).trim();
|
||||
|
||||
const yamlObject = yaml.load(existingFrontmatter);
|
||||
|
||||
if (shouldShowAd) {
|
||||
yamlObject.sponsor = {
|
||||
url: redirectUrl,
|
||||
title: adTitle,
|
||||
imageUrl,
|
||||
description: adDescription,
|
||||
event: {
|
||||
category: 'SponsorClick',
|
||||
action: `${company} Redirect`,
|
||||
label: `Clicked ${company} Link`,
|
||||
},
|
||||
};
|
||||
} else {
|
||||
delete yamlObject.sponsor;
|
||||
}
|
||||
|
||||
const newFrontmatter = yaml.dump(yamlObject, { lineWidth: 10000, forceQuotes: true, quotingType: '"' });
|
||||
const newContent = `---\n${newFrontmatter}---\n\n${contentWithoutFrontmatter}`;
|
||||
|
||||
fs.writeFileSync(roadmapFilePath, newContent, 'utf8');
|
||||
}
|
||||
|
||||
fetch(sheetUrl)
|
||||
.then((res) => res.json())
|
||||
.then((rawData) => {
|
||||
const rows = rawData.values;
|
||||
|
||||
rows.map((row) => {
|
||||
// prettier-ignore
|
||||
const [
|
||||
roadmapUrl,
|
||||
company,
|
||||
redirectUrl,
|
||||
imageUrl,
|
||||
adTitle,
|
||||
adDescription,
|
||||
startDate,
|
||||
endDate,
|
||||
isActive,
|
||||
] = row;
|
||||
|
||||
populateRoadmapAds({
|
||||
roadmapUrl,
|
||||
company,
|
||||
redirectUrl,
|
||||
imageUrl,
|
||||
adTitle,
|
||||
adDescription,
|
||||
startDate,
|
||||
endDate,
|
||||
isActive,
|
||||
});
|
||||
});
|
||||
});
|
Reference in New Issue
Block a user