Skip to content

Commit

Permalink
[ADD] builder search implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
marluanespiritusanto committed Aug 17, 2021
1 parent ceb8eab commit d364e1c
Show file tree
Hide file tree
Showing 11 changed files with 201 additions and 345 deletions.
101 changes: 101 additions & 0 deletions src/modules/territorial-division/v1/strategies/builder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import { Repository, SelectQueryBuilder } from 'typeorm';

import { Utilities } from '@utils/index';

export class StrategyBuilder<T> {
private readonly queryBuilder: SelectQueryBuilder<T>;

constructor(repository: Repository<T>) {
this.queryBuilder = repository.createQueryBuilder();
}

findByName(name: string) {
if (name) {
this.queryBuilder.andWhere('LOWER(name) like LOWER(:name)', {
name: `%${name}%`,
});
}

return this;
}

findByCode(code: string) {
if (code) {
this.queryBuilder.andWhere('code = :code', { code });
}

return this;
}

findByIndentifier(identifier: string) {
if (identifier) {
this.queryBuilder.andWhere('identifier = :identifier', { identifier });
}

return this;
}

findByRegionCode(regionCode: string) {
if (regionCode) {
this.queryBuilder.andWhere('"regionCode" = :regionCode', { regionCode });
}

return this;
}

findByProvinceCode(provinceCode: string) {
if (provinceCode) {
this.queryBuilder.andWhere('"provinceCode" = :provinceCode', {
provinceCode,
});
}

return this;
}

findByMunicipalityCode(municipalityCode: string) {
if (municipalityCode) {
this.queryBuilder.andWhere('"municipalityCode" = :municipalityCode', {
municipalityCode,
});
}

return this;
}

findByDistrictCode(districtCode: string) {
if (districtCode) {
this.queryBuilder.andWhere('"districtCode" = :districtCode', {
districtCode,
});
}

return this;
}

findBySectionCode(sectionCode: string) {
if (sectionCode) {
this.queryBuilder.andWhere('"sectionCode" = :sectionCode', {
sectionCode,
});
}

return this;
}

findByNeighborhoodCode(neighborhoodCode: string) {
if (neighborhoodCode) {
this.queryBuilder.andWhere('"neighborhoodCode" = :neighborhoodCode', {
neighborhoodCode,
});
}

return this;
}

async build() {
const data = await this.queryBuilder.limit(100).getMany();

return Utilities.handleResponse<T>(data);
}
}
50 changes: 11 additions & 39 deletions src/modules/territorial-division/v1/strategies/district.strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Repository } from 'typeorm';
import { QueryDistrictDto } from '../dto';
import { District } from '../entities';
import { QueryStrategy } from '../interfaces';
import { StrategyBuilder } from './builder';

export class DistrictStrategy
implements QueryStrategy<District, QueryDistrictDto>
Expand All @@ -11,44 +12,15 @@ export class DistrictStrategy
query: QueryDistrictDto,
repository: Repository<District>,
): Promise<District | District[]> {
const queryBuilder = repository.createQueryBuilder();

if (query.name) {
queryBuilder.where('LOWER(name) like LOWER(:name)', {
name: `%${query.name}%`,
});
}

if (query.code) {
queryBuilder.andWhere('code = :code', { code: query.code });
}

if (query.identifier) {
queryBuilder.andWhere('identifier = :identifier', {
identifier: query.identifier,
});
}

if (query.municipalityCode) {
queryBuilder.andWhere('"municipalityCode" = :municipalityCode', {
municipalityCode: query.municipalityCode,
});
}

if (query.provinceCode) {
queryBuilder.andWhere('"provinceCode" = :provinceCode', {
provinceCode: query.provinceCode,
});
}

if (query.regionCode) {
queryBuilder.andWhere('"regionCode" = :regionCode', {
regionCode: query.regionCode,
});
}

const data = await queryBuilder.getMany();

return data.length === 1 ? data[0] : data;
const builder = new StrategyBuilder<District>(repository);

return builder
.findByName(query.name)
.findByCode(query.code)
.findByIndentifier(query.identifier)
.findByRegionCode(query.regionCode)
.findByProvinceCode(query.provinceCode)
.findByMunicipalityCode(query.municipalityCode)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Repository } from 'typeorm';
import { QueryMunicipalityDto } from '../dto';
import { Municipality } from '../entities';
import { QueryStrategy } from '../interfaces';
import { StrategyBuilder } from './builder';

export class MunicipalityStrategy
implements QueryStrategy<Municipality, QueryMunicipalityDto>
Expand All @@ -11,38 +12,14 @@ export class MunicipalityStrategy
query: QueryMunicipalityDto,
repository: Repository<Municipality>,
): Promise<Municipality | Municipality[]> {
const queryBuilder = repository.createQueryBuilder();

if (query.name) {
queryBuilder.where('LOWER(name) like LOWER(:name)', {
name: `%${query.name}%`,
});
}

if (query.code) {
queryBuilder.andWhere('code = :code', { code: query.code });
}

if (query.identifier) {
queryBuilder.andWhere('identifier = :identifier', {
identifier: query.identifier,
});
}

if (query.provinceCode) {
queryBuilder.andWhere('"provinceCode" = :provinceCode', {
provinceCode: query.provinceCode,
});
}

if (query.regionCode) {
queryBuilder.andWhere('"regionCode" = :regionCode', {
regionCode: query.regionCode,
});
}

const data = await queryBuilder.limit(100).getMany();

return data.length === 1 ? data[0] : data;
const builder = new StrategyBuilder<Municipality>(repository);

return builder
.findByName(query.name)
.findByCode(query.code)
.findByIndentifier(query.identifier)
.findByRegionCode(query.regionCode)
.findByProvinceCode(query.provinceCode)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Repository } from 'typeorm';
import { QueryNeighborhoodDto } from '../dto';
import { Neighborhood } from '../entities';
import { QueryStrategy } from '../interfaces';
import { StrategyBuilder } from './builder';

