Skip to content

Commit

Permalink
add area loader
Browse files Browse the repository at this point in the history
  • Loading branch information
demshy committed Jan 21, 2024
1 parent afa244f commit 04f48cc
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/crags/crags.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ import { RouteLoader } from './loaders/route.loader';
import { RouteEvent } from './entities/route-event.entity';
import { Parking } from './entities/parking.entity';
import { ParkingsService } from './services/parkings.service';
import { AreaLoader } from './loaders/area.loader';

@Module({
imports: [
Expand Down Expand Up @@ -143,6 +144,7 @@ import { ParkingsService } from './services/parkings.service';
MailService,
SummaryQueueConsumer,
ConfigService,
AreaLoader,
CragLoader,
RouteLoader,
ParkingsService,
Expand Down
24 changes: 24 additions & 0 deletions src/crags/loaders/area.loader.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import DataLoader from 'dataloader';
import { Injectable } from '@nestjs/common';
import { NestDataLoader } from '../../core/interceptors/data-loader.interceptor';
import { Area } from '../entities/area.entity';
import { AreasService } from '../services/areas.service';

@Injectable()
export class AreaLoader implements NestDataLoader<string, Area> {
constructor(private readonly areasService: AreasService) {}

generateDataLoader(): DataLoader<string, Area> {
return new DataLoader<string, Area>(async (keys) => {
const areas = await this.areasService.findByIds(keys.map((k) => k));

const areasMap: { [key: string]: Area } = {};

areas.forEach((area) => {
areasMap[area.id] = area;
});

return keys.map((areaId) => areasMap[areaId] ?? null);
});
}
}
23 changes: 22 additions & 1 deletion src/crags/resolvers/areas.resolver.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
import { Resolver, Mutation, Args, Query } from '@nestjs/graphql';
import {
Resolver,
Mutation,
Args,
Query,
ResolveField,
Parent,
} from '@nestjs/graphql';
import { Area } from '../entities/area.entity';
import { Roles } from '../../auth/decorators/roles.decorator';
import { UseFilters, UseInterceptors } from '@nestjs/common';
Expand All @@ -8,6 +15,11 @@ import { CreateAreaInput } from '../dtos/create-area.input';
import { AreasService } from '../services/areas.service';
import { AllowAny } from '../../auth/decorators/allow-any.decorator';
import { NotFoundFilter } from '../filters/not-found.filter';
import { Country } from '../entities/country.entity';
import { Loader } from '../../core/interceptors/data-loader.interceptor';
import { CountryLoader } from '../loaders/country.loader';
import { Crag } from '../entities/crag.entity';
import DataLoader from 'dataloader';

@Resolver(() => Area)
export class AreasResolver {
Expand Down Expand Up @@ -44,4 +56,13 @@ export class AreasResolver {
async deleteArea(@Args('id') id: string): Promise<boolean> {
return this.areasService.delete(id);
}

@ResolveField('country', () => Country)
async getCountry(
@Parent() crag: Crag,
@Loader(CountryLoader)
loader: DataLoader<Country['id'], Country>,
): Promise<Country> {
return loader.load(crag.countryId);
}
}
11 changes: 11 additions & 0 deletions src/crags/resolvers/crags.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ import { NotificationService } from '../../notification/services/notification.se
import { ForeignKeyConstraintFilter } from '../filters/foreign-key-constraint.filter';
import { ImagesService } from '../services/images.service';
import { Roles } from '../../auth/decorators/roles.decorator';
import { Area } from '../entities/area.entity';
import { AreaLoader } from '../loaders/area.loader';

@Resolver(() => Crag)
@UseInterceptors(DataLoaderInterceptor)
Expand Down Expand Up @@ -218,6 +220,15 @@ export class CragsResolver {
return loader.load(crag.countryId);
}

@ResolveField('area', () => Area, { nullable: true })
async getArea(
@Parent() crag: Area,
@Loader(AreaLoader)
loader: DataLoader<Area['id'], Area>,
): Promise<Area> {
return crag.areaId ? loader.load(crag.areaId) : null;
}

@Mutation(() => Boolean)
@Roles('admin')
@UseGuards(UserAuthGuard)
Expand Down
5 changes: 5 additions & 0 deletions src/crags/services/areas.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ export class AreasService {
return this.areasRepository.findOneByOrFail({ slug });
}

findByIds(ids: string[]): Promise<Area[]> {
const qb = this.areasRepository.createQueryBuilder('area');
return qb.whereInIds(ids).getMany();
}

find(params: FindAreasInput = {}): Promise<Area[]> {
const options: FindManyOptions = {
order: {},
Expand Down

0 comments on commit 04f48cc

Please sign in to comment.