Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add methods for LabArchives login and fetch of notebooks' figure atta…
…chments
- Loading branch information
1 parent
6a9f2d4
commit bbee198
Showing
9 changed files
with
394 additions
and
100 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
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,7 +1,79 @@ | ||
module.exports = function(accessKeyId, accessPassword) { | ||
const AuthenticationParamsGenerator = require('./authentication_params_generator'); | ||
const axios = require('axios'); | ||
const BASE_ENDPOINT = 'https://api.labarchives.com/api/'; | ||
|
||
module.exports = class { | ||
constructor(accessKeyId, accessPassword) { | ||
this.authParamsGenerator = new AuthenticationParamsGenerator(accessKeyId, accessPassword); | ||
} | ||
|
||
return { | ||
// | ||
async login(login_or_email, password) { | ||
let responseData = await fetchAndParseXml('users/user_access_info', { | ||
login_or_email, | ||
password, | ||
...this._authParams('user_access_info') | ||
}); | ||
this.authParamsGenerator.setUID(responseData.users.id[0]); | ||
} | ||
}; | ||
|
||
async getFigureEntryIDs() { | ||
let responseData = await fetchAndParseXml('search_tools/attachment_search', { | ||
max_to_return: 5000, | ||
...this._authParams('attachment_search') | ||
}); | ||
let entries = responseData['search-tools'].entries[0].entry; | ||
|
||
let entryIDs = []; | ||
entries.forEach( | ||
entry => entryIDs.push(entry.eid[0]) | ||
); | ||
return entryIDs; | ||
} | ||
|
||
getThumbnailUrlOf(entryID) { | ||
let endpoint = BASE_ENDPOINT + 'entries/entry_thumb'; | ||
let queryString = buildQueryString({ | ||
eid: entryID, | ||
...this._authParams('entry_thumb') | ||
}); | ||
|
||
return endpoint + '?' + queryString; | ||
} | ||
|
||
getAttachmentUrlOf(entryID) { | ||
let endpoint = BASE_ENDPOINT + 'entries/entry_attachment'; | ||
let queryString = buildQueryString({ | ||
eid: entryID, | ||
...this._authParams('entry_thumb') | ||
}); | ||
|
||
return endpoint + '?' + queryString; | ||
} | ||
|
||
_authParams(apiMethod) { | ||
return this.authParamsGenerator.generateFor(apiMethod); | ||
} | ||
}; | ||
|
||
async function fetchAndParseXml(relativeEndpoint, params) { | ||
let response = await axios.get(BASE_ENDPOINT + relativeEndpoint, { params }); | ||
return await parseXml(response.data); | ||
} | ||
|
||
function buildQueryString(params) { | ||
const esc = encodeURIComponent; | ||
return Object.keys(params) | ||
.map(key => esc(key) + '=' + esc(params[key])) | ||
.join('&'); | ||
} | ||
|
||
async function parseXml(xml) { | ||
return new Promise(resolve => { | ||
|
||
let parser = new (require('xml2js').Parser); | ||
parser.parseString(xml, (err, result) => { | ||
resolve(result); | ||
}); | ||
|
||
}); | ||
} |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
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
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 |
---|---|---|
@@ -0,0 +1,26 @@ | ||
const ParamsGenerator = require('../lib/authentication_params_generator'); | ||
let generator; | ||
|
||
beforeEach(() => { | ||
generator = new ParamsGenerator('akid', 'password'); | ||
}); | ||
|
||
test('call authentication parameters are generated', () => { | ||
Date.now = jest.fn().mockReturnValue(100); | ||
const hmacsha1 = require('hmacsha1'); | ||
|
||
const generatedParams = generator.generateFor('add_comment'); | ||
|
||
expect(generatedParams).toHaveProperty('akid', 'akid'); | ||
expect(generatedParams).toHaveProperty('expires', 100); | ||
expect(generatedParams).toHaveProperty('sig', hmacsha1('password', 'akidadd_comment100')); | ||
expect(generatedParams).not.toHaveProperty('uid'); | ||
}); | ||
|
||
test('uid parameter is generated as well after it has been set', () => { | ||
generator.setUID('myUid'); | ||
|
||
const generatedParams = generator.generateFor('add_comment'); | ||
|
||
expect(generatedParams).toHaveProperty('uid', 'myUid'); | ||
}); |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.