Skip to content

Commit b23d6a2

Browse files
sokraskipjack
authored andcommitted
fix(sponsors): opencollective api changed, add validation (#1622)
1 parent 3c5fff0 commit b23d6a2

File tree

4 files changed

+38
-64
lines changed

4 files changed

+38
-64
lines changed

src/components/Support/Support.jsx

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
import React from 'react';
2-
import GoldSponsors from './support-goldsponsors.json';
3-
import SilverSponsors from './support-silversponsors.json';
4-
import Sponsors from './support-sponsors.json';
52
import Backers from './support-backers.json';
63
import Additional from './support-additional.js';
74
import './Support.scss';
85

6+
const SUPPORTERS = [ ...Backers ];
7+
8+
// merge or add additional backers/sponsors
9+
for(const additional of Additional) {
10+
const existing = SUPPORTERS.find(supporter => supporter.slug && supporter.slug === additional.slug);
11+
if (existing) {
12+
existing.totalDonations += additional.totalDonations;
13+
} else {
14+
SUPPORTERS.push(additional);
15+
}
16+
}
17+
18+
// resort list
19+
SUPPORTERS.sort((a, b) => b.totalDonations - a.totalDonations);
20+
921
const ranks = {
1022
backer: {
1123
maximum: 200
@@ -38,26 +50,8 @@ function formatMoney(number) {
3850
export default class Support extends React.Component {
3951
render() {
4052
let { rank } = this.props;
41-
let supporters = [
42-
...GoldSponsors,
43-
...SilverSponsors,
44-
...Sponsors,
45-
...Backers,
46-
];
47-
48-
// merge or add additional backers/sponsors
49-
for(const additional of Additional) {
50-
const existing = supporters.find(supporter => supporter.username && supporter.username === additional.username);
51-
if (existing) {
52-
existing.totalDonations += additional.totalDonations;
53-
} else {
54-
supporters.push(additional);
55-
}
56-
}
57-
58-
// resort list
59-
supporters.sort((a, b) => b.totalDonations - a.totalDonations);
6053

54+
let supporters = SUPPORTERS;
6155
let minimum, maximum;
6256

6357
if (rank && ranks[rank]) {
@@ -90,16 +84,16 @@ export default class Support extends React.Component {
9084

9185
{
9286
supporters.map((supporter, index) => (
93-
<a key={ supporter.id || supporter.username || index }
87+
<a key={ supporter.id || supporter.slug || index }
9488
className="support__item"
95-
title={ `$${formatMoney(supporter.totalDonations / 100)} by ${supporter.name || supporter.username}` }
89+
title={ `$${formatMoney(supporter.totalDonations / 100)} by ${supporter.name || supporter.slug}` }
9690
target="_blank"
97-
href={ supporter.website || `https://opencollective.com/${supporter.username}` }>
91+
href={ supporter.website || `https://opencollective.com/${supporter.slug}` }>
9892
{ supporter.avatar ? <img
9993
className={ `support__${rank}-avatar` }
10094
src={ supporter.avatar }
101-
alt={ supporter.username ? `${supporter.username}'s avatar` : 'avatar' } /> :
102-
supporter.name }
95+
alt={ supporter.name || supporter.slug ? `${supporter.name || supporter.slug}'s avatar` : 'avatar' } /> :
96+
<span className={ `support__${rank}-avatar` }>{supporter.name || supporter.slug}</span> }
10397
{ rank === 'backer' ? <figure className="support__outline" /> : null }
10498
</a>
10599
))

src/components/Support/Support.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
}
4242

4343
&__backer-avatar {
44+
display: inline-block;
4445
width: 31px;
4546
height: 31px;
4647
border-radius: 50%;

src/components/Support/support-additional.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export default [
2121
reason: "Paypal"
2222
},
2323
{
24-
username: "peerigon",
24+
slug: "peerigon",
2525
name: "Peerigon",
2626
avatar: "https://opencollective-production.s3-us-west-1.amazonaws.com/e8a1de10-99c8-11e6-8650-f92e594d5de8.png",
2727
website: "https://peerigon.com/?utm_source=webpack&utm_medium=documentation&utm_campaign=sponsorship",

src/scripts/fetch_supporters.js

Lines changed: 15 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,26 @@
22
const fs = require('fs');
33
const request = require('request');
44

5-
request('https://opencollective.com/webpack/goldsponsors.json?requireActive=false', (err, response, body) => {
6-
if (err) {
7-
console.error('Failed to fetch goldsponsors: ', err);
8-
9-
} fs.writeFile('./src/components/Support/support-goldsponsors.json', body, err => {
10-
if (err) {
11-
console.error('Failed to write goldsponsors file: ', err);
12-
13-
} else console.log('Fetched 1 file: support-goldsponsors.json');
14-
});
15-
});
16-
17-
request('https://opencollective.com/webpack/silversponsors.json?requireActive=false', (err, response, body) => {
18-
if (err) {
19-
console.error('Failed to fetch silversponsors: ', err);
20-
21-
} fs.writeFile('./src/components/Support/support-silversponsors.json', body, err => {
22-
if (err) {
23-
console.error('Failed to write silversponsors file: ', err);
5+
const REQUIRED_KEYS = ["totalDonations", "id"];
246

25-
} else console.log('Fetched 1 file: support-silversponsors.json');
26-
});
27-
});
28-
29-
request('https://opencollective.com/webpack/sponsors.json?requireActive=false', (err, response, body) => {
7+
request('https://opencollective.com/api/groups/webpack/backers', (err, response, body) => {
308
if (err) {
31-
console.error('Failed to fetch sponsors: ', err);
32-
33-
} fs.writeFile('./src/components/Support/support-sponsors.json', body, err => {
34-
if (err) {
35-
console.error('Failed to write sponsors file: ', err);
9+
console.error('Failed to fetch backers: ', err);
3610

37-
} else console.log('Fetched 1 file: support-sponsors.json');
38-
});
39-
});
11+
}
4012

41-
request('https://opencollective.com/webpack/backers.json?requireActive=false', (err, response, body) => {
42-
if (err) {
43-
console.error('Failed to fetch backers: ', err);
13+
// Basic validation
14+
const content = JSON.parse(body);
15+
if(!Array.isArray(content)) throw new Error("backer info is not an array");
16+
if(content.length < 400) throw new Error("backer info is incomplete");
17+
for(const item of content) {
18+
for(const key of REQUIRED_KEYS) {
19+
if(!item || typeof item !== "object") throw new Error(`backer info item (${JSON.stringify(item)} is not an object`);
20+
if(!(key in item)) throw new Error(`backer info item (${JSON.stringify(item)} doesn't include ${key}`);
21+
}
22+
}
4423

45-
} fs.writeFile('./src/components/Support/support-backers.json', body, err => {
24+
fs.writeFile('./src/components/Support/support-backers.json', body, err => {
4625
if (err) {
4726
console.error('Failed to write backers file: ', err);
4827

0 commit comments

Comments
 (0)