This commit is contained in:
@@ -4,6 +4,9 @@ import type {
|
||||
GuideModelSource,
|
||||
GuideRenderPoi
|
||||
} from '@/domain/guideModel'
|
||||
import type {
|
||||
MuseumPoi
|
||||
} from '@/domain/museum'
|
||||
import {
|
||||
dataSourceConfig
|
||||
} from '@/config/dataSource'
|
||||
@@ -35,6 +38,12 @@ import {
|
||||
import {
|
||||
mapWithConcurrency
|
||||
} from '@/utils/concurrency'
|
||||
import type {
|
||||
GuideRepository
|
||||
} from '@/repositories/GuideRepository'
|
||||
import {
|
||||
guideRepository
|
||||
} from '@/repositories/createGuideRepository'
|
||||
|
||||
const SDK_FLOOR_BUNDLE_CONCURRENCY = 2
|
||||
|
||||
@@ -57,9 +66,7 @@ const toRenderPoi = (poi: StaticNavPoiPayload): GuideRenderPoi => ({
|
||||
hallName: poi.primaryCategory === 'touring_poi' ? poi.name : undefined
|
||||
})
|
||||
|
||||
const toSgsRenderPoi = (
|
||||
poi: ReturnType<typeof toMuseumPoiFromSgs>
|
||||
): GuideRenderPoi => ({
|
||||
const toGuideRenderPoi = (poi: MuseumPoi): GuideRenderPoi => ({
|
||||
id: poi.id,
|
||||
name: poi.name,
|
||||
floorId: poi.floorId,
|
||||
@@ -71,14 +78,28 @@ const toSgsRenderPoi = (
|
||||
kind: poi.kind,
|
||||
hallId: poi.hallId,
|
||||
hallName: poi.hallName,
|
||||
spaceId: poi.spaceId,
|
||||
sourcePlaceId: poi.sourcePlaceId,
|
||||
sourceSpaceId: poi.sourceSpaceId,
|
||||
entrances: poi.entrances
|
||||
})
|
||||
|
||||
const toSgsRenderPoi = (poi: ReturnType<typeof toMuseumPoiFromSgs>) => toGuideRenderPoi(poi)
|
||||
|
||||
const getRenderPoiDedupeKeys = (poi: GuideRenderPoi) => [
|
||||
poi.id ? `id:${poi.id}` : '',
|
||||
poi.sourceSpaceId ? `space:${poi.floorId}:${poi.sourceSpaceId}` : '',
|
||||
poi.spaceId ? `space:${poi.floorId}:${poi.spaceId}` : '',
|
||||
poi.sourcePlaceId ? `place:${poi.floorId}:${poi.sourcePlaceId}` : '',
|
||||
poi.sourceObjectName ? `object:${poi.floorId}:${poi.sourceObjectName}` : ''
|
||||
].filter(Boolean)
|
||||
|
||||
const dedupeRenderPoisById = (pois: GuideRenderPoi[]) => {
|
||||
const seen = new Set<string>()
|
||||
return pois.filter((poi) => {
|
||||
if (!poi.id || seen.has(poi.id)) return false
|
||||
seen.add(poi.id)
|
||||
const keys = getRenderPoiDedupeKeys(poi)
|
||||
if (!keys.length || keys.some((key) => seen.has(key))) return false
|
||||
keys.forEach((key) => seen.add(key))
|
||||
return true
|
||||
})
|
||||
}
|
||||
@@ -283,7 +304,10 @@ export class StaticGuideModelRepository implements GuideModelRepository {
|
||||
export class SgsSdkGuideModelRepository implements GuideModelRepository {
|
||||
private floorsCache: SgsSdkFloorSummaryPayload[] | null = null
|
||||
|
||||
constructor(private readonly provider: SgsSdkApiProvider = defaultSgsSdkApiProvider) {}
|
||||
constructor(
|
||||
private readonly provider: SgsSdkApiProvider = defaultSgsSdkApiProvider,
|
||||
private readonly guide: GuideRepository = guideRepository
|
||||
) {}
|
||||
|
||||
async loadPackage(): Promise<GuideModelRenderPackage> {
|
||||
const startedAt = getNow()
|
||||
@@ -419,7 +443,7 @@ export class SgsSdkGuideModelRepository implements GuideModelRepository {
|
||||
|
||||
const resolvedFloorId = String(matchedFloor.floorId)
|
||||
const loadFloorData = async <T>(
|
||||
endpoint: 'pois' | 'spaces' | 'navigablePlaces',
|
||||
endpoint: 'pois' | 'spaces' | 'navigablePlaces' | 'guidePois' | 'guideSpacePoints',
|
||||
loader: () => Promise<T[]>
|
||||
) => {
|
||||
try {
|
||||
@@ -434,12 +458,20 @@ export class SgsSdkGuideModelRepository implements GuideModelRepository {
|
||||
}
|
||||
}
|
||||
|
||||
const [pois, spaces, navigablePlaces] = await Promise.all([
|
||||
const [pois, spaces, navigablePlaces, guidePois, guideSpacePoints] = await Promise.all([
|
||||
loadFloorData('pois', () => this.provider.getFloorPois(resolvedFloorId)),
|
||||
loadFloorData('spaces', () => this.provider.getFloorSpaces(resolvedFloorId)),
|
||||
loadFloorData('navigablePlaces', () => this.provider.getNavigablePlaces(resolvedFloorId))
|
||||
loadFloorData('navigablePlaces', () => this.provider.getNavigablePlaces(resolvedFloorId)),
|
||||
loadFloorData('guidePois', () => this.guide.listPois()),
|
||||
loadFloorData('guideSpacePoints', () => this.guide.listSpacePoints())
|
||||
])
|
||||
const ordinaryPois = pois.map((poi) => toSgsRenderPoi(toMuseumPoiFromSgs(poi, manifest.floors)))
|
||||
const repositoryBusinessPois = guidePois
|
||||
.filter((poi) => poi.floorId === resolvedFloorId && poi.primaryCategory.id === 'business_poi')
|
||||
.map(toGuideRenderPoi)
|
||||
const repositorySpacePois = guideSpacePoints
|
||||
.filter((poi) => poi.floorId === resolvedFloorId)
|
||||
.map(toGuideRenderPoi)
|
||||
const floorPoiMedianY = getMedianPoiY(ordinaryPois)
|
||||
const museumHallPois = toMuseumHallPoisFromSgs(spaces, navigablePlaces, manifest.floors, resolvedFloorId, {
|
||||
fallbackY: floorPoiMedianY
|
||||
@@ -456,7 +488,9 @@ export class SgsSdkGuideModelRepository implements GuideModelRepository {
|
||||
const hallPois = museumHallPois.map(toSgsRenderPoi)
|
||||
const adaptedPois = dedupeRenderPoisById([
|
||||
...hallPois,
|
||||
...ordinaryPois
|
||||
...ordinaryPois,
|
||||
...repositorySpacePois,
|
||||
...repositoryBusinessPois
|
||||
])
|
||||
const floorMatchedPois = adaptedPois.filter((poi) => poi.floorId === resolvedFloorId)
|
||||
const renderPois = floorMatchedPois
|
||||
@@ -467,6 +501,8 @@ export class SgsSdkGuideModelRepository implements GuideModelRepository {
|
||||
floorId: resolvedFloorId,
|
||||
floorCode: matchedFloor.floorCode,
|
||||
rawPoiCount: pois.length,
|
||||
rawRepositoryBusinessPoiCount: repositoryBusinessPois.length,
|
||||
rawRepositorySpacePoiCount: repositorySpacePois.length,
|
||||
rawPoiTypeCounts: countByValue(pois, (poi) => poi.type),
|
||||
rawPoiGroupCounts: countByValue(pois, (poi) => poi.poiGroup),
|
||||
adaptedPoiCount: adaptedPois.length,
|
||||
|
||||
Reference in New Issue
Block a user