mirror of
https://github.com/alexgo-io/redstone-cache-layer.git
synced 2026-01-12 16:53:15 +08:00
packages saveing improved
This commit is contained in:
@@ -22,6 +22,10 @@ const PackageSchema = new Schema({
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
prices: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
|
||||
module.exports = mongoose.model("Package", PackageSchema);
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}));
|
||||
};
|
||||
|
||||
@@ -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"])],
|
||||
|
||||
@@ -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"])],
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user