Skip to content

Commit

Permalink
Merge pull request #378 from bos-sci/feature/ads-794
Browse files Browse the repository at this point in the history
feature/ads-794 Present carbon data
  • Loading branch information
APJohns authored Jan 11, 2024
2 parents 190ff4c + 2906780 commit 5d74813
Show file tree
Hide file tree
Showing 13 changed files with 1,848 additions and 19 deletions.
19 changes: 6 additions & 13 deletions netlify/functions/collectCarbon.mts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ import { Handler } from '@netlify/functions';
import { CarbonEntry } from '../../src/shared/types/docs';
const { default: axios } = require('axios');
const jsdom = require('jsdom');
const fs = require('fs');
const path = require('path');

async function getCarbon(url: string, date: string): Promise<CarbonEntry> {
const api = 'https://api.websitecarbon.com/b?url=';
Expand Down Expand Up @@ -34,13 +32,8 @@ async function getCarbon(url: string, date: string): Promise<CarbonEntry> {
async function parseSitemap(): Promise<string[] | null> {
console.log('Parsing sitemap...');
try {
const pathToSitemap =
process.env.REACT_APP_DEVELOPMENT_MODE === 'production'
? '../../../../../sitemap.xml'
: '../../../../../public/sitemap.xml';
const jsonPath = path.join(__dirname, ...pathToSitemap.split('/'));
const sitemap = fs.readFileSync(jsonPath, 'utf8');
const dom = new jsdom.JSDOM(sitemap, { contentType: 'application/xml' });
const res = await axios.get('https://raw.githubusercontent.com/bsc-xdc/anatomy/master/public/sitemap.xml');
const dom = new jsdom.JSDOM(res.data, { contentType: 'application/xml' });
return Array.from(dom.window.document.querySelectorAll('loc'), (loc: Element) => loc.textContent || '');
} catch (error) {
console.error(error);
Expand All @@ -52,7 +45,7 @@ async function collectData(): Promise<CarbonEntry[] | null> {
console.log('Collecting data...');
const date = new Date().toISOString();
const urls = await parseSitemap();
console.log('Sitemap parsed', urls);
console.log('Sitemap parsed');
if (urls) {
const filteredUrls = urls.map((url) => url.replace(/\/$/m, ''));
const promises = filteredUrls.map((url) => getCarbon(url, date));
Expand All @@ -70,11 +63,11 @@ const handler: Handler = async () => {
const database = client.db('carbon-metrics');
const carbon = database.collection<CarbonEntry>('metrics');
const carbonData = await collectData();
console.log('Collected data', carbonData);
console.log('Collected data');
if (carbonData) {
console.log('Inserting into DB...');
await carbon.insertMany(carbonData);
console.log('Inserted into DB');
const insertResult = await carbon.insertMany(carbonData);
console.log(`Inserted ${insertResult.insertedCount} records into DB`);
return {
statusCode: 200
};
Expand Down
19 changes: 19 additions & 0 deletions netlify/functions/getAllCarbon.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { MongoClient } from 'mongodb';
import { CarbonRecord } from '../../src/shared/types/docs';

// eslint-disable-next-line import/no-anonymous-default-export
export default async () => {
const uri = process.env.MONGO_CONNECTION as string;
const client = new MongoClient(uri);
try {
const database = client.db('carbon-metrics');
const carbon = database.collection<CarbonRecord>('metrics');
const cursor = carbon.find().sort({ date: 1 });
const allData = await cursor.toArray();
return Response.json(allData);
} catch (error) {
return Response.json(error);
} finally {
client.close();
}
};
23 changes: 23 additions & 0 deletions netlify/functions/getCarbon.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { MongoClient } from 'mongodb';
import { CarbonRecord } from '../../src/shared/types/docs';
import { URL } from 'url';

// eslint-disable-next-line import/no-anonymous-default-export
export default async (req: Request) => {
const params = {};
new URL(req.url).searchParams.forEach((value, key) => (params[key] = value));
console.log(params);
const uri = process.env.MONGO_CONNECTION as string;
const client = new MongoClient(uri);
try {
const database = client.db('carbon-metrics');
const carbon = database.collection<CarbonRecord>('metrics');
const cursor = carbon.find(params).sort({ date: 1 });
const allData = await cursor.toArray();
return Response.json(allData);
} catch (error) {
return Response.json(error);
} finally {
client.close();
}
};
Loading

0 comments on commit 5d74813

Please sign in to comment.