packages saveing improved

This commit is contained in:
hatskier
2021-12-07 22:56:59 +01:00
parent 9b7f9fac3e
commit 33cb35132c
6 changed files with 60 additions and 40 deletions

View File

@@ -22,6 +22,10 @@ const PackageSchema = new Schema({
type: String,
required: true,
},
prices: {
type: Array,
required: true,
},
});
module.exports = mongoose.model("Package", PackageSchema);

View File

@@ -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,
};

View File

@@ -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);
}));
};

View File

@@ -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"])],

View File

@@ -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"])],

View File

@@ -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"