diff --git a/app/actions/fetchRepos.js b/app/actions/fetchRepos.js index 6f1f254..4c5b4d4 100644 --- a/app/actions/fetchRepos.js +++ b/app/actions/fetchRepos.js @@ -2,7 +2,7 @@ import fetch from 'node-fetch'; import signale from 'signale'; import { reposPayload } from './payload'; -const fetchRepos = async (username, uid, endCursor = null) => { +const fetchRepos = async (username, uid, acm = [], endCursor = null) => { /* Fetch next 20 repos based on cursor */ @@ -28,23 +28,39 @@ const fetchRepos = async (username, uid, endCursor = null) => { throw new Error(`Unsuccessful: repos ${endCursor} fetch from github`); } + if (!reposData.data.user) { + throw new Error(`User with username ${username} not found`); + } + // collection of 20 repos const repos = reposData.data.user.repositories.nodes; + signale.success(`Fetched ${repos.length} repos collection for ${username}`); + const cursor = reposData.data.user.repositories.pageInfo.endCursor; + + const updatedAcm = [ + ...acm, + ...repos.map(repo => ({ + forks: repo.forks.totalCount, + name: repo.nameWithOwner.slice(repo.owner.login.length + 1), + isFork: repo.isFork, + owner: repo.owner.login, + languages: repo.languages.nodes || [], + size: repo.languages.totalSize, + stars: repo.stargazers.totalCount, + url: repo.url, + userCommits: repo.contributions ? repo.contributions.target.userCommits.totalCount : 0, + watchers: repo.watchers.totalCount, + })), + ]; + + if (reposData.data.user.repositories.pageInfo.hasNextPage) { + return fetchRepos(username, uid, updatedAcm, cursor); + } + // compile repo data - return repos.map(repo => ({ - branch: repo.branch ? repo.branch.name : '', - forks: repo.forks.totalCount, - fullName: repo.nameWithOwner, - isFork: repo.isFork, - languages: repo.languages.nodes || [], - size: repo.languages.totalSize, - stars: repo.stargazers.totalCount, - url: repo.url, - userCommits: repo.contributions ? repo.contributions.target.userCommits.totalCount : 0, - watchers: repo.watchers.totalCount, - })); + return updatedAcm; }; export default fetchRepos; diff --git a/app/actions/payload.js b/app/actions/payload.js index b754737..e8c85fb 100644 --- a/app/actions/payload.js +++ b/app/actions/payload.js @@ -52,7 +52,7 @@ const reposPayload = (username, id, endCursor) => ({ query($username: String!, $id: ID!, $afterCursor: String) { user(login: $username) { - repositories(first: 20, after: $afterCursor, orderBy: {field: NAME,direction: ASC}) { + repositories(first: 20, isFork: false, after: $afterCursor, orderBy: {field: NAME,direction: ASC}) { ...repoData } } diff --git a/app/resolvers/query/index.js b/app/resolvers/query/index.js index 4c72997..fd75419 100644 --- a/app/resolvers/query/index.js +++ b/app/resolvers/query/index.js @@ -1,7 +1,9 @@ import user from './user'; import latestUsers from './latestUsers'; +import repositories from './repositories'; export default { user, latestUsers, + repositories, }; diff --git a/app/resolvers/query/repositories.js b/app/resolvers/query/repositories.js new file mode 100644 index 0000000..58a6b2c --- /dev/null +++ b/app/resolvers/query/repositories.js @@ -0,0 +1,11 @@ +import signale from 'signale'; +import fetchRepos from '../../actions/fetchRepos'; + +export default async (parent, { username, uid }) => { + try { + return await fetchRepos(username, uid); + } catch (error) { + signale.error(error); + return []; + } +}; diff --git a/app/schema.graphql b/app/schema.graphql index 4ce2654..a29266a 100644 --- a/app/schema.graphql +++ b/app/schema.graphql @@ -4,4 +4,5 @@ type Query { user(username: String!, fresh: Boolean): User latestUsers(first: Int): [User] + repositories(username: String!, uid: String!): [Repo] }