/ src / lib / utils / rpgf / oso.ts
oso.ts
 1  import { GraphQLClient } from 'graphql-request';
 2  
 3  const METRICS_TO_DISPLAY: Record<string, string> = {
 4    GITHUB_commits_over_all_time: '1zNSDLeL7d1bqMgJ4b/AGBd0lQs4Q4Wy9jIf2ge72kw=',
 5    GITHUB_comments_over_all_time: 'd5VBo6xBRMwXq6CEm4KgX+NrdrU45HR1ryhhO9szl60=',
 6    GITHUB_opened_pull_requests_over_all_time: '4qXMv/x67zMwqoF6hmivpo74Y++R2lhT4Y9CjZKpt00=',
 7    GITHUB_contributors_over_all_time: 'Fx1VYZrsdL9HlxTjJKCyPpntx7ZdGAiW+L1TEnTZgSI=',
 8    GITHUB_merged_pull_requests_over_all_time: 'gKlMLwqOAY0NndkTeXiaN4XM8RqhEu9RGvYhZRLPPMM=',
 9    GITHUB_stars_over_all_time: 'Z6qQavpdhYhLZHxNqLlgWO8Fm1yU3jc3rdxehtP91Yc=',
10    GITHUB_opened_issues_over_all_time: 'ftrYmCWeazkMzCpce018wYydj/HovL+5q25MGl+4uv0=',
11    GITHUB_closed_issues_over_all_time: 'IBdxUvSrFquEY1PG3bYlD1LREqoRZxIHErDZDEAlM1M=',
12    GITHUB_forks_over_all_time: 'OvHEN0B/pn82eKeV0jD9007tZriincUXAXgGqmYxPpc=',
13  };
14  
15  export async function getRepoMetrics(ownerName: string, repoName: string, f = fetch) {
16    const client = new GraphQLClient('https://www.opensource.observer/api/v1/graphql', {
17      fetch: f,
18    });
19  
20    const artifactIdQuery = `
21      query GitHubArtifact {
22        oso_artifactsByProjectV1(
23          limit: 1,
24          where: {
25            artifactName: { _ilike: "${repoName}" },
26            artifactNamespace: { _ilike: "${ownerName}" },
27            projectSource: { _eq: "OSS_DIRECTORY" }
28          }
29        ) {
30          artifactId
31        }
32      }
33    `;
34  
35    const artifactIdResult = await client.request(artifactIdQuery, {});
36    // eslint-disable-next-line @typescript-eslint/no-explicit-any
37    const artifactId = (artifactIdResult as any).oso_artifactsByProjectV1[0]?.artifactId;
38  
39    const keyMetricsQuery = `
40      query GetKeyMetrics {
41        oso_keyMetricsByArtifactV0(where: {
42          artifactId: {
43            _eq: "${artifactId}"
44          }
45          
46        }) {
47          amount
48          metricId
49        }
50      }
51    `;
52  
53    const keyMetricsResult = await client.request(keyMetricsQuery, {});
54    // eslint-disable-next-line @typescript-eslint/no-explicit-any
55    const keyMetrics = (keyMetricsResult as any).oso_keyMetricsByArtifactV0;
56  
57    const mappedResult = keyMetrics.reduce(
58      // eslint-disable-next-line @typescript-eslint/no-explicit-any
59      (acc: Record<string, number>, metric: any) => {
60        const metricName = Object.keys(METRICS_TO_DISPLAY).find(
61          (key) => METRICS_TO_DISPLAY[key] === metric.metricId,
62        );
63        if (metricName) {
64          acc[metricName] = Number(metric.amount);
65        }
66        return acc;
67      },
68      {},
69    );
70  
71    return mappedResult;
72  }