Skip to content

Commit

Permalink
feat: getTotalFilteredNFTs service created
Browse files Browse the repository at this point in the history
  • Loading branch information
ipapandinas committed Feb 18, 2022
1 parent f70de46 commit 864837d
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 3 deletions.
15 changes: 14 additions & 1 deletion src/api/controllers/nfts/controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import NFTService from "../../services/nft";
import { NextFunction, Request, Response } from "express";
import { validationGetNFTs, validationGetNFT, validationGetStatNFTsUser, validationNFTsBySeries, validationGetSeries, validationCanAddToSeries, validationGetHistory, validationAddCategoriesNFTs, validationGetTotalOnSale, validationLikeUnlike, validationGetFilters } from "../../validators/nftValidators";
import { validationGetNFTs, validationGetNFT, validationGetStatNFTsUser, validationNFTsBySeries, validationGetSeries, validationCanAddToSeries, validationGetHistory, validationAddCategoriesNFTs, validationGetTotalOnSale, validationGetTotalFilteredNFTs, validationLikeUnlike, validationGetFilters } from "../../validators/nftValidators";
import { decryptCookie } from "../../../utils";

export class Controller {
Expand Down Expand Up @@ -117,6 +117,19 @@ export class Controller {
}
}

async getTotalFiltered(
req: Request,
res: Response,
next: NextFunction
): Promise<void>{
try {
const queryValues = validationGetTotalFilteredNFTs(req.query)
res.json(await NFTService.getTotalFilteredNFTs(queryValues));
} catch (err) {
next(err);
}
}

