Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🚀 Add hacktoberfest function on this repo #33

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions hacktoberfest/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Hacktoberfest

This directory contains the Cloud function used to get number of contribution for people.

The list of contributors is in the oss.zenika.com website.

⚠️ No CI exists on this project, so the cloud function has to be deployed manually (but it's in progress 😅)
140 changes: 140 additions & 0 deletions hacktoberfest/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
const fetch = require('node-fetch')
const { default: ApolloClient, gql } = require('apollo-boost')

function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}

Date.prototype.addHours = function(h) {
this.setHours(this.getHours() + h)
return this
}

const cache = {
data: [],
ttl: new Date(),
}

exports.hacktoberfest = async (req, res) => {
res.set('Access-Control-Allow-Origin', '*')

if (req.method === 'OPTIONS') {
res.set('Access-Control-Allow-Methods', 'GET')
res.set('Access-Control-Allow-Headers', 'Content-Type')
res.set('Access-Control-Max-Age', '3600')
return res.status(204).send('')
}

const githubId = process.env.GITHUB_ID
const githubToken = process.env.GITHUB_OAUTH
const gitlabToken = process.env.GITLAB_TOKEN

const clientGitHub = new ApolloClient({
uri: `https://api.github.com/graphql?access_token=${githubToken}`,
headers: {
'User-Agent': githubId,
Authorization: `token ${githubToken}`,
},
fetch,
})

const clientGitLab = new ApolloClient({
uri: `https://gitlab.com/api/graphql`,
headers: {
'User-Agent': githubId,
Authorization: `Bearer ${gitlabToken}`,
'Content-Type': 'application/json',
},
fetch,
})

if (cache.data.length > 0 && cache.ttl > new Date()) {
return res.status(200).send(cache.data)
}

const handles = await fetch('https://oss.zenika.com/hacktoberfest-new.json').then(
response => response.json(),
)

console.log(JSON.stringify(handles))

const data = await Promise.all(
Object.entries(handles).map(async infosUser => {
await sleep(25)
try {
if (infosUser[1].github && infosUser[1].github.handle) {
const responseGitHub = await clientGitHub.query({
query: gql`
query getUserPullRequest($login: String!) {
user(login: $login) {
login
contributionsCollection(
from: "2022-10-01T00:00:00Z"
to: "2022-10-31T23:59:59Z"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe this can be set to current year instead of having 2022 hardcoded in it ?

) {
pullRequestContributions(first: 1) {
totalCount
}
}
}
}
`,
variables: {
login: infosUser[1].github.handle,
},
})

// update json
infosUser[1].github.nbContributions =
responseGitHub.data.user.contributionsCollection.pullRequestContributions.totalCount
}

if (infosUser[1].gitlab && infosUser[1].gitlab.handle) {
const responseGitLab = await clientGitLab.query({
query: gql`
query getUserMR($login: String!) {
users(usernames: [$login]) {
nodes {
username
authoredMergeRequests(
createdAfter: "2022-10-01T00:00:00+00:00"
createdBefore: "2022-10-31T00:00:00+00:00"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same hardcoded comment

state: merged
) {
count
}
}
}
}
`,
variables: {
login: infosUser[1].gitlab.handle,
},
})

// update json
infosUser[1].gitlab.nbContributions =
responseGitLab.data.users.nodes[0].authoredMergeRequests.count
}

return infosUser
} catch (e) {
console.log('error : ' + e + ' | ' + JSON.stringify(e))
return null
}
}),
)

console.log(JSON.stringify(data))

const filteredData = data.filter(Boolean)

filteredData.forEach((user) => {
user.location = handles[user[1].name]
})

cache.data = filteredData
cache.ttl = new Date().addHours(1)

res.status(200).send(filteredData)
}
10 changes: 10 additions & 0 deletions hacktoberfest/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "sample-http",
"version": "0.0.1",
"dependencies": {
"apollo-boost": "^0.4.4",
"graphql": "^14.5.6",
"graphql-tag": "^2.10.1",
"node-fetch": "^2.6.0"
}
}