Skip to content

Commit

Permalink
refactor: get map markers database query (#15899)
Browse files Browse the repository at this point in the history
  • Loading branch information
jrasm91 authored Feb 4, 2025
1 parent 99de524 commit 58bf58b
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 24 deletions.
24 changes: 24 additions & 0 deletions server/src/queries/map.repository.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
-- NOTE: This file is auto generated by ./sql-generator

-- MapRepository.getMapMarkers
select
"id",
"exif"."latitude" as "lat",
"exif"."longitude" as "lon",
"exif"."city",
"exif"."state",
"exif"."country"
from
"assets"
inner join "exif" on "assets"."id" = "exif"."assetId"
and "exif"."latitude" is not null
and "exif"."longitude" is not null
left join "albums_assets_assets" on "assets"."id" = "albums_assets_assets"."assetsId"
where
"isVisible" = $1
and "deletedAt" is null
and "exif"."latitude" is not null
and "exif"."longitude" is not null
and "ownerId" in ($2)
order by
"fileCreatedAt" desc
41 changes: 17 additions & 24 deletions server/src/repositories/map.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { readFile } from 'node:fs/promises';
import readLine from 'node:readline';
import { citiesFile } from 'src/constants';
import { DB, GeodataPlaces, NaturalearthCountries } from 'src/db';
import { AssetEntity, withExif } from 'src/entities/asset.entity';
import { DummyValue, GenerateSql } from 'src/decorators';
import { NaturalEarthCountriesTempEntity } from 'src/entities/natural-earth-countries.entity';
import { LogLevel, SystemMetadataKey } from 'src/enum';
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
Expand Down Expand Up @@ -76,17 +76,19 @@ export class MapRepository {
this.logger.log('Geodata import completed');
}

async getMapMarkers(
ownerIds: string[],
albumIds: string[],
options: MapMarkerSearchOptions = {},
): Promise<MapMarker[]> {
@GenerateSql({ params: [[DummyValue.UUID], []] })
getMapMarkers(ownerIds: string[], albumIds: string[], options: MapMarkerSearchOptions = {}) {
const { isArchived, isFavorite, fileCreatedAfter, fileCreatedBefore } = options;

const assets = (await this.db
return this.db
.selectFrom('assets')
.$call(withExif)
.select('id')
.innerJoin('exif', (builder) =>
builder
.onRef('assets.id', '=', 'exif.assetId')
.on('exif.latitude', 'is not', null)
.on('exif.longitude', 'is not', null),
)
.select(['id', 'exif.latitude as lat', 'exif.longitude as lon', 'exif.city', 'exif.state', 'exif.country'])
.leftJoin('albums_assets_assets', (join) => join.onRef('assets.id', '=', 'albums_assets_assets.assetsId'))
.where('isVisible', '=', true)
.$if(isArchived !== undefined, (q) => q.where('isArchived', '=', isArchived!))
Expand All @@ -96,30 +98,21 @@ export class MapRepository {
.where('deletedAt', 'is', null)
.where('exif.latitude', 'is not', null)
.where('exif.longitude', 'is not', null)
.where((eb) => {
const ors: Expression<SqlBool>[] = [];
.where((builder) => {
const expression: Expression<SqlBool>[] = [];

if (ownerIds.length > 0) {
ors.push(eb('ownerId', 'in', ownerIds));
expression.push(builder('ownerId', 'in', ownerIds));
}

if (albumIds.length > 0) {
ors.push(eb('albums_assets_assets.albumsId', 'in', albumIds));
expression.push(builder('albums_assets_assets.albumsId', 'in', albumIds));
}

return eb.or(ors);
return builder.or(expression);
})
.orderBy('fileCreatedAt', 'desc')
.execute()) as any as AssetEntity[];

return assets.map((asset) => ({
id: asset.id,
lat: asset.exifInfo!.latitude!,
lon: asset.exifInfo!.longitude!,
city: asset.exifInfo!.city,
state: asset.exifInfo!.state,
country: asset.exifInfo!.country,
}));
.execute() as Promise<MapMarker[]>;
}

async reverseGeocode(point: GeoPoint): Promise<ReverseGeocodeResult> {
Expand Down

0 comments on commit 58bf58b

Please sign in to comment.