Skip to content
This repository has been archived by the owner on Oct 18, 2024. It is now read-only.

Commit

Permalink
feat: community checks (#101)
Browse files Browse the repository at this point in the history
* feat: community checks

* fix: prisma formatting
  • Loading branch information
eddiejaoude authored Aug 7, 2024
1 parent 9c47023 commit fa3a6b4
Show file tree
Hide file tree
Showing 13 changed files with 200 additions and 21 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
"test": "npx playwright test",
"prepare": "husky",
"postinstall": "shx cp -n ./.env.example ./.env",
"db:migrate:dev": "npx prisma migrate dev",
"format:write": "prettier . --write",
"format:check": "prettier . --check",
"db:migrate:dev": "npx prisma migrate dev",
"db:migrate:prod": "prisma migrate deploy"
},
"dependencies": {
Expand Down
2 changes: 2 additions & 0 deletions prisma/migrations/20240806121744_community/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "GithubResponse" ADD COLUMN "communityMetrics" JSONB;
37 changes: 19 additions & 18 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -91,22 +91,23 @@ model Repository {
repo String
githubResponses GithubResponse[]
checks Check[]
checks Check[]
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

model GithubResponse {
id String @id @default(cuid())
repo Json
issues Json?
branches Json?
release Json?
checks Check[]
id String @id @default(cuid())
repo Json
issues Json?
branches Json?
release Json?
communityMetrics Json?
checks Check[]
repositoryId String
repository Repository @relation(fields: [repositoryId], references: [id], onDelete: Cascade)
Expand All @@ -115,15 +116,15 @@ model GithubResponse {
}

model Check {
id String @id @default(cuid())
red Int
amber Int
green Int
healthchecks Json
data Json
repositoryId String
repository Repository @relation(fields: [repositoryId], references: [id], onDelete: Cascade)
id String @id @default(cuid())
red Int
amber Int
green Int
healthchecks Json
data Json
repositoryId String
repository Repository @relation(fields: [repositoryId], references: [id], onDelete: Cascade)
githubResponseId String
githubResponse GithubResponse @relation(fields: [githubResponseId], references: [id], onDelete: Cascade)
Expand Down
5 changes: 4 additions & 1 deletion src/app/account/repo/checks/[id]/action.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ export async function performChecks(formData) {

// if github data is older than 24 hours fetch again
let githubResponseRepo = repository.githubResponses[0];
if (differenceInHours(new Date(), githubResponseRepo.createdAt) > 24) {
if (
!githubResponseRepo ||
differenceInHours(new Date(), githubResponseRepo.createdAt) > 24
) {
const user = await prisma.user.findUnique({
where: { id: session.user.id },
include: {
Expand Down
22 changes: 22 additions & 0 deletions src/utils/checks/codeOfConduct.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
export default function codeOfConduct(communityMetrics) {
let response = {
id: "code-of-conduct",
href: "/repo/code-of-conduct",
title: "Code of Conduct",
};

if (communityMetrics.files.code_of_conduct) {
response.status = "success";
response.description = `You have a CoC ${communityMetrics.files.code_of_conduct.name}.`;
response.extra = "No action required.";
}

if (!communityMetrics.files.code_of_conduct) {
response.status = "error";
response.description = "You do not have a CoC in your repo.";
response.extra =
"This is important for people to know your project and community is safe.";
}

return response;
}
22 changes: 22 additions & 0 deletions src/utils/checks/contributing.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
export default function contributing(communityMetrics) {
let response = {
id: "contributing",
href: "/repo/contributing",
title: "Contributing",
};

if (communityMetrics.files.contributing) {
response.status = "success";
response.description = "You have a contributing guide.";
response.extra = "No action required.";
}

if (!communityMetrics.files.contributing) {
response.status = "error";
response.description = "You do not have a contributing guide in your repo.";
response.extra =
"This is important, so people know how to get started with your project.";
}

return response;
}
12 changes: 12 additions & 0 deletions src/utils/checks/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import activity from "./activity";
import branches from "./branches";
import codeOfConduct from "./codeOfConduct";
import contributing from "./contributing";
import defaultBranch from "./defaultBranch";
import description from "./description";
import goodFirstIssue from "./goodFirstIssue";
import issues from "./issues";
import issueTemplates from "./issueTemplates";
import license from "./license";
import pullRequestTemplate from "./pullRequestTemplate";
import readme from "./readme";
import release from "./release";
import topics from "./topics";
import url from "./url";
Expand Down Expand Up @@ -31,6 +37,12 @@ export default function checks(data) {
goodFirstIssue(data.issues),
branches(data.branches),
release(data.release),
readme(data.communityMetrics),
license(data.communityMetrics),
contributing(data.communityMetrics),
// issueTemplates(data.communityMetrics), // TODO data from github json is always null
pullRequestTemplate(data.communityMetrics),
codeOfConduct(data.communityMetrics),
];

const summary = checkSummary(checks);
Expand Down
22 changes: 22 additions & 0 deletions src/utils/checks/issueTemplates.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
export default function issueTemplates(communityMetrics) {
let response = {
id: "issue-templates",
href: "/repo/issue-templates",
title: "Issue templates",
};

if (communityMetrics.files.issue_template) {
response.status = "success";
response.description = "You have issue templates.";
response.extra = "No action required.";
}

if (!communityMetrics.files.issue_template) {
response.status = "error";
response.description = "You do not have any issue templates in your repo.";
response.extra =
"This helps people create better issues, for example focused on a feature or bug.";
}

return response;
}
21 changes: 21 additions & 0 deletions src/utils/checks/license.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export default function license(communityMetrics) {
let response = {
id: "license",
href: "/repo/license",
title: "License",
};

if (communityMetrics.files.license) {
response.status = "success";
response.description = `You have a license ${communityMetrics.files.license.spdx_id}.`;
response.extra = "No action required.";
}

if (!communityMetrics.files.license) {
response.status = "error";
response.description = "You do not have a license in your repo.";
response.extra = "This does not mean it is moe Open Source but less.";
}

return response;
}
22 changes: 22 additions & 0 deletions src/utils/checks/pullRequestTemplate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
export default function pullRequestTemplate(communityMetrics) {
let response = {
id: "pull-request-template",
href: "/repo/pull-request-template",
title: "Pull Request template",
};

if (communityMetrics.files.pull_request_template) {
response.status = "success";
response.description = "You have a Pull Request template.";
response.extra = "No action required.";
}

if (!communityMetrics.files.pull_request_template) {
response.status = "error";
response.description =
"You do not have a pull request template in your repo.";
response.extra = "This helps people create better pull requests.";
}

return response;
}
21 changes: 21 additions & 0 deletions src/utils/checks/readme.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export default function readme(communityMetrics) {
let response = {
id: "readme",
href: "/repo/readme",
title: "Readme",
};

if (communityMetrics.files.readme) {
response.status = "success";
response.description = "You have a README file.";
response.extra = "No action required.";
}

if (!communityMetrics.files.readme) {
response.status = "error";
response.description = "You do not have a readme.md file in your repo.";
response.extra = "This is the most important file in your project.";
}

return response;
}
27 changes: 27 additions & 0 deletions src/utils/github/getCommunityMetrics.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Octokit } from "@octokit/rest";
import extractOwnerRepo from "./extractOwnerRepo";

export default async function getCommunityMetricsApi(url, token) {
// get owner and repo name from url
const { owner, repo } = extractOwnerRepo(url);

// get data from github api using user's API
const octokit = new Octokit({
auth: token,
});
let response;
try {
response = await octokit.rest.repos.getCommunityProfileMetrics({
owner,
repo,
});
} catch (e) {
console.error(e);
response = {
status: 404,
data: {},
};
}
console.log("-----", response);
return response;
}
6 changes: 5 additions & 1 deletion src/utils/github/index.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import getBranchesApi from "./getBranchesApi";
import getCommunityMetricsApi from "./getCommunityMetrics";
import getIssuesApi from "./getIssuesApi";
import getReleaseApi from "./getReleaseApi";
import getRepoApi from "./getRepoApi";

export default async function getAllRepoData(url, token) {
const repo = (await getRepoApi(url, token)).data;

return {
repo: (await getRepoApi(url, token)).data,
repo: repo,
issues: (await getIssuesApi(url, token)).data,
branches: (await getBranchesApi(url, token)).data,
release: (await getReleaseApi(url, token)).data,
communityMetrics: (await getCommunityMetricsApi(url, token)).data,
};
}

0 comments on commit fa3a6b4

Please sign in to comment.