Skip to content

Commit

Permalink
fix: task 521; long response time of filters
Browse files Browse the repository at this point in the history
  • Loading branch information
abdulgalimov committed May 16, 2024
1 parent 7bc59c9 commit 3cb3a6a
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 15 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "unique-marketplace-backend",
"version": "3.0.241",
"version": "3.0.242",
"description": "Backend project for unique marketplace",
"author": "Unique Network",
"private": true,
Expand Down
5 changes: 4 additions & 1 deletion packages/market/src/offers/dto/offers.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,13 @@ export class OffersResultDto {
itemsCount: number;
@ApiProperty({ required: false })
items: OfferEntityDto[];
}

export class OffersAttributesResultDto {
@ApiProperty({ required: false, type: 'array' })
attributes?: Array<any>;
@ApiProperty({ required: false, type: 'array' })
attributesCount?: Array<any>;
counts?: Array<any>;
}

export class OfferAttributes {
Expand Down
11 changes: 10 additions & 1 deletion packages/market/src/offers/offers.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger';
import { OffersService } from './offers.service';
import { readApiDocs } from '../utils/utils';
import { PaginationRouting } from '@app/common/src/lib/base.constants';
import { OfferEntityDto, OffersFilter, OffersResultDto } from './dto/offers.dto';
import { OfferEntityDto, OffersAttributesResultDto, OffersFilter, OffersResultDto } from './dto/offers.dto';
import { ParseOffersFilterPipe } from './pipes/offer-filter.pipe';
import { SortingOfferRequest } from '@app/common/modules/types/requests';
import { ParseSortFilterPipe } from './pipes/sort-order.pipe';
Expand Down Expand Up @@ -32,6 +32,15 @@ export class OffersController {
return await this.offersService.getOffers(offerFilter, pagination, sortFilter);
}

@Get('/attributes')
@ApiOperation({
summary: 'Get offers attributes',
})
@ApiResponse({ type: OffersAttributesResultDto, status: HttpStatus.OK })
async getAttributes() {
return await this.offersService.getOfferAttributes();
}

@Get(':id')
@ApiOperation({
summary: 'Get offer by ID',
Expand Down
20 changes: 18 additions & 2 deletions packages/market/src/offers/offers.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export class OffersService extends BaseService<OfferEntity, OffersDto> {

items = this.parseItems(offers.items, propertiesFilter, collections) as any as Array<ViewOffers>;
} catch (e) {
console.log(e);
this.logger.error(e.message);

throw new BadRequestException({
Expand All @@ -60,11 +61,26 @@ export class OffersService extends BaseService<OfferEntity, OffersDto> {
return {
...offers.meta,
items: items.map(OfferEntityDto.fromOffersEntity),
attributes: offers.attributes as Array<TraitDto>,
attributesCount: offers.attributesCount,
};
}

async getOfferAttributes(): Promise<any> {
let attributes;
try {
attributes = await this.viewOffersService.getAttributes();
} catch (e) {
this.logger.error(e.message);

throw new BadRequestException({
statusCode: HttpStatus.BAD_REQUEST,
message: 'Something went wrong!',
error: e.message,
});
}

return attributes;
}

/**
* Show one selected offer
* @param { collectionId: number; tokenId: number } filter - The ID of the collection and token
Expand Down
27 changes: 19 additions & 8 deletions packages/market/src/offers/view-offers.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,39 +166,50 @@ export class ViewOffersService {
return this.bundleService.bundle(collectionId, tokenId);
}

public async getAttributes(): Promise<any> {
const queryFilter = this.viewOffersRepository.createQueryBuilder('view_offers');
const counts = await this.byAttributesCount(queryFilter);
const attributes = await this.byAttributes(queryFilter).getRawMany();
const attributesParsed = this.parseAttributes(attributes);
return {
counts,
attributes: attributesParsed,
};
}

public async filter(offersFilter: OffersFilter, pagination: PaginationRouting, sort: SortingOfferRequest): Promise<any> {
let queryFilter = this.viewOffersRepository.createQueryBuilder('view_offers');

// Filert by collection id
queryFilter = this.byCollectionId(queryFilter, offersFilter.collectionId);

// Filter by max price
queryFilter = this.byMaxPrice(queryFilter, offersFilter.maxPrice);

// Filter by min price
queryFilter = this.byMinPrice(queryFilter, offersFilter.minPrice);

// Filter by seller address
queryFilter = this.bySeller(queryFilter, offersFilter.seller);

// Filter by search
queryFilter = this.bySearch(queryFilter, offersFilter.searchText, offersFilter.searchLocale);

// Filter by traits
queryFilter = this.byFindAttributes(queryFilter, offersFilter.collectionId, offersFilter.attributes);
// Does not contain a search by the number of attributes
const attributesCount = await this.byAttributesCount(queryFilter);

// Exceptions to the influence of the search by the number of attributes
queryFilter = this.byNumberOfAttributes(queryFilter, offersFilter.numberOfAttributes);

const attributes = await this.byAttributes(queryFilter).getRawMany();

queryFilter = this.prepareQuery(queryFilter);

queryFilter = this.sortBy(queryFilter, sort);
//

const itemQuery = await paginateRaw(queryFilter, pagination);
//

return {
meta: itemQuery.meta,
items: itemQuery.items,
attributes: this.parseAttributes(attributes),
attributesCount,
};
}

Expand Down

0 comments on commit 3cb3a6a

Please sign in to comment.