export class NeighborhoodStrategy
implements QueryStrategy<Neighborhood, QueryNeighborhoodDto>
Expand All @@ -11,56 +12,17 @@ export class NeighborhoodStrategy
query: QueryNeighborhoodDto,
repository: Repository<Neighborhood>,
): Promise<Neighborhood | Neighborhood[]> {
const queryBuilder = repository.createQueryBuilder();

if (query.name) {
queryBuilder.where('LOWER(name) like LOWER(:name)', {
name: `%${query.name}%`,
});
}

if (query.code) {
queryBuilder.andWhere('code = :code', { code: query.code });
}

if (query.identifier) {
queryBuilder.andWhere('identifier = :identifier', {
identifier: query.identifier,
});
}

if (query.sectionCode) {
queryBuilder.andWhere('"sectionCode" = :sectionCode', {
sectionCode: query.sectionCode,
});
}

if (query.districtCode) {
queryBuilder.andWhere('"districtCode" = :districtCode', {
districtCode: query.districtCode,
});
}

if (query.municipalityCode) {
queryBuilder.andWhere('"municipalityCode" = :municipalityCode', {
municipalityCode: query.municipalityCode,
});
}

if (query.provinceCode) {
queryBuilder.andWhere('"provinceCode" = :provinceCode', {
provinceCode: query.provinceCode,
});
}

if (query.regionCode) {
queryBuilder.andWhere('"regionCode" = :regionCode', {
regionCode: query.regionCode,
});
}

const data = await queryBuilder.limit(100).getMany();

return data.length === 1 ? data[0] : data;
const builder = new StrategyBuilder<Neighborhood>(repository);

return builder
.findByName(query.name)
.findByCode(query.code)
.findByIndentifier(query.identifier)
.findByRegionCode(query.regionCode)
.findByProvinceCode(query.provinceCode)
.findByMunicipalityCode(query.municipalityCode)
.findByDistrictCode(query.districtCode)
.findBySectionCode(query.sectionCode)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Repository } from 'typeorm';
import { QueryProvinceDto } from '../dto';
import { Province } from '../entities';
import { QueryStrategy } from '../interfaces';
import { StrategyBuilder } from './builder';

export class ProvinceStrategy
implements QueryStrategy<Province, QueryProvinceDto>
Expand All @@ -11,32 +12,13 @@ export class ProvinceStrategy
query: QueryProvinceDto,
repository: Repository<Province>,
): Promise<Province | Province[]> {
const queryBuilder = repository.createQueryBuilder();

if (query.name) {
queryBuilder.where('LOWER(name) like LOWER(:name)', {
name: `%${query.name}%`,
});
}

if (query.code) {
queryBuilder.andWhere('code = :code', { code: query.code });
}

if (query.identifier) {
queryBuilder.andWhere('identifier = :identifier', {
identifier: query.identifier,
});
}

if (query.regionCode) {
queryBuilder.andWhere('"regionCode" = :regionCode', {
regionCode: query.regionCode,
});
}

const data = await queryBuilder.limit(100).getMany();

return data.length === 1 ? data[0] : data;
const builder = new StrategyBuilder<Province>(repository);

return builder
.findByName(query.name)
.findByCode(query.code)
.findByIndentifier(query.identifier)
.findByRegionCode(query.regionCode)
.build();
}
}
27 changes: 7 additions & 20 deletions src/modules/territorial-division/v1/strategies/region.strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,19 @@ import { Repository } from 'typeorm';
import { QueryRegionDto } from '../dto';
import { Region } from '../entities';
import { QueryStrategy } from '../interfaces';
import { StrategyBuilder } from './builder';

export class RegionStrategy implements QueryStrategy<Region, QueryRegionDto> {
async find(
query: QueryRegionDto,
repository: Repository<Region>,
): Promise<Region | Region[]> {
const queryBuilder = repository.createQueryBuilder();
const builder = new StrategyBuilder<Region>(repository);

if (query.name) {
queryBuilder.where('LOWER(name) like LOWER(:name)', {
name: `%${query.name}%`,
});
}

if (query.code) {
queryBuilder.andWhere('code = :code', { code: query.code });
}

if (query.identifier) {
queryBuilder.andWhere('identifier = :identifier', {
identifier: query.identifier,
});
}

const data = await queryBuilder.limit(100).getMany();

return data.length === 1 ? data[0] : data;
return builder
.findByName(query.name)
.findByCode(query.code)
.findByIndentifier(query.identifier)
.build();
}
}
Loading

0 comments on commit d364e1c

Please sign in to comment.