Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 15x 15x 1x 1x 1x 2x 4x 2x 1x 1x 2x 2x 1x 1x 2x 1x 1x 2x | import { Injectable, NotFoundException } from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { PLACE_TYPE } from 'src/commons/enum/place-type-enum';
import { findCountByType } from 'src/commons/helpers/place-count-by-type.helper';
import { isEmpty } from 'src/commons/util/is/is-empty';
import { PlaceQueryRepository } from 'src/place/place.query.repository';
import { ApiSubwayGetCheckRequestQueryDto } from 'src/subway/dto/api-subway-get-check-request-query.dto';
import { ApiSubwayGetCheckResponseDto } from 'src/subway/dto/api-subway-get-check-response.dto';
import { ApiSubwayGetLineResponseDto } from 'src/subway/dto/api-subway-get-line-response.dto';
import { ApiSubwayGetListResponseDto } from 'src/subway/dto/api-subway-get-list-response.dto';
import { SubwayCustomListDto } from 'src/subway/dto/subway-custom-list.dto';
import { StationInfo } from 'src/subway/interfaces/subway.interfaces';
import { SubwayQueryRepository } from 'src/subway/subway.query.repository';
import { ERROR } from '../commons/constants/error';
@Injectable()
export class SubwayService {
constructor(
private readonly subwayQueryRepository: SubwayQueryRepository,
private readonly placeQueryRepository: PlaceQueryRepository,
) {}
async subwayCustomsCheck(
lineUuid: string,
stationUuid: string,
dto: ApiSubwayGetCheckRequestQueryDto,
): Promise<ApiSubwayGetCheckResponseDto> {
// 1. Retrieve station info first
const stationInfo: StationInfo = await this.subwayQueryRepository.findLineAndStation(
lineUuid,
stationUuid,
);
// 2. 병렬로 호출 (customs, current culture, 이미 추가된 장소)
const [subwayCustoms, subwayCurrentCulture, alreadyAddedPlaces] = await Promise.all([
this.subwayQueryRepository.groupByCustoms(stationInfo),
this.subwayQueryRepository.findSubwayCurrentCulture(stationInfo),
this.placeQueryRepository.findPlacesWithUuids(dto.place_uuids),
]);
// 3. Updated subway customs
const updatedSubwayCustoms = subwayCustoms.map((custom) => {
const addedCount = alreadyAddedPlaces.filter(
(place) => place.place_type === custom.type,
).length;
return { ...custom, count: Number(custom.count) - addedCount };
});
// 4. Compose customs check
const customsCheck = new SubwayCustomListDto({
RESTAURANT: findCountByType(PLACE_TYPE.RESTAURANT, updatedSubwayCustoms),
CAFE: findCountByType(PLACE_TYPE.CAFE, updatedSubwayCustoms),
BAR: findCountByType(PLACE_TYPE.BAR, updatedSubwayCustoms),
SHOPPING: findCountByType(PLACE_TYPE.SHOPPING, updatedSubwayCustoms),
CULTURE:
findCountByType(PLACE_TYPE.EXHIBITION, subwayCurrentCulture) +
findCountByType(PLACE_TYPE.POPUP, subwayCurrentCulture),
ENTERTAINMENT: findCountByType(PLACE_TYPE.ENTERTAINMENT, updatedSubwayCustoms),
});
return new ApiSubwayGetCheckResponseDto({ items: customsCheck });
}
async subwayStationList(lineUuid: string): Promise<ApiSubwayGetListResponseDto> {
const subwayStationList = await this.subwayQueryRepository.subwayStationList(lineUuid);
if (isEmpty(subwayStationList)) {
throw new NotFoundException(ERROR.NOT_EXIST_DATA);
}
return plainToInstance(
ApiSubwayGetListResponseDto,
{
items: subwayStationList.map((station) => ({ uuid: station.uuid, station: station.name })),
},
{ excludeExtraneousValues: true },
);
}
async subwayLineList(): Promise<ApiSubwayGetLineResponseDto> {
const subwayLine = await this.subwayQueryRepository.findSubwayLine();
return plainToInstance(
ApiSubwayGetLineResponseDto,
{ items: subwayLine.map((item) => ({ uuid: item.uuid, line: item.line })) },
{ excludeExtraneousValues: true },
);
}
}
|