From 33cb35132ce5c690d60325fa169602d6a817312a Mon Sep 17 00:00:00 2001 From: hatskier Date: Tue, 7 Dec 2021 22:56:59 +0100 Subject: [PATCH] packages saveing improved --- models/package.js | 4 ++ providers/index.js | 17 ++++++- routes/packages.js | 67 ++++++++++++++------------ test/lite-mode-routes/packages.test.js | 2 +- test/routes/packages.test.js | 4 +- yarn.lock | 6 +-- 6 files changed, 60 insertions(+), 40 deletions(-) diff --git a/models/package.js b/models/package.js index 1de6f2e..d59cb82 100644 --- a/models/package.js +++ b/models/package.js @@ -22,6 +22,10 @@ const PackageSchema = new Schema({ type: String, required: true, }, + prices: { + type: Array, + required: true, + }, }); module.exports = mongoose.model("Package", PackageSchema); diff --git a/providers/index.js b/providers/index.js index 7d7ce54..2f05209 100644 --- a/providers/index.js +++ b/providers/index.js @@ -5,17 +5,30 @@ function getProviders() { } function getPublicKeyForProviderAddress(address) { + const details = findProviderDetailsByAddress(address); + return details.publicKey; +} + +function getEvmAddressForProviderAddress(address) { + const details = findProviderDetailsByAddress(address); + return details.evmAddress; +} + +function findProviderDetailsByAddress(address) { for (const providerName in providers) { const details = providers[providerName]; if (details.address === address) { - return details.publicKey; + return details; } } + // TODO: maybe uncomment // throw new Error(`Public key not found for provider address: ${address}`); - return ""; + return {}; } + module.exports = { getProviders, getPublicKeyForProviderAddress, + getEvmAddressForProviderAddress, }; diff --git a/routes/packages.js b/routes/packages.js index 16a6aba..32f6a97 100644 --- a/routes/packages.js +++ b/routes/packages.js @@ -5,6 +5,7 @@ const Price = require("../models/price"); const { getProviderFromParams } = require("../utils"); const { tryCleanCollection } = require("../helpers/mongo"); const config = require("../config"); +const { getEvmAddressForProviderAddress } = require("../providers"); function dbItemToObj(item) { return _.omit(item.toObject(), ["_id", "__v"]); @@ -23,8 +24,11 @@ module.exports = (router) => { }); } + // Saving package in DB const newPackage = new Package(req.body); await newPackage.save(); + + // Returning package id in response return res.json({ msg: "Package saved", id: newPackage._id, @@ -42,43 +46,42 @@ module.exports = (router) => { throw new Error("Provider address is required"); } - // Fetching package from DB - const packages = await Package - .find({ provider: provider.address }) - .sort({ timestamp: -1 }) - .limit(1); + let responseObj; + const symbol = req.query.symbol; - const packageObjects = packages.map(dbItemToObj); + if (symbol) { + // Fetching latest price for symbol from DB + const price = await Price.findOne({ + provider: provider.address, + symbol, + }) + .sort({ timestamp: -1 }); - if (packageObjects.length === 0) { - return res.status(404).send("Package not found"); - } else { - const packageObj = packageObjects[0]; - - // Building mongo query - const priceQuery = { - provider: provider.address, - timestamp: packageObj.timestamp, + if (!price) { + throw new Error(`Value not found for symbol: ${symbol}`); + } + + responseObj = { + ..._.pick(price, ["timestamp", "provider"]), + signature: price.evmSignature.toString("base64"), + liteSignature: price.liteEvmSignature.toString("base64"), + prices: [{ symbol: req.query.symbol, value: price.value }], + signer: provider.evmAddress, // TODO: we don't really need signer, as it must be fetched from a trusted source or hardcoded in the redstone-evm-connector }; - if (req.query.symbol) { - priceQuery.symbol = req.query.symbol; + } else { + // Fetching latest package from DB + const packageFromDB = await Package.findOne({ + provider: provider.address, + }) + .sort({ timestamp: -1 }); + + if (!packageFromDB) { + throw new Error(`Latest package not found`); } - // Fetching prices from DB - const prices = await Price.find(priceQuery); - packageObj.prices = prices.map(p => _.pick(p, ["symbol", "value"])); - - // Replacing evm signatures for single price if needed - if (req.query.symbol) { - if (prices.length !== 1) { - throw new Error( - `Must have exactly one price for symbol: "${req.query.symbol}"`); - } - packageObj.signature = prices[0].evmSignature.toString("base64"); - packageObj.liteSignature = prices[0].liteEvmSignature.toString("base64"); - } - - return res.json(packageObj); + responseObj = dbItemToObj(packageFromDB); } + + return res.json(responseObj); })); }; diff --git a/test/lite-mode-routes/packages.test.js b/test/lite-mode-routes/packages.test.js index ed076bd..f35ee8f 100644 --- a/test/lite-mode-routes/packages.test.js +++ b/test/lite-mode-routes/packages.test.js @@ -68,7 +68,6 @@ describe("Testing packages route", () => { // Given await new Price({ ...testPrice, - }).save(); await new Package(testPackage).save(); @@ -83,6 +82,7 @@ describe("Testing packages route", () => { // Then expect(response.body).toEqual({ ...testPackage, + signer: "0x926E370fD53c23f8B71ad2B3217b227E41A92b12", signature: evmSignature, liteSignature: liteEvmSignature, prices: [_.pick(testPrice, ["value", "symbol"])], diff --git a/test/routes/packages.test.js b/test/routes/packages.test.js index efd3632..26cbf8d 100644 --- a/test/routes/packages.test.js +++ b/test/routes/packages.test.js @@ -58,9 +58,8 @@ describe("Testing packages route", () => { // Given await new Price({ ...testPrice, - }).save(); - await new Package(testPackage).save(); + // await new Package(testPackage).save(); // When const response = await request(app) @@ -73,6 +72,7 @@ describe("Testing packages route", () => { // Then expect(response.body).toEqual({ ...testPackage, + signer: "0x926E370fD53c23f8B71ad2B3217b227E41A92b12", signature: evmSignature, liteSignature: liteEvmSignature, prices: [_.pick(testPrice, ["value", "symbol"])], diff --git a/yarn.lock b/yarn.lock index 6c85619..42d8c23 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1628,9 +1628,9 @@ camelcase@^6.1.0, camelcase@^6.2.0: integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== caniuse-lite@^1.0.30001219: - version "1.0.30001237" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz#4b7783661515b8e7151fc6376cfd97f0e427b9e5" - integrity sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw== + version "1.0.30001285" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001285.tgz" + integrity sha512-KAOkuUtcQ901MtmvxfKD+ODHH9YVDYnBt+TGYSz2KIfnq22CiArbUxXPN9067gNbgMlnNYRSwho8OPXZPALB9Q== caseless@~0.12.0: version "0.12.0"