All files / src/lib/credits getPatronsFromGithub.ts

30% Statements 12/40
4.35% Branches 1/23
33.33% Functions 1/3
28.21% Lines 11/39

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 831x 1x     1x 1x   1x             1x                         1x                                           1x 1x 1x                                                           1x  
import Octokit from "@octokit/rest";
import inbuiltPatrons from "patrons.json";
import type { Patrons, PatreonUser } from "scripts/fetchPatrons";
 
const github = new Octokit();
const oneHour = 60 * 60 * 1000;
 
const cache = {
  latest: {
    value: inbuiltPatrons,
    timestamp: 0,
  },
};
 
const isPatronUser = (input: unknown): input is PatreonUser => {
  Iif (typeof input === "object" && input !== null) {
    const obj = input as PatreonUser;
    return (
      obj.type === "user" &&
      typeof obj.id === "string" &&
      typeof obj.attributes === "object" &&
      typeof obj.attributes.full_name === "string"
    );
  }
  return false;
};
 
const isPatrons = (input: unknown): input is Patrons => {
  Iif (input === null || typeof input !== "object") {
    return false;
  }
 
  const obj = input as Record<string, unknown>;
 
  Iif (!("goldTier" in obj) || !("silverTier" in obj)) {
    return false;
  }
  Iif (!Array.isArray(obj.goldTier) || !Array.isArray(obj.silverTier)) {
    return false;
  }
  Iif (
    !obj.goldTier.every(isPatronUser) ||
    !obj.silverTier.every(isPatronUser)
  ) {
    return false;
  }
  return true;
};
 
export const getPatronsFromGithub = async () => {
  if (process.env.NODE_ENV === "test") {
    return inbuiltPatrons;
  }
  try {
    const now = new Date().getTime();
    Iif (cache.latest.timestamp > now) {
      return cache.latest.value;
    }
 
    const result = await github.repos.getContents({
      owner: "chrismaltby",
      repo: "gb-studio",
      path: "patrons.json",
      ref: "develop",
    });
 
    Iif (result) {
      const content = Buffer.from(result.data.content, "base64").toString();
      const patrons = JSON.parse(content);
      Iif (isPatrons(patrons)) {
        cache.latest.value = patrons;
        cache.latest.timestamp = now + oneHour;
        return patrons;
      }
    }
  } catch (e) {
    console.error(e);
  }
  return inbuiltPatrons;
};
 
getPatronsFromGithub();