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(); let fronmatterObj = yaml.load(existingFrontmatter); if (shouldShowAd) { const frontmatterValues = Object.entries(fronmatterObj); // Insert sponsor data at 10 index i.e. after // roadmap dimensions in the fronmatter frontmatterValues.splice(10, 0, [ 'sponsor', { url: redirectUrl, title: adTitle, imageUrl, description: adDescription, event: { category: 'SponsorClick', action: `${company} Redirect`, label: `Clicked ${company} Link`, }, }, ]); fronmatterObj = Object.fromEntries(frontmatterValues); } else { delete fronmatterObj.sponsor; } const newFrontmatter = yaml.dump(fronmatterObj, { 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, }); }); });