Skip to content

Commit aba3631

Browse files
authored
Merge pull request #109 from 3box/release/v1.2.0
Release v1.2.0
2 parents 9686bc0 + d016a16 commit aba3631

13 files changed

+217
-57
lines changed

.circleci/config.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ jobs:
3030
name: deploy-to-serverless
3131
command: |
3232
sls package
33+
export CODE_VERSION=${CIRCLE_SHA1:0:7}
3334
if [ "${CIRCLE_BRANCH}" == "develop" ]; then
3435
sls deploy --stage develop
3536
fi
@@ -46,4 +47,4 @@ workflows:
4647
version: 2
4748
build-and-deploy:
4849
jobs:
49-
- build
50+
- build

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## v1.2.0 - 2020-03-12
2+
* feat: add bunyan logger
3+
* feat: add fetch mutliple links and root store address queries
4+
15
## v1.1.6 - 2020-01-24
26
* fix: don't verify EOA type signature for erc1271 contracts
37

Dockerfile.offline

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ COPY serverless.yml webpack.config.js .babelrc ./
1212

1313
EXPOSE 3000
1414

15-
CMD serverless offline start --noEnvironment
15+
CMD serverless offline start --noEnvironment --printOutput

package-lock.json

+92-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "3box-address-server",
3-
"version": "1.1.6",
3+
"version": "1.2.0",
44
"description": "Keeps track of the root store addresses to the user managed data platform",
55
"main": "index.js",
66
"scripts": {
@@ -42,6 +42,7 @@
4242
"dependencies": {
4343
"3id-resolver": "^0.0.5",
4444
"aws-sdk": "^2.574.0",
45+
"bunyan": "^1.8.12",
4546
"cids": "0.7.1",
4647
"did-jwt": "^0.2.0",
4748
"did-resolver": "0.0.6",

serverless.yml

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ provider:
1919
SECRETS: ${self:custom.kmsSecrets.secrets.SECRETS}
2020
IPFS_PATH: /ipfs
2121
AWS_BUCKET_NAME: ${self:custom.awsBucketName.${self:provider.stage}}
22+
CODE_VERSION: ${env:CODE_VERSION}
2223

2324
# Use the serverless-webpack plugin to transpile ES6
2425
plugins:

src/api/__tests__/root_store_addresses_post.test.js

+18
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@ describe('RootStoreAddressesPost', () => {
3131
} else if (did === did4) {
3232
return { root_store_address: rsAddress4 }
3333
}
34+
}),
35+
getMultiple: jest.fn().mockImplementation(dids => {
36+
return dids.map((did) => {
37+
const rsAddressRow = addressMgrMock.get(did)
38+
if (rsAddressRow) {
39+
rsAddressRow.did = did
40+
return rsAddressRow
41+
}
42+
}).filter(rsAddressRow => !!rsAddressRow)
3443
})
3544
}
3645
linkMgrMock = {
@@ -40,6 +49,15 @@ describe('RootStoreAddressesPost', () => {
4049
} else if (addr === address2) {
4150
return { did: did2 }
4251
}
52+
}),
53+
getMultiple: jest.fn().mockImplementation(addresses => {
54+
return addresses.map((addr) => {
55+
const didRow = linkMgrMock.get(addr)
56+
if (didRow) {
57+
didRow.address = addr
58+
return didRow
59+
}
60+
}).filter(didRow => !!didRow)
4361
})
4462
}
4563
sut = new RootStoreAddressesPost(addressMgrMock, linkMgrMock)

src/api/link_delete.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
const { createLogger } = require("../logger")
2+
13
class LinkDeleteHandler {
24
constructor(uPortMgr, linkMgr) {
35
this.uPortMgr = uPortMgr
46
this.linkMgr = linkMgr
7+
this.logger = createLogger({ name: "api.link_delete" })
58
}
69

710
async handle(event, context, cb) {
@@ -26,8 +29,10 @@ class LinkDeleteHandler {
2629
let token = await this.uPortMgr.verifyToken(body.delete_token)
2730
payload = token.payload
2831
} catch (error) {
29-
console.log('Error on this.uportMgr.verifyToken')
30-
console.log(error)
32+
this.logger.error({
33+
msg: 'Error verifying the token',
34+
err: error,
35+
})
3136
cb({ code: 401, message: 'Invalid JWT' })
3237
return
3338
}

src/api/root_store_address_post.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
class RootStoreAddressPost {
1+
const { createLogger } = require("../logger")
2+
3+
class RootStoreAddressPost{
24
constructor (uPortMgr, addressMgr) {
35
this.uPortMgr = uPortMgr
46
this.addressMgr = addressMgr
7+
this.logger = createLogger({ name: "api.root_store_address_post" })
58
}
69

710
async handle (event, context, cb) {
@@ -25,8 +28,10 @@ class RootStoreAddressPost {
2528
let dtoken = await this.uPortMgr.verifyToken(body.address_token)
2629
payload = dtoken.payload
2730
} catch (error) {
28-
console.log('Error on this.uportMgr.verifyToken')
29-
console.log(error)
31+
this.logger.error({
32+
msg: 'Error verifying the token',
33+
err: error,
34+
})
3035
cb({ code: 401, message: 'Invalid JWT' })
3136
return
3237
}

src/api/root_store_addresses_post.js

+35-40
Original file line numberDiff line numberDiff line change
@@ -19,53 +19,48 @@ class RootStoreAddressesPostHandler {
1919
return
2020
}
2121

22-
let promises = []
23-
let resultObj = {}
24-
const getRootStoreFromId = async id => {
25-
const did = await this.getDID(id)
26-
if (did) {
27-
const rootStoreAddress = await this.getRootStore(did)
28-
if (rootStoreAddress) {
29-
resultObj[id] = rootStoreAddress
30-
}
22+
const idDidMap = await this.getDIDs(body.identities)
23+
const didRootStoreMap = await this.getRootStores(Object.values(idDidMap))
24+
25+
const rootStoreAddresses = Object.keys(idDidMap).reduce((acc, id) => {
26+
if (didRootStoreMap[idDidMap[id]]) {
27+
acc[id] = didRootStoreMap[idDidMap[id]]
3128
}
32-
}
33-
body.identities.forEach(id => {
34-
promises.push(getRootStoreFromId(id))
35-
})
36-
await Promise.all(promises)
37-
cb(null, { rootStoreAddresses: resultObj })
29+
return acc
30+
}, {})
31+
cb(null, { rootStoreAddresses })
3832
}
3933

40-
async getRootStore(did) {
41-
// Get rsAddress for did from db
42-
const rsAddress = await this.addressMgr.get(did)
43-
if (!rsAddress) {
44-
return null
45-
} else {
46-
return rsAddress.root_store_address
34+
async getRootStores(dids) {
35+
if (!dids || !dids.length) {
36+
return {}
4737
}
38+
// Get rsAddress for did from db
39+
const rsAddressRows = await this.addressMgr.getMultiple(dids)
40+
return rsAddressRows.reduce((acc, row) => {
41+
acc[row.did] = row.root_store_address
42+
return acc
43+
}, {})
4844
}
4945

50-
async getDID(id) {
51-
// Check if id is an address or a did
52-
let did
53-
if (id.startsWith('0x')) {
54-
const { error } = hexString.validate(id)
55-
if (error) {
56-
return null
57-
}
58-
const didRow = await this.linkMgr.get(id)
59-
if (!didRow) {
60-
return null
61-
}
62-
did = didRow.did
63-
} else if (id.startsWith('did:')) {
64-
did = id
65-
} else {
66-
return null
46+
async getDIDs(ids) {
47+
if (!ids || !ids.length) {
48+
return {}
6749
}
68-
return did
50+
const { dids, addresses } = ids.reduce((acc, id) => {
51+
if (id.startsWith('0x') && !hexString.validate(id).error) {
52+
acc.addresses.push(id)
53+
} else if (id.startsWith('did:')) {
54+
acc.dids.push(id)
55+
}
56+
return acc
57+
}, { dids: [], addresses: [] })
58+
const didRows = addresses.length == 0 ? [] : await this.linkMgr.getMultiple(addresses)
59+
60+
const results = {}
61+
didRows.forEach(row => results[row.address] = row.did)
62+
dids.forEach(did => results[did] = did)
63+
return results
6964
}
7065
}
7166
module.exports = RootStoreAddressesPostHandler

0 commit comments

Comments
 (0)