async likeNft(
req: Request,
res: Response,
Expand Down
1 change: 1 addition & 0 deletions src/api/controllers/nfts/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export default express
.get("/most-sold-series", controller.getMostSoldSeries)
.get("/history", controller.getHistory)
.get("/total-on-sale", controller.getTotalOnSale)
.get("/total-filtered", controller.getTotalFiltered)
.get("/:id", controller.getNFT)
.get("/stat/:id", controller.getStatNFTsUser)
.get("/series/data", controller.getNFTsBySeries)
Expand Down
50 changes: 49 additions & 1 deletion src/api/services/gqlQueriesBuilder.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { gql } from "graphql-request";
import { convertSortString, convertSortStringDistinct, LIMIT_MAX_PAGINATION } from "../../utils";
import { getFiltersQuery, getHistoryQuery, getSeriesStatusQuery, NFTBySeriesQuery, NFTQuery, NFTsQuery, statNFTsUserQuery } from "../validators/nftValidators";
import { getFiltersQuery, getHistoryQuery, getSeriesStatusQuery, NFTBySeriesQuery, NFTQuery, NFTsQuery, statNFTsUserQuery, getTotalFilteredNFTsQuery } from "../validators/nftValidators";
// import L from '../../common/logger';

const nodes = `
Expand Down Expand Up @@ -427,6 +427,54 @@ countAllListedInMarketplace = (marketplaceId: number) => gql`
}
`;

countTotalFilteredNFTs = (query: getTotalFilteredNFTsQuery) => {
const {
idsCategories,
idsToExcludeCategories,
marketplaceId,
listed,
priceStartRange,
priceEndRange,
timestampCreateStartRange,
timestampCreateEndRange,
} = query.filter ?? {};

return gql`
{
nftEntities(
filter: {
and: [
{ timestampBurn: { isNull: true } }
${listed!==undefined ? `{ listed: { equalTo: ${!listed ? 0 : 1} } }` : ""}
${marketplaceId!==undefined ? `{ marketplaceId: { equalTo: "${marketplaceId}" } }` : ""}
${idsCategories ? `{id: { in: ${JSON.stringify(idsCategories.map(x => String(x)))} }}` : ""}
${idsToExcludeCategories ? `{id: { notIn: ${JSON.stringify(idsToExcludeCategories.map(x => String(x)))} }}` : ""}
]
${
priceStartRange !== undefined ||
priceEndRange !== undefined
? `priceRounded: {
${priceStartRange!==undefined ? `greaterThanOrEqualTo: ${priceStartRange}` : ""}
${priceStartRange!==undefined ? `lessThanOrEqualTo: ${priceEndRange}` : ""}
}`
: ""
}
${
timestampCreateStartRange !== undefined ||
timestampCreateEndRange !== undefined
? `timestampCreate: {
${timestampCreateStartRange!==undefined ? `greaterThanOrEqualTo: "${timestampCreateStartRange}"` : ""}
${timestampCreateEndRange!==undefined ? `lessThanOrEqualTo: "${timestampCreateEndRange}"` : ""}
}`
: ""
}
}
) {
totalCount
}
}`;
};

getMostSold = (query: getFiltersQuery) => gql`
{
mostSold(
Expand Down
21 changes: 20 additions & 1 deletion src/api/services/nft.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import CategoryService from "./category"
import { populateNFT } from "../helpers/nftHelpers";
import QueriesBuilder from "./gqlQueriesBuilder";
import { decryptCookie, TIME_BETWEEN_SAME_USER_VIEWS } from "../../utils";
import { canAddToSeriesQuery, addCategoriesNFTsQuery, getHistoryQuery, getSeriesStatusQuery, NFTBySeriesQuery, NFTQuery, NFTsQuery, statNFTsUserQuery, getTotalOnSaleQuery, likeUnlikeQuery, getFiltersQuery } from "../validators/nftValidators";
import { canAddToSeriesQuery, addCategoriesNFTsQuery, getHistoryQuery, getSeriesStatusQuery, NFTBySeriesQuery, NFTQuery, NFTsQuery, statNFTsUserQuery, getTotalOnSaleQuery, getTotalFilteredNFTsQuery, likeUnlikeQuery, getFiltersQuery } from "../validators/nftValidators";
import CategoryModel from "../../models/category";
import { ICategory } from "../../interfaces/ICategory";
import { INftLike } from "../../interfaces/INftLike";
Expand Down Expand Up @@ -354,6 +354,25 @@ export class NFTService {
}
}

/**
* Returns the totalCount for the specified filters
* @param query - query (see getTotalFilteredNFTsQuery)
* @throws Will throw an error if indexer is not reachable
*/
async getTotalFilteredNFTs(query: getTotalFilteredNFTsQuery): Promise<boolean> {
try {
// Categories
if (query.filter?.categories) await this.handleFilterCategory(query);

const gqlQuery = QueriesBuilder.countTotalFilteredNFTs(query);
const res = await request(indexerUrl, gqlQuery);
if (!res.nftEntities.totalCount) throw new Error();
return res.nftEntities.totalCount;
} catch (err) {
throw new Error("Filtered count could not have been fetched");
}
}

/**
* Like an NFT
* @param query - see likeUnlikeQuery
Expand Down
30 changes: 30 additions & 0 deletions src/api/validators/nftValidators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -273,4 +273,34 @@ export const validationGetFilters = (query: any) => {
}).required()
})
return validateQuery(validationSchema, { pagination }) as getFiltersQuery;
}

export type getTotalFilteredNFTsQuery = {
filter?: {
idsCategories?: string[],
idsToExcludeCategories?: string[],
categories?: string[],
listed?: boolean,
marketplaceId?: number,
priceStartRange?: number,
priceEndRange?: number,
timestampCreateStartRange?: Date,
timestampCreateEndRange?: Date
}
}
export const validationGetTotalFilteredNFTs = (query: any) => {
let { filter } = query;
if (filter) filter = JSON.parse(filter);
const validationSchema = Joi.object({
filter: Joi.object({
categories: Joi.array().items(Joi.string()),
listed: Joi.boolean(),
marketplaceId: Joi.number().integer().min(0),
priceStartRange: Joi.number(),
priceEndRange: Joi.number(),
timestampCreateStartRange: Joi.date().raw(),
timestampCreateEndRange: Joi.date().raw(),
}),
})
return validateQuery(validationSchema, { filter }) as getTotalFilteredNFTsQuery;
}

0 comments on commit 864837d

Please sign in to comment.