Merge dev into fix/prettier

Brings in the Tours addon and the MikroORM follow-ups. Conflicts were
resolved to dev's content, then every file dev brought in was run through
prettier and eslint --fix so the branch stays uniformly formatted.
This commit is contained in:
Maurice
2026-10-07 15:43:13 +02:00
242 changed files with 22952 additions and 731 deletions
@@ -32,6 +32,7 @@ import {
sharedTestOrm,
createTestTripsRepo,
} from './test-uow';
import { createTestToursRepo } from './tours-repos';
import type { Database } from 'better-sqlite3';
@@ -94,6 +95,7 @@ export async function accommodationsOver(conn: Database): Promise<Accommodations
await createTestPlacesRepo(conn),
await createTestTripMembersRepo(conn),
await createTestRoadtripViasRepo(conn),
await createTestToursRepo(conn),
);
return new AccommodationsService(
permissions,
@@ -221,6 +221,7 @@ import {
sharedTestOrm,
} from './test-uow';
import { createTestTodoItemsRepo, createTestTodoCategoryAssigneesRepo } from './todo-repos';
import { createTestToursRepo } from './tours-repos';
import {
createTestVacayPlansRepo,
createTestVacayPlanMembersRepo,
@@ -432,6 +433,7 @@ export async function createMcpTestRegistry(): Promise<McpRegistry> {
await createTestPlacesRepo(db),
await createTestTripMembersRepo(db),
await createTestRoadtripViasRepo(db),
await createTestToursRepo(db),
);
const accommodationsService = new AccommodationsService(
permissionsService,
+2
View File
@@ -165,6 +165,7 @@ import {
createTestRoadtripDayBoundariesRepo,
} from './test-uow';
import { createTestTodoItemsRepo, createTestTodoCategoryAssigneesRepo } from './todo-repos';
import { createTestToursRepo } from './tours-repos';
import {
createTestVacayPlansRepo,
createTestVacayPlanMembersRepo,
@@ -389,6 +390,7 @@ export async function createPluginRpcHostFactory(db: Database.Database): Promise
await createTestPlacesRepo(db),
await createTestTripMembersRepo(db),
await createTestRoadtripViasRepo(db),
await createTestToursRepo(db),
);
const membership = new TripMembershipService(await createTestTripsRepo(db), await createTestTripMembersRepo(db));
const notifications = await makeNotificationsService(db, realtime);
+3
View File
@@ -51,6 +51,9 @@ const KEEP_TABLES = new Set([
'photo_provider_fields',
'document_providers',
'document_provider_fields',
// Reference data the migration that creates it writes (`tours.tour_type`
// has an FK on it); nothing re-seeds it, so a reset must keep it.
'tour_types',
// Migration bookkeeping: clearing these would make the next boot replay the
// whole history over a schema that already has it.
'schema_version',
+44
View File
@@ -0,0 +1,44 @@
import { TourWaypoints } from '../../src/db/entities/TourWaypoints.entity';
import { Tours } from '../../src/db/entities/Tours.entity';
import type { TourWaypointsRepository } from '../../src/db/repositories/TourWaypoints.repository';
import type { ToursRepository } from '../../src/db/repositories/Tours.repository';
import { sharedTestOrm } from './test-uow';
import type Database from 'better-sqlite3';
/**
* Tours test-only repository factories, bound to a suite's own better-sqlite3
* handle through the same memoised `sharedTestOrm` `test-uow.ts` exports, so
* a repository built here and a `UnitOfWork` from `createTestUnitOfWork`
* resolve the same `EntityManager` (the `todo-repos.ts` precedent).
*/
export function createTestToursRepo(db: Database.Database): Promise<ToursRepository> {
return sharedTestOrm(db).then((t) => t.repo(Tours));
}
export function createTestTourWaypointsRepo(db: Database.Database): Promise<TourWaypointsRepository> {
return sharedTestOrm(db).then((t) => t.repo(TourWaypoints));
}
/** A `tours` row for an existing place, with the defaults a GPX import writes. */
export function createTour(
db: Database.Database,
placeId: number,
overrides: Partial<{
distance: number | null;
match_confidence: number | null;
max_hiking_difficulty: number;
created_at: string;
}> = {},
): void {
db.prepare(
`INSERT INTO tours (place_id, tour_type, distance, match_confidence, max_hiking_difficulty, created_at)
VALUES (?, 'hike', ?, ?, ?, COALESCE(?, CURRENT_TIMESTAMP))`,
).run(
placeId,
overrides.distance ?? null,
overrides.match_confidence ?? null,
overrides.max_hiking_difficulty ?? 2,
overrides.created_at ?? null,
);
}