Skip to content

Commit a32eec9

Browse files
authored
Merge pull request #1 from OlafPaladin/main
feat: apply paladin studios changes
2 parents 55e8ab7 + 7f7b5db commit a32eec9

File tree

13 files changed

+3051
-2903
lines changed

13 files changed

+3051
-2903
lines changed

package-lock.json

Lines changed: 2884 additions & 2703 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,25 @@
1919
},
2020
"homepage": "https://github.com/codebrewery/UPM-Proxy-GitHub#readme",
2121
"engines": {
22-
"node": "16.4.0"
22+
"node": "18.7.0"
2323
},
2424
"dependencies": {
25-
"@hapi/joi": "^16.1.8",
26-
"@octokit/graphql": "^4.5.7",
25+
"@octokit/core": "^4.1.0",
26+
"@octokit/webhooks": "^10.3.0",
2727
"cors": "^2.8.5",
28-
"dotenv": "^8.2.0",
28+
"dotenv": "^16.0.2",
2929
"express": "^4.17.1",
3030
"express-bearer-token": "^2.4.0",
3131
"follow-redirects": "^1.13.0",
32-
"helmet": "^3.21.2",
32+
"helmet": "^6.0.0",
33+
"joi": "^17.6.1",
3334
"node-cache": "^5.1.2",
3435
"pug": "^3.0.2",
3536
"winston": "^3.2.1"
3637
},
3738
"devDependencies": {
3839
"foreman": "^3.0.1",
39-
"standard": "^16.0.1"
40+
"standard": "^17.0.0"
4041
},
4142
"config": {
4243
"registry": "https://npm.pkg.github.com"

src/controllers/api/upm-all.js

Lines changed: 5 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -10,80 +10,25 @@
1010
*/
1111
'use strict'
1212

13-
const Joi = require('@hapi/joi')
14-
13+
const Joi = require('joi')
1514
const schema = Joi.object({
1615
scope: Joi.required()
1716
})
18-
const { graphql } = require('@octokit/graphql')
19-
20-
const logger = require('../../logic/winston')
2117
const utils = require('../../logic/utils')
18+
const { getOrgPackageData } = require('../../logic/retrievePackageData')
2219

2320
function controller (req, res) {
2421
const token = req.token || process.env.GITHUB_TOKEN
2522
const { scope } = req.params
26-
const context = (process.env.SCOPE_TYPE === 'USER') ? 'user' : 'organization' // defaults to organization
2723

28-
query(scope, token, context).then((result) => {
29-
utils.successfulJsonResponse(req, res, transformJson(result, context))
30-
logger.debug(result)
24+
const host = req.secure ? `https://${req.headers.host}` : `http://${req.headers.host}`
25+
getOrgPackageData(scope, token, host).then((result) => {
26+
utils.successfulJsonResponse(req, res, result)
3127
}).catch((err) => {
3228
res.status(500).json(err.message)
3329
})
3430
}
3531

36-
/**
37-
* Create a JSON response for /-/all endpoint
38-
* @param queryResult
39-
* @param context
40-
* @returns {{_updated: number}}
41-
*/
42-
function transformJson (queryResult, context) {
43-
const json = {
44-
_updated: 99999
45-
}
46-
queryResult[context].packages.nodes.forEach(element => {
47-
if (element.packageType === 'NPM') {
48-
json[element.name] = element.latestVersion
49-
}
50-
})
51-
return json
52-
}
53-
54-
async function query (scope, token, context) {
55-
const graphqlWithAuth = graphql.defaults({
56-
headers: {
57-
authorization: `bearer ${token}`
58-
}
59-
})
60-
const query = {
61-
query: ` query {
62-
${context}(login: "${scope}") {
63-
packages(first: 100) {
64-
totalCount
65-
nodes {
66-
name
67-
latestVersion {
68-
version
69-
package {
70-
name
71-
}
72-
}
73-
packageType
74-
}
75-
pageInfo {
76-
endCursor
77-
hasNextPage
78-
}
79-
}
80-
}
81-
}
82-
`
83-
}
84-
return await graphqlWithAuth(query)
85-
}
86-
8732
module.exports = {
8833
schema,
8934
controller

src/controllers/api/upm-clear.js

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/controllers/api/upm-download.js

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/controllers/api/upm.js

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
'use strict'
22

3-
const Joi = require('@hapi/joi')
3+
const Joi = require('joi')
44
const utils = require('../../logic/utils')
5-
const config = require('../../../package.json').config
6-
5+
const { getOrgPackageData } = require('../../logic/retrievePackageData')
76
const schema = Joi.object({
87
scope: Joi.required(),
98
packageName: Joi.required()
109
})
1110

1211
function controller (req, res) {
12+
const { packageName, scope } = req.params
13+
const host = req.secure ? `https://${req.headers.host}` : `http://${req.headers.host}`
1314
const token = req.token || process.env.GITHUB_TOKEN
14-
const { scope, packageName } = req.params
1515

16-
const host = req.secure ? `https://${req.headers.host}` : `http://${req.headers.host}`
16+
getPackageData(scope, token, host).then(() => {
17+
const packageData = utils.getCachedPackageData(token, packageName)
18+
utils.successfulJsonResponse(req, res, packageData)
19+
})
20+
}
1721

18-
utils.request(`${config.registry}/${scope}%2F${packageName}`, token, host)
19-
.then(result => {
20-
utils.successfulJsonResponse(req, res, result)
21-
})
22-
.catch(err => {
23-
res.status(500).json(err)
24-
})
22+
async function getPackageData (scope, token, host) {
23+
if (utils.hasCachedPackageData(token) === false) {
24+
// The package data for this user is not cached, retrieve the data
25+
await getOrgPackageData(scope, token, host)
26+
}
2527
}
2628

2729
module.exports = {

src/controllers/webhook/package.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
'use strict'
2+
3+
const utils = require('../../logic/utils')
4+
5+
function packageHandler (eventObject) {
6+
utils.flushCache()
7+
}
8+
9+
module.exports = {
10+
packageHandler
11+
}

src/logic/retrievePackageData.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
'use strict'
2+
3+
const { Octokit } = require('@octokit/core')
4+
const utils = require('./utils')
5+
const config = require('../../package.json').config
6+
7+
async function getOrgPackageData (scope, token, host) {
8+
// This is the object all the data is added to and cached in memory once
9+
const resultObject = {
10+
all: {},
11+
packages: {}
12+
}
13+
14+
// Set-up octokit with PAT
15+
const octokit = new Octokit({ auth: token })
16+
17+
// Get all org packages
18+
const packages = await octokit.request('GET /orgs/{org}/packages', {
19+
org: scope,
20+
package_type: 'npm',
21+
per_page: 100
22+
})
23+
24+
// Create all parallel requests
25+
const promises = packages.data.map(element => {
26+
return getPackage(scope, element.name, token, host, resultObject)
27+
})
28+
29+
// Run all parallel requests
30+
await Promise.all(promises)
31+
32+
// Save the data in memory
33+
utils.cachePackageData(token, resultObject)
34+
35+
// Return the data from memory
36+
return utils.getCachedLatestVersions(token)
37+
}
38+
39+
async function getPackage (scope, packageName, token, host, resultObject) {
40+
// Run the async request
41+
const packageData = await utils.request(`${config.registry}/@${scope}/${packageName}`, token, host)
42+
43+
// Append to the result object
44+
resultObject.all[`${packageName}`] = packageData['dist-tags'].latest
45+
resultObject.packages[`${packageName}`] = packageData
46+
return packageData
47+
}
48+
49+
module.exports = {
50+
getOrgPackageData
51+
}

src/logic/server.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const path = require('path')
66
const helmet = require('helmet')
77
const cors = require('cors')
88
const routeMapper = require('./routeMapper')
9+
const webhooks = require('../webhooks')
910
const logger = require('./winston')
1011

1112
// middleware
@@ -32,6 +33,9 @@ app.use(cache)
3233
// Routes
3334
routeMapper.mapRoutes(app)
3435

36+
// WebHooks
37+
webhooks.register(app)
38+
3539
// Error handlers
3640
app.use(function (req, res) {
3741
logger.debug(req.url)

0 commit comments

Comments
 (0)