Skip to content
This repository has been archived by the owner on Apr 21, 2020. It is now read-only.

Faster tokens fetch #252

Merged
merged 1 commit into from
Mar 30, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 28 additions & 18 deletions src/controllers/TokenController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,15 @@ const _uniqBy = require("lodash.uniqby");

export class TokenController {

public readAllTokens(req: Request, res: Response) {
public readAllTokens = (req: Request, res: Response) => {
const validationErrors: any = TokenController.validateQueryParameters(req)

// validate query input
const validationErrors: any = TokenController.validateQueryParameters(req);
if (validationErrors) {
sendJSONresponse(res, 400, validationErrors);
return;
}
if (validationErrors) return sendJSONresponse(res, 400, validationErrors)

// extract query parameters
const queryParams = TokenController.extractQueryParameters(req);
const address = queryParams.address.toLowerCase();
const query: any = {
address: address
};
const queryParams = this.extractQueryParameters(req)
const address = queryParams.address.toLowerCase()

TokenController.getRemoteTokens(address).then((tokens: any) => {
this.getTokensByAddress(address).then((tokens: any) => {
if (tokens) {
sendJSONresponse(res, 200, {
docs: tokens
Expand All @@ -37,6 +29,24 @@ export class TokenController {
});
}

private async getTokensByAddress(address: string) {
const tokens = await Token.findOne({_id: address}).populate({path: "tokens"}).then((tokens: any) => tokens);

return tokens.tokens.map((token: any) => {
const address = token.address;
return {
balance: "0",
contract: {
contract: address,
address,
name: token.name,
decimals: token.decimals,
symbol: token.symbol
}
}
})
}

static getRemoteTokens(address: string) {
const url = `https://api.ethplorer.io/getAddressInfo/${address}?apiKey=freekey`;
return axios.get(url).then((res: any) => {
Expand Down Expand Up @@ -161,13 +171,13 @@ export class TokenController {
});
}

public listTokensNew(req: Request, res: Response) {
public listTokensNew = (req: Request, res: Response) => {
const term = req.query.query;
if (!term) {
sendJSONresponse(res, 404, {"message": "need query"})
return;
}
const queryParams = TokenController.extractQueryParameters(req);
const queryParams = this.extractQueryParameters(req);
const re = new RegExp(term, "i");
const query = ERC20Contract.find().or([
{ "name": { $regex: re }},
Expand All @@ -187,12 +197,12 @@ export class TokenController {
private static validateQueryParameters(req: Request) {
req.checkQuery("page", "Page needs to be a number").optional().isNumeric();
req.checkQuery("limit", "limit needs to be a number").optional().isNumeric();
req.checkQuery("address", "address needs to be alphanumeric").isAlphanumeric();
req.checkQuery("address", "address needs to be alphanumeric").isAlphanumeric().isLength({min: 42, max: 42});

return req.validationErrors();
}

private static extractQueryParameters(req: Request) {
private extractQueryParameters(req: Request) {
// page parameter
let page = parseInt(xss.inHTMLData(req.query.page));
if (isNaN(page) || page < 1) {
Expand Down