-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
166 additions
and
103 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |