Skip to content

Commit

Permalink
Rewrite udata API calls using got
Browse files Browse the repository at this point in the history
  • Loading branch information
tusbar committed Oct 8, 2018
1 parent 67a057d commit 9d404df
Showing 1 changed file with 166 additions and 103 deletions.
269 changes: 166 additions & 103 deletions plugins/publish-to-udata/udata.js
Original file line number Diff line number Diff line change
@@ -1,138 +1,201 @@
'use strict'
const got = require('got')

const request = require('superagent')
const Promise = require('bluebird')

const rootUrl = process.env.DATAGOUV_URL + '/api/1'
const baseUrl = process.env.DATAGOUV_URL + '/api/1'
const apiKey = process.env.UDATA_PUBLICATION_USER_API_KEY

function withApiKey(req) {
return req.set('X-API-KEY', apiKey)
async function getProfile(accessToken) {
const {body} = await got.get(`/me/`, {
baseUrl,
json: true,
headers: {
authorization: `Bearer ${accessToken}`
}
})

return body
}

function withToken(req, token) {
return req.set('Authorization', `Bearer ${token}`)
async function getOrganization(organizationId) {
const {body} = await got.get(`/organizations/${organizationId}/`, {
baseUrl,
json: true
})

return body
}

function getProfile(accessToken) {
return Promise.resolve(
withToken(request.get(rootUrl + '/me/'), accessToken)
.then(resp => resp.body)
)
async function addUserToOrganization(userId, organizationId, accessToken) {
try {
await got.post(`/organizations/${organizationId}/member/${userId}/`, {
baseUrl,
json: true,
headers: {
authorization: `Bearer ${accessToken}`
},
body: {
role: 'admin'
}
})
} catch (error) {
if (error.statusCode === 409) {
// User is already a member, ignoring
return
}

throw error
}
}

function getOrganization(organizationId) {
return Promise.resolve(
request.get(`${rootUrl}/organizations/${organizationId}/`)
.then(resp => resp.body)
)
async function removeUserFromOrganization(userId, organizationId, accessToken) {
await got.delete(`/organizations/${organizationId}/member/${userId}/`, {
baseUrl,
headers: {
authorization: `Bearer ${accessToken}`,
'content-length': 0
}
})
}

function addUserToOrganization(userId, organizationId, accessToken) {
return Promise.resolve(
withToken(request.post(`${rootUrl}/organizations/${organizationId}/member/${userId}`), accessToken)
.send({role: 'admin'})
.catch(err => {
if (err.status && err.status === 409) {
return
} // User is already member
throw err
})
async function getUserRoleInOrganization(userId, organizationId) {
const organization = await getOrganization(organizationId)

const membership = organization.members.find(
membership => membership.user.id === userId
)
}

function removeUserFromOrganization(userId, organizationId, accessToken) {
return Promise.resolve(
withToken(request.del(`${rootUrl}/organizations/${organizationId}/member/${userId}`), accessToken)
.set('content-length', 0)
).thenReturn()
return membership ? membership.role : 'none'
}

function getUserRoleInOrganization(userId, organizationId) {
return getOrganization(organizationId)
.then(organization => {
const membership = organization.members.find(membership => membership.user.id === userId)
return membership ? membership.role : 'none'
})
async function deleteDatasetResource(datasetId, resourceId) {
await got.delete(`/datasets/${datasetId}/resources/${resourceId}/`, {
baseUrl,
headers: {
'X-API-KEY': apiKey,
'content-length': 0
}
})
}

function deleteDatasetResource(datasetId, resourceId) {
return Promise.resolve(
withApiKey(request.del(rootUrl + '/datasets/' + datasetId + '/resources/' + resourceId + '/'))
.set('content-length', 0)
).thenReturn()
}
async function createDataset(dataset) {
const {body} = await got.post('/datasets/', {
baseUrl,
json: true,
headers: {
'X-API-KEY': apiKey
},
body: dataset
})

function createDataset(dataset) {
return Promise.resolve(
withApiKey(request.post(rootUrl + '/datasets/'))
.send(dataset)
.then(resp => resp.body)
)
return body
}

function updateDataset(datasetId, dataset) {
const updateOnly = Promise.resolve(
withApiKey(request.put(rootUrl + '/datasets/' + datasetId + '/'))
.send(dataset)
.then(resp => resp.body)
)
async function updateDataset(datasetId, dataset) {
const {body} = await got.put(`/datasets/${datasetId}/`, {
baseUrl,
json: true,
headers: {
'X-API-KEY': apiKey
},
body: dataset
})

if (dataset.resources.length > 0) {
return updateOnly
return body
}
return updateOnly.then(publishedDataset => {
return Promise.each(publishedDataset.resources, resource => deleteDatasetResource(datasetId, resource.id))
.then(() => getDataset(datasetId))
})
}

function getDataset(datasetId) {
return Promise.resolve(
withApiKey(request.get(rootUrl + '/datasets/' + datasetId + '/'))
.then(resp => resp.body)
await Promise.all(
body.resources.map(resource => deleteDatasetResource(datasetId, resource.id))
)

return getDataset(datasetId)
}

function deleteDataset(datasetId) {
return Promise.resolve(
withApiKey(request.del(rootUrl + '/datasets/' + datasetId + '/'))
.set('content-length', 0)
).thenReturn()
async function getDataset(datasetId) {
const {body} = await got.get(`/datasets/${datasetId}/`, {
baseUrl,
json: true,
headers: {
'X-API-KEY': apiKey
}
})

return body
}

function createDatasetTransferRequest(datasetId, recipientOrganizationId) {
return Promise.resolve(
withApiKey(request.post(rootUrl + '/transfer/'))
.send({
subject: {id: datasetId, class: 'Dataset'},
recipient: {id: recipientOrganizationId, class: 'Organization'},
comment: 'INSPIRE gateway automated transfer: request'
})
.then(resp => resp.body.id)
)
async function deleteDataset(datasetId) {
await got.delete(`/datasets/${datasetId}/`, {
baseUrl,
headers: {
'X-API-KEY': apiKey,
'content-length': 0
}
})
}

function respondTransferRequest(transferId, response = 'accept') {
return Promise.resolve(
withApiKey(request.post(`${rootUrl}/transfer/${transferId}/`))
.send({comment: 'INSPIRE gateway automated transfer: response', response})
).thenReturn()
async function createDatasetTransferRequest(datasetId, recipientOrganizationId) {
const {body} = await got.post('/transfer/', {
baseUrl,
json: true,
headers: {
'X-API-KEY': apiKey
},
body: {
subject: {
id: datasetId,
class: 'Dataset'
},
recipient: {
id: recipientOrganizationId,
class: 'Organization'
},
comment: 'INSPIRE gateway automated transfer: request'
}
})

return body.id
}

function transferDataset(datasetId, recipientOrganizationId) {
return getDataset(datasetId)
.catch(err => {
if (err.status && err.status === 404) {
throw new Error('Dataset doesn\'t exist')
}
})
.then(() => createDatasetTransferRequest(datasetId, recipientOrganizationId))
.then(transferId => respondTransferRequest(transferId, 'accept'))
.catch(err => {
if (err.status && err.status === 400 && err.response.body.message === 'Recipient should be different than the current owner') {
async function respondTransferRequest(transferId, response = 'accept') {
await got.post(`/transfer/${transferId}/`, {
baseUrl,
json: true,
headers: {
'X-API-KEY': apiKey
},
body: {
comment: 'INSPIRE gateway automated transfer: response',
response
}
})
}

}
})
async function transferDataset(datasetId, recipientOrganizationId) {
try {
await getDataset(datasetId)
} catch (error) {
throw new Error('Dataset doesn’t exist')
}

try {
const transferId = await createDatasetTransferRequest(datasetId, recipientOrganizationId)

await respondTransferRequest(transferId)
} catch (error) {
if (error.statusCode === 400 && error.body.message === 'Recipient should be different than the current owner') {
// Swallow this error…
}
}
}

module.exports = {getOrganization, addUserToOrganization, removeUserFromOrganization, getProfile, createDataset, updateDataset, deleteDataset, getDataset, getUserRoleInOrganization, transferDataset}
module.exports = {
getOrganization,
addUserToOrganization,
removeUserFromOrganization,
getProfile,
createDataset,
updateDataset,
deleteDataset,
getDataset,
getUserRoleInOrganization,
transferDataset
}

0 comments on commit 9d404df

Please sign in to comment.