From 9daca90d6b68bb114ee20684b4f506230d1c8c8e Mon Sep 17 00:00:00 2001 From: Joe Arndt Date: Fri, 27 Feb 2026 21:41:31 -0600 Subject: [PATCH] added merchant filtering --- src/merchants/merchant-data.service.ts | 13 ++++++++++--- src/merchants/merchants.controller.ts | 15 +++++++++++++-- src/merchants/merchants.service.ts | 5 +++-- src/tags/tag-data.service.ts | 3 ++- src/tags/tags.controller.ts | 4 ++-- src/tags/tags.service.ts | 4 ++-- 6 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/merchants/merchant-data.service.ts b/src/merchants/merchant-data.service.ts index efbb956..088a356 100644 --- a/src/merchants/merchant-data.service.ts +++ b/src/merchants/merchant-data.service.ts @@ -1,7 +1,8 @@ import { Injectable } from '@nestjs/common'; -import { DataSource, Repository } from 'typeorm'; +import { DataSource, ILike, Repository } from 'typeorm'; import { Merchant } from './entities/merchant.entity'; import { UpdateMerchantDto } from './dto/update-merchant.dto'; +import { GetMerchantFilters } from './merchants.controller'; @Injectable() export class MerchantDataService { @@ -11,8 +12,14 @@ export class MerchantDataService { this.merchants = this.dataSource.getRepository(Merchant); } - public async getAll(): Promise { - return await this.merchants.find(); + public async get(filters: GetMerchantFilters): Promise { + const idFilters = filters.ids?.map(id => { return { id }}) ?? []; + const nameFilters = filters.merchants?.map(tag => { return { name: ILike('%' + tag + '%') }}) ?? []; + + return await this.merchants.find({ + where: [...idFilters, ...nameFilters], + order: { name: filters.sort === 'desc' ? 'desc' : 'asc' }, + }); } public async getById(id: string): Promise { diff --git a/src/merchants/merchants.controller.ts b/src/merchants/merchants.controller.ts index 97a7ac3..2cff37d 100644 --- a/src/merchants/merchants.controller.ts +++ b/src/merchants/merchants.controller.ts @@ -6,6 +6,7 @@ import { Delete, Body, Param, + Query, HttpCode, HttpStatus, NotFoundException, @@ -23,8 +24,12 @@ export class MerchantsController { @Get() @HttpCode(HttpStatus.OK) - public async findAll(): Promise { - return await this.merchantsService.findAll(); + public async find(@Query() filters: GetMerchantFilters): Promise { + const ids = Array.isArray(filters.ids) ? filters.ids : filters.ids ? [filters.ids] : []; + const merchants = Array.isArray(filters.merchants) ? filters.merchants : filters.merchants ? [filters.merchants] : []; + const sort = filters.sort?.toLowerCase() === 'desc' ? 'desc' : 'asc'; + + return await this.merchantsService.find({ ids, merchants, sort }); } @Get(':id') @@ -73,3 +78,9 @@ export class MerchantsController { return await this.merchantsService.remove(id); } } + +export interface GetMerchantFilters { + ids?: string[]; + merchants?: string[]; + sort?: 'asc' | 'desc'; +} diff --git a/src/merchants/merchants.service.ts b/src/merchants/merchants.service.ts index ef98690..56a5d84 100644 --- a/src/merchants/merchants.service.ts +++ b/src/merchants/merchants.service.ts @@ -3,13 +3,14 @@ import { CreateMerchantDto } from './dto/create-merchant.dto'; import { UpdateMerchantDto } from './dto/update-merchant.dto'; import { MerchantDataService } from './merchant-data.service'; import { Merchant } from './entities/merchant.entity'; +import { GetMerchantFilters } from './merchants.controller'; @Injectable() export class MerchantsService { public constructor(private merchantDataService: MerchantDataService) { } - public async findAll(): Promise { - return await this.merchantDataService.getAll(); + public async find(filters: GetMerchantFilters): Promise { + return await this.merchantDataService.get(filters); } public async findById(id: string): Promise { diff --git a/src/tags/tag-data.service.ts b/src/tags/tag-data.service.ts index 7776047..ee9400f 100644 --- a/src/tags/tag-data.service.ts +++ b/src/tags/tag-data.service.ts @@ -12,9 +12,10 @@ export class TagDataService { this.tags = this.dataSource.getRepository(Tag); } - public async getAll(filters: GetTagFilters): Promise { + public async get(filters: GetTagFilters): Promise { const idFilters = filters.ids?.map(id => { return { id }}) ?? []; const nameFilters = filters.tags?.map(tag => { return { name: ILike('%' + tag + '%') }}) ?? []; + return await this.tags.find({ where: [...idFilters, ...nameFilters], order: { name: filters.sort === 'desc' ? 'desc' : 'asc' }, diff --git a/src/tags/tags.controller.ts b/src/tags/tags.controller.ts index e240343..b27e5fa 100644 --- a/src/tags/tags.controller.ts +++ b/src/tags/tags.controller.ts @@ -24,12 +24,12 @@ export class TagsController { @Get() @HttpCode(HttpStatus.OK) - public async findAll(@Query() filters: GetTagFilters): Promise { + public async find(@Query() filters: GetTagFilters): Promise { const ids = Array.isArray(filters.ids) ? filters.ids : filters.ids ? [filters.ids] : []; const tags = Array.isArray(filters.tags) ? filters.tags : filters.tags ? [filters.tags] : []; const sort = filters.sort?.toLowerCase() === 'desc' ? 'desc' : 'asc'; - return await this.tagsService.findAll({ ids, tags, sort }); + return await this.tagsService.find({ ids, tags, sort }); } @Get(':id') diff --git a/src/tags/tags.service.ts b/src/tags/tags.service.ts index c47d9be..954dbb2 100644 --- a/src/tags/tags.service.ts +++ b/src/tags/tags.service.ts @@ -9,8 +9,8 @@ import { GetTagFilters } from './tags.controller'; export class TagsService { public constructor(private tagDataService: TagDataService) { } - public async findAll(filters: GetTagFilters): Promise { - return await this.tagDataService.getAll(filters); + public async find(filters: GetTagFilters): Promise { + return await this.tagDataService.get(filters); } public async findById(id: string): Promise {