123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- import CacheUtils from "./CacheUtils.js"
- const OPEN_COLLECTIVE_ENDPOINT= ()=>"https://api.opencollective.com/graphql/v2";
- const OPEN_COLLECTIVE_BACKER_QUERY = (org) => `
- query collective ($offset: Int, $limit: Int){
- collective(slug: "${org}") {
- name
- backers: members(role: BACKER, offset: $offset, limit: $limit) {
- limit
- totalCount
- nodes {
- publicMessage
- totalDonations {
- value
- currency
- valueInCents
- }
- account {
- slug
- type
- name
- imageUrl
- website
- twitterHandle
- ... on Individual {
- email
- }
- ... on Organization {
- admins: members(role: ADMIN) {
- nodes {
- account {
- ... on Individual {
- email
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- `;
- export default class OpenCollectiveUtils {
- static async getBackers(collective) {
- const cacheKey = "ocollective/" + collective + "/backers";
- let backers = CacheUtils.get(cacheKey);
- let cached=true;
- if (!backers) {
- cached=false;
- const endPoint = OPEN_COLLECTIVE_ENDPOINT(collective);
- const query = OPEN_COLLECTIVE_BACKER_QUERY(collective);
- backers = await fetch(endPoint, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- 'Accept': 'application/json',
- },
- body: JSON.stringify({
- query: query,
- variables: {
- offset: 0,
- limit: 1000
- },
- })
- }).then((res) =>{
- if(res.ok&&res.status==200)return res.json() ;
- else throw "Failed to fetch!";
- });
- if (!backers) throw "Undefined backers?";
- CacheUtils.set(cacheKey, backers);
- }
- return [backers,cached];
-
- }
- static async getBackersFlat(collective,modifier) {
- const [res,cached]=await this.getBackers(collective);
- const backers = [];
- const backersObj = res.data.collective.backers.nodes;
- for (let i in backersObj) {
- const entry = {};
- const backer = backersObj[i];
- entry.message = backer.publicMessage;
- entry.value = backer.totalDonations.value;
- entry.currency = backer.totalDonations.currency;
- let account = backer.account;
- entry.accountUrl = "https://opencollective.com/" + account.slug;
- // const subAccounts = [];
- // if (account.type == "ORGANIZATION") {
- // account.admins.nodes.forEach(admin => subAccounts.push(admin.account));
- // } else {
- // subAccounts.push(account);
- // }
- // subAccounts.forEach(account => {
- // const subEntry = { ...entry };
- // subEntry.name = account.name;
- // subEntry.website = account.website;
- // subEntry.avatar = account.imageUrl;
- // backers.push(subEntry);
- // });
- entry.name = account.name;
- entry.website = account.website;
- entry.avatar = account.imageUrl;
- entry.twitter = account.twitterHandle;
- entry.slug = account.slug;
- entry.type=account.type;
- backers.push(entry);
- }
- if(!cached&&modifier)backers=modifier(backers);
- return backers;
- }
- }
|