mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
fix(journey): one journal link per trip as a unique trip id, factories within tsc's depth
The link table keyed by the trip id made both entities a one-to-one, and the test typecheck failed with TS2589 in the itinerary factory. It now holds its own id with trip_id UNIQUE, as trip_invite_tokens does, and its members hang off link_id. The factory error was not this table's alone: any further relation on trips, journeys or users tipped the same check. insertRow and createRow now take a caller's overrides as their own argument instead of a spread checked against RequiredEntityData, so a new relation no longer breaks the itinerary and tour factories. The suites that hand-build TripMembersService get a journalLinksStub.
This commit is contained in:
@@ -5,9 +5,9 @@ import { Users } from './Users.entity';
|
||||
|
||||
export class TripJournalLinkMembers {
|
||||
[EntityRepositoryType]?: TripJournalLinkMembersRepository;
|
||||
[PrimaryKeyProp]?: ['trip', 'user'];
|
||||
trip!: Ref<TripJournalLinks>;
|
||||
trip_id!: number;
|
||||
[PrimaryKeyProp]?: ['link', 'user'];
|
||||
link!: Ref<TripJournalLinks>;
|
||||
link_id!: number;
|
||||
user!: Ref<Users>;
|
||||
user_id!: number;
|
||||
role: TTripJournalLinkMembersRole & Opt = TripJournalLinkMembersRole.VIEWER;
|
||||
@@ -25,10 +25,10 @@ export type TTripJournalLinkMembersRole = (typeof TripJournalLinkMembersRole)[ke
|
||||
export const TripJournalLinkMembersSchema = defineEntity({
|
||||
class: TripJournalLinkMembers,
|
||||
repository: () => TripJournalLinkMembersRepository,
|
||||
uniques: [{ properties: ['trip', 'user'] }],
|
||||
uniques: [{ properties: ['link', 'user'] }],
|
||||
properties: {
|
||||
trip: () => p.manyToOne(TripJournalLinks).primary().ref().name('trip_id').hidden(),
|
||||
trip_id: p.integer().persist(false),
|
||||
link: () => p.manyToOne(TripJournalLinks).primary().ref().hidden(),
|
||||
link_id: p.integer().persist(false),
|
||||
user: () => p.manyToOne(Users).primary().ref().hidden().index('idx_trip_journal_link_members_user'),
|
||||
user_id: p.integer().persist(false).index('idx_trip_journal_link_members_user'),
|
||||
role: p.enum(() => TripJournalLinkMembersRole).default('viewer'),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Collection, EntityRepositoryType, PrimaryKeyProp, type Ref, defineEntity, p } from '@mikro-orm/core';
|
||||
import { Collection, EntityRepositoryType, type Opt, type Ref, defineEntity, p } from '@mikro-orm/core';
|
||||
import { TripJournalLinksRepository } from '../repositories/TripJournalLinks.repository';
|
||||
import { Journeys } from './Journeys.entity';
|
||||
import { TripJournalLinkMembers } from './TripJournalLinkMembers.entity';
|
||||
@@ -7,9 +7,9 @@ import { Users } from './Users.entity';
|
||||
|
||||
export class TripJournalLinks {
|
||||
[EntityRepositoryType]?: TripJournalLinksRepository;
|
||||
[PrimaryKeyProp]?: 'trip';
|
||||
trip?: Ref<Trips> | null;
|
||||
trip_id?: number | null;
|
||||
id!: number & Opt;
|
||||
trip!: Ref<Trips>;
|
||||
trip_id!: number;
|
||||
journey!: Ref<Journeys>;
|
||||
journey_id!: number;
|
||||
linked_by?: number | null;
|
||||
@@ -21,14 +21,16 @@ export class TripJournalLinks {
|
||||
export const TripJournalLinksSchema = defineEntity({
|
||||
class: TripJournalLinks,
|
||||
repository: () => TripJournalLinksRepository,
|
||||
uniques: [{ properties: ['trip'] }],
|
||||
properties: {
|
||||
trip: () => p.oneToOne(Trips).primary().ref().deleteRule('cascade').nullable().hidden(),
|
||||
trip_id: p.integer().nullable().persist(false),
|
||||
id: p.integer().primary(),
|
||||
trip: () => p.manyToOne(Trips).ref().deleteRule('cascade').hidden(),
|
||||
trip_id: p.integer().persist(false),
|
||||
journey: () => p.manyToOne(Journeys).ref().deleteRule('cascade').hidden().index('idx_trip_journal_links_journey'),
|
||||
journey_id: p.integer().persist(false).index('idx_trip_journal_links_journey'),
|
||||
linked_by: p.integer().nullable().persist(false).index('idx_trip_journal_links_linked_by'),
|
||||
created_at: p.integer(),
|
||||
linkedByRef: () => p.manyToOne(Users).ref().joinColumn('linked_by').nullable().hidden().index('idx_trip_journal_links_linked_by'),
|
||||
trip_journal_link_members_collection: () => p.oneToMany(TripJournalLinkMembers).mappedBy('trip').hidden(),
|
||||
trip_journal_link_members_collection: () => p.oneToMany(TripJournalLinkMembers).mappedBy('link').hidden(),
|
||||
},
|
||||
});
|
||||
|
||||
@@ -85,7 +85,7 @@ export class Trips {
|
||||
trip_document_links_collection = new Collection<TripDocumentLinks>(this);
|
||||
trip_files_collection = new Collection<TripFiles>(this);
|
||||
trip_invite_tokens_collection = new Collection<TripInviteTokens>(this);
|
||||
trip_journal_links: Ref<TripJournalLinks> | null = null;
|
||||
trip_journal_links_collection = new Collection<TripJournalLinks>(this);
|
||||
trip_members_collection = new Collection<TripMembers>(this);
|
||||
trip_photos_collection = new Collection<TripPhotos>(this);
|
||||
}
|
||||
@@ -147,7 +147,7 @@ export const TripsSchema = defineEntity({
|
||||
trip_document_links_collection: () => p.oneToMany(TripDocumentLinks).mappedBy('trip').hidden(),
|
||||
trip_files_collection: () => p.oneToMany(TripFiles).mappedBy('trip').hidden(),
|
||||
trip_invite_tokens_collection: () => p.oneToMany(TripInviteTokens).mappedBy('trip').hidden(),
|
||||
trip_journal_links: () => p.oneToOne(TripJournalLinks).ref().mappedBy('trip').hidden(),
|
||||
trip_journal_links_collection: () => p.oneToMany(TripJournalLinks).mappedBy('trip').hidden(),
|
||||
trip_members_collection: () => p.oneToMany(TripMembers).mappedBy('trip').hidden(),
|
||||
trip_photos_collection: () => p.oneToMany(TripPhotos).mappedBy('trip').hidden(),
|
||||
},
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import type { InsertOptional } from './columns';
|
||||
|
||||
export interface TripJournalLinkMembersTable {
|
||||
trip_id: number;
|
||||
link_id: number;
|
||||
user_id: number;
|
||||
role: InsertOptional<string>;
|
||||
hide_skeletons: InsertOptional<number>;
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
import type { InsertOptional } from './columns';
|
||||
|
||||
export interface TripJournalLinksTable {
|
||||
trip_id: InsertOptional<number>;
|
||||
id: InsertOptional<number>;
|
||||
trip_id: number;
|
||||
journey_id: number;
|
||||
linked_by: InsertOptional<number | null>;
|
||||
created_at: number;
|
||||
|
||||
@@ -13,6 +13,11 @@ import { Migration } from '@mikro-orm/migrations';
|
||||
* `hide_skeletons` is that member's own journal preference, which for a direct
|
||||
* contributor sits on the contributor row. A member's rows go with the link,
|
||||
* with the trip and with the account.
|
||||
*
|
||||
* One link per trip is `trip_id UNIQUE` beside its own id rather than the trip
|
||||
* id as key, as `trip_invite_tokens` holds one per trip: a key that is also a
|
||||
* foreign key maps to a one-to-one on both entities, and a second one of those
|
||||
* next to `tours` made the ORM's entity types recurse past what tsc expands.
|
||||
*/
|
||||
export class Migration20200101044300_a_trip_links_a_journal extends Migration {
|
||||
override name = 'Migration20200101044300_a_trip_links_a_journal';
|
||||
@@ -20,7 +25,8 @@ export class Migration20200101044300_a_trip_links_a_journal extends Migration {
|
||||
override up(): void {
|
||||
this.addSql(`
|
||||
CREATE TABLE IF NOT EXISTS trip_journal_links (
|
||||
trip_id INTEGER PRIMARY KEY REFERENCES trips(id) ON DELETE CASCADE,
|
||||
id INTEGER PRIMARY KEY,
|
||||
trip_id INTEGER NOT NULL UNIQUE REFERENCES trips(id) ON DELETE CASCADE,
|
||||
journey_id INTEGER NOT NULL REFERENCES journeys(id) ON DELETE CASCADE,
|
||||
linked_by INTEGER REFERENCES users(id) ON DELETE SET NULL,
|
||||
created_at INTEGER NOT NULL
|
||||
@@ -30,12 +36,12 @@ export class Migration20200101044300_a_trip_links_a_journal extends Migration {
|
||||
this.addSql('CREATE INDEX IF NOT EXISTS idx_trip_journal_links_linked_by ON trip_journal_links(linked_by)');
|
||||
this.addSql(`
|
||||
CREATE TABLE IF NOT EXISTS trip_journal_link_members (
|
||||
trip_id INTEGER NOT NULL REFERENCES trip_journal_links(trip_id) ON DELETE CASCADE,
|
||||
link_id INTEGER NOT NULL REFERENCES trip_journal_links(id) ON DELETE CASCADE,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
role TEXT NOT NULL DEFAULT 'viewer' CHECK (role IN ('viewer', 'editor')),
|
||||
hide_skeletons INTEGER NOT NULL DEFAULT 0,
|
||||
added_at INTEGER NOT NULL,
|
||||
PRIMARY KEY (trip_id, user_id)
|
||||
PRIMARY KEY (link_id, user_id)
|
||||
)
|
||||
`);
|
||||
this.addSql('CREATE INDEX IF NOT EXISTS idx_trip_journal_link_members_user ON trip_journal_link_members(user_id)');
|
||||
|
||||
@@ -75,7 +75,7 @@ export class JourneyContributorsRepository extends TrekRepository<JourneyContrib
|
||||
.updateTable('trip_journal_link_members')
|
||||
.set({ hide_skeletons: value })
|
||||
.where('user_id', '=', userId)
|
||||
.where('trip_id', 'in', db.selectFrom('trip_journal_links').select('trip_id').where('journey_id', '=', journeyId))
|
||||
.where('link_id', 'in', db.selectFrom('trip_journal_links').select('id').where('journey_id', '=', journeyId))
|
||||
.execute();
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ export interface TripJournalLinkMemberRow {
|
||||
export function linkReach(db: Kysely<TripJournalLinkKyselyDB>) {
|
||||
return db
|
||||
.selectFrom('trip_journal_links as l')
|
||||
.innerJoin('trip_journal_link_members as m', 'm.trip_id', 'l.trip_id')
|
||||
.innerJoin('trip_journal_link_members as m', 'm.link_id', 'l.id')
|
||||
.innerJoin('trips as t', 't.id', 'l.trip_id')
|
||||
.where((eb) =>
|
||||
eb.or([
|
||||
@@ -133,9 +133,10 @@ export class TripJournalLinksRepository extends TrekRepository<TripJournalLinks>
|
||||
async listMembers(tripId: number): Promise<TripJournalLinkMemberRow[]> {
|
||||
const rows = await this.kysely<TripJournalLinkKyselyDB>()
|
||||
.selectFrom('trip_journal_link_members as m')
|
||||
.innerJoin('trip_journal_links as l', 'l.id', 'm.link_id')
|
||||
.innerJoin('users as u', 'u.id', 'm.user_id')
|
||||
.select(['m.user_id', 'm.role', 'u.username', 'u.avatar'])
|
||||
.where('m.trip_id', '=', tripId)
|
||||
.where('l.trip_id', '=', tripId)
|
||||
.orderBy('u.username', 'asc')
|
||||
.execute();
|
||||
return rows.map((r) => ({ ...r, role: r.role === 'editor' ? 'editor' : 'viewer' }));
|
||||
@@ -162,7 +163,7 @@ export class TripJournalLinksRepository extends TrekRepository<TripJournalLinks>
|
||||
return people.map((p) => ({ ...p, is_guest: p.is_guest === 1 }));
|
||||
}
|
||||
|
||||
/** Points the trip at a journal, replacing the one it showed. */
|
||||
/** Points the trip at a journal, replacing the one it showed; the link keeps its id. */
|
||||
async upsertLink(tripId: number, journeyId: number, linkedBy: number, now: number): Promise<void> {
|
||||
await this.kysely<TripJournalLinkKyselyDB>()
|
||||
.insertInto('trip_journal_links')
|
||||
@@ -173,6 +174,14 @@ export class TripJournalLinksRepository extends TrekRepository<TripJournalLinks>
|
||||
.execute();
|
||||
}
|
||||
|
||||
/** The id of the trip's link, as a subquery the member writes narrow by. */
|
||||
private linkIdOf(tripId: number) {
|
||||
return this.kysely<TripJournalLinkKyselyDB>()
|
||||
.selectFrom('trip_journal_links')
|
||||
.select('id')
|
||||
.where('trip_id', '=', tripId);
|
||||
}
|
||||
|
||||
/** Sets who the trip's link lets in, replacing the list it had. */
|
||||
async replaceMembers(
|
||||
tripId: number,
|
||||
@@ -180,11 +189,13 @@ export class TripJournalLinksRepository extends TrekRepository<TripJournalLinks>
|
||||
now: number,
|
||||
): Promise<void> {
|
||||
const db = this.kysely<TripJournalLinkKyselyDB>();
|
||||
await db.deleteFrom('trip_journal_link_members').where('trip_id', '=', tripId).execute();
|
||||
const link = await this.linkIdOf(tripId).executeTakeFirst();
|
||||
if (!link) return;
|
||||
await db.deleteFrom('trip_journal_link_members').where('link_id', '=', link.id).execute();
|
||||
if (members.length === 0) return;
|
||||
await db
|
||||
.insertInto('trip_journal_link_members')
|
||||
.values(members.map((m) => ({ trip_id: tripId, user_id: m.user_id, role: m.role, added_at: now })))
|
||||
.values(members.map((m) => ({ link_id: link.id, user_id: m.user_id, role: m.role, added_at: now })))
|
||||
.execute();
|
||||
}
|
||||
|
||||
@@ -200,7 +211,7 @@ export class TripJournalLinksRepository extends TrekRepository<TripJournalLinks>
|
||||
async deleteMember(tripId: number, userId: number): Promise<void> {
|
||||
await this.kysely<TripJournalLinkKyselyDB>()
|
||||
.deleteFrom('trip_journal_link_members')
|
||||
.where('trip_id', '=', tripId)
|
||||
.where('link_id', 'in', this.linkIdOf(tripId))
|
||||
.where('user_id', '=', userId)
|
||||
.execute();
|
||||
}
|
||||
|
||||
@@ -29,13 +29,12 @@ export async function makeDayAssignment(
|
||||
overrides: EntityData<DayAssignments> = {},
|
||||
): Promise<DayAssignmentRow> {
|
||||
const orderIndex = overrides.order_index ?? (await nextOrderIndex(orm, dayId));
|
||||
return createRow(orm, DayAssignments, {
|
||||
day: dayId,
|
||||
place: placeId,
|
||||
notes: null,
|
||||
...overrides,
|
||||
order_index: orderIndex,
|
||||
});
|
||||
return createRow(
|
||||
orm,
|
||||
DayAssignments,
|
||||
{ day: dayId, place: placeId, notes: null },
|
||||
{ ...overrides, order_index: orderIndex },
|
||||
);
|
||||
}
|
||||
|
||||
/** A note on the day, sorted last unless `sort_order` says otherwise. */
|
||||
@@ -45,15 +44,19 @@ export function makeDayNote(
|
||||
tripId: number,
|
||||
overrides: EntityData<DayNotes> = {},
|
||||
): Promise<DayNoteRow> {
|
||||
return createRow(orm, DayNotes, {
|
||||
day: dayId,
|
||||
trip: tripId,
|
||||
text: 'Test note',
|
||||
time: null,
|
||||
icon: '📝',
|
||||
sort_order: 9999,
|
||||
...overrides,
|
||||
});
|
||||
return createRow(
|
||||
orm,
|
||||
DayNotes,
|
||||
{
|
||||
day: dayId,
|
||||
trip: tripId,
|
||||
text: 'Test note',
|
||||
time: null,
|
||||
icon: '📝',
|
||||
sort_order: 9999,
|
||||
},
|
||||
overrides,
|
||||
);
|
||||
}
|
||||
|
||||
/** A stay at `placeId` from the start day to the end day. */
|
||||
@@ -65,14 +68,18 @@ export function makeDayAccommodation(
|
||||
endDayId: number,
|
||||
overrides: EntityData<DayAccommodations> = {},
|
||||
): Promise<DayAccommodationRow> {
|
||||
return createRow(orm, DayAccommodations, {
|
||||
trip: tripId,
|
||||
place: placeId,
|
||||
startDay: startDayId,
|
||||
endDay: endDayId,
|
||||
check_in: null,
|
||||
check_out: null,
|
||||
confirmation: null,
|
||||
...overrides,
|
||||
});
|
||||
return createRow(
|
||||
orm,
|
||||
DayAccommodations,
|
||||
{
|
||||
trip: tripId,
|
||||
place: placeId,
|
||||
startDay: startDayId,
|
||||
endDay: endDayId,
|
||||
check_in: null,
|
||||
check_out: null,
|
||||
confirmation: null,
|
||||
},
|
||||
overrides,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -28,17 +28,26 @@ import type {
|
||||
* `SELECT *` returned.
|
||||
*/
|
||||
|
||||
/** Inserts one row and returns its primary key (the autoincrement id for most tables). */
|
||||
/**
|
||||
* Inserts one row and returns its primary key (the autoincrement id for most tables).
|
||||
*
|
||||
* A factory hands its caller's `overrides` in as their own argument rather than
|
||||
* spread into `data`: checking a spread `EntityData` against `RequiredEntityData`
|
||||
* expands every relation the entity reaches, and for the itinerary and tour rows
|
||||
* (day to trip, place to tour) that took tsc past its instantiation depth (TS2589).
|
||||
*/
|
||||
export function insertRow<T extends object>(
|
||||
orm: FactoryOrm,
|
||||
entity: EntityClass<T>,
|
||||
data: RequiredEntityData<T>,
|
||||
overrides?: EntityData<T>,
|
||||
): Promise<Primary<T>> {
|
||||
const row = (overrides ? { ...data, ...overrides } : data) as RequiredEntityData<T>;
|
||||
// async, so a refused column rejects the returned promise rather than
|
||||
// throwing before the caller has one to await.
|
||||
return inContext(orm, async (em) => {
|
||||
assertWritable(em, entity, data);
|
||||
return em.insert(entity, data);
|
||||
assertWritable(em, entity, row);
|
||||
return em.insert(entity, row);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -65,14 +74,15 @@ export function insertRows<T extends object>(
|
||||
/**
|
||||
* Inserts one row into a table keyed by a single autoincrement `id` and reads
|
||||
* it back, defaults and all. For a table with a composite or natural key use
|
||||
* `insertRow` and then `findRow` with the key columns.
|
||||
* `insertRow` and then `findRow` with the key columns. `overrides` as for `insertRow`.
|
||||
*/
|
||||
export async function createRow<T extends { id: number }>(
|
||||
orm: FactoryOrm,
|
||||
entity: EntityClass<T>,
|
||||
data: RequiredEntityData<T>,
|
||||
overrides?: EntityData<T>,
|
||||
): Promise<EntityDTO<T>> {
|
||||
const id = await insertRow(orm, entity, data);
|
||||
const id = await insertRow(orm, entity, data, overrides);
|
||||
const row = await findRow(orm, entity, { id } as FilterQuery<T>);
|
||||
if (!row) throw new Error(`createRow: ${entity.name} ${String(id)} is not there after its insert`);
|
||||
return row;
|
||||
|
||||
@@ -11,7 +11,7 @@ export type TourRow = EntityDTO<Tours>;
|
||||
* of its own; its type defaults to 'hike', the one the tours migration seeds.
|
||||
*/
|
||||
export async function makeTour(orm: FactoryOrm, placeId: number, overrides: EntityData<Tours> = {}): Promise<TourRow> {
|
||||
await insertRow(orm, Tours, { place: placeId, tourTypeRef: 'hike', ...overrides });
|
||||
await insertRow(orm, Tours, { place: placeId, tourTypeRef: 'hike' }, overrides);
|
||||
const tour = await findRow(orm, Tours, { place: placeId });
|
||||
if (!tour) throw new Error(`makeTour: no tour for place ${placeId} after its insert`);
|
||||
return tour;
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
import type { TripJournalLinkService } from '../../src/nest/journey/trip-journal-link.service';
|
||||
|
||||
/**
|
||||
* TripJournalLinkService for the suites that hand-build TripMembersService:
|
||||
* leaving a trip only has to drop the member from a linked journal, and what
|
||||
* that does to the journal's access is pinned by the TJL integration tests
|
||||
* against the real service.
|
||||
*/
|
||||
export function journalLinksStub(
|
||||
dropMember: TripJournalLinkService['dropMember'] = async () => {},
|
||||
): TripJournalLinkService {
|
||||
return { dropMember } as unknown as TripJournalLinkService;
|
||||
}
|
||||
@@ -111,6 +111,7 @@ import {
|
||||
} from './collab-repos';
|
||||
import { createTestTripFilesRepo, createTestFileLinksRepo, createTestBudgetItemsRepo } from './files-repos';
|
||||
import { noGoogleQuota } from './google-quota';
|
||||
import { journalLinksStub } from './journal-links';
|
||||
import {
|
||||
createTestJourneysRepo,
|
||||
createTestJourneyContributorsRepo,
|
||||
@@ -532,6 +533,7 @@ export async function createPluginRpcHostParts(
|
||||
permissions,
|
||||
realtime,
|
||||
notificationsStub(),
|
||||
journalLinksStub(),
|
||||
await createTestUnitOfWork(db),
|
||||
await createTestTripsRepo(db),
|
||||
await createTestTripMembersRepo(db),
|
||||
|
||||
@@ -56,6 +56,7 @@ import { CollabService } from '../../../src/nest/collab/collab.service';
|
||||
import { VacayService } from '../../../src/nest/vacay/vacay.service';
|
||||
import { QueryHelpersService } from '../../../src/nest/query-helpers/query-helpers.service';
|
||||
import { notificationsStub } from '../../helpers/notifications';
|
||||
import { journalLinksStub } from '../../helpers/journal-links';
|
||||
import { createTestUnitOfWork, createTestAppSettingsRepo, createTestUsersRepo, sharedTestOrm, createTestTripsRepo, createTestTripMembersRepo } from '../../helpers/test-uow';
|
||||
import { budgetRepoArgs, createTestBudgetItemMembersRepo, createTestBudgetItemPayersRepo, createTestBudgetSettlementsRepo } from '../../helpers/budget-repos';
|
||||
import { createTestShareTokensRepo, createTestPluginsRepo, createTestPluginUserErasureQueueRepo } from '../../helpers/share-repos';
|
||||
@@ -161,6 +162,7 @@ beforeAll(async () => {
|
||||
new PermissionsService(await createTestAppSettingsRepo(testDb), await createTestUnitOfWork(testDb)),
|
||||
new RealtimeService(),
|
||||
notificationsStub(),
|
||||
journalLinksStub(),
|
||||
await createTestUnitOfWork(testDb),
|
||||
await createTestTripsRepo(testDb),
|
||||
await createTestTripMembersRepo(testDb),
|
||||
|
||||
@@ -37,6 +37,7 @@ import { countRows, deleteRows, findRow, findRows, insertRow, updateRows } from
|
||||
import { readUser } from '../../helpers/factories/users';
|
||||
import { FakeRealtimeService } from '../../helpers/fake-realtime';
|
||||
import { createTestBudgetItemsRepo } from '../../helpers/files-repos';
|
||||
import { journalLinksStub } from '../../helpers/journal-links';
|
||||
import {
|
||||
createTestJourneysRepo,
|
||||
createTestJourneyEntriesRepo,
|
||||
@@ -143,6 +144,7 @@ beforeAll(async () => {
|
||||
new PermissionsService(await createTestAppSettingsRepo(testDb), await createTestUnitOfWork(testDb)),
|
||||
realtime,
|
||||
notificationsStub(notifySend),
|
||||
journalLinksStub(),
|
||||
await createTestUnitOfWork(testDb),
|
||||
tripsRepo,
|
||||
tripMembersRepo,
|
||||
|
||||
@@ -57,6 +57,7 @@ import { insertRow, updateRows } from '../../helpers/factories/rows';
|
||||
import { FakeRealtimeService } from '../../helpers/fake-realtime';
|
||||
import { createTestTripFilesRepo, createTestFileLinksRepo, createTestBudgetItemsRepo } from '../../helpers/files-repos';
|
||||
import { noGoogleQuota } from '../../helpers/google-quota';
|
||||
import { journalLinksStub } from '../../helpers/journal-links';
|
||||
import {
|
||||
createTestJourneysRepo,
|
||||
createTestJourneyContributorsRepo,
|
||||
@@ -258,6 +259,7 @@ beforeAll(async () => {
|
||||
new PermissionsService(await createTestAppSettingsRepo(testDb), await createTestUnitOfWork(testDb)),
|
||||
realtime,
|
||||
notificationsStub(),
|
||||
journalLinksStub(),
|
||||
await createTestUnitOfWork(testDb),
|
||||
await createTestTripsRepo(testDb),
|
||||
await createTestTripMembersRepo(testDb),
|
||||
|
||||
@@ -71,6 +71,7 @@ import { QueryHelpersService } from '../../../src/nest/query-helpers/query-helpe
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { notificationsStub } from '../../helpers/notifications';
|
||||
import { journalLinksStub } from '../../helpers/journal-links';
|
||||
import { EphemeralTokenService } from '../../../src/nest/auth-core/ephemeral-token.service';
|
||||
import {
|
||||
createTestUnitOfWork, createTestAppSettingsRepo, createTestUsersRepo, sharedTestOrm,
|
||||
@@ -305,7 +306,7 @@ beforeAll(async () => {
|
||||
(await sharedTestOrm(testDb)).em,
|
||||
new SettingsService(await createTestUnitOfWork(testDb), await createTestAppSettingsRepo(testDb), await createTestSettingsRepo(testDb), membership.get(TripMembershipService)),
|
||||
);
|
||||
membersSvc = new TripMembersService(budgetSvc, new UserCleanupService(new MaintenanceRepository(dbsEm!), budgetSvc, await createTestUnitOfWork(testDb), await createTestUsersRepo(testDb), await createTestTripMembersRepo(testDb), await createTestBudgetItemsRepo(testDb), await createTestBudgetSettlementsRepo(testDb), await createTestJourneyShareTokensRepo(testDb), await createTestJourneysRepo(testDb), await createTestJourneyEntriesRepo(testDb), await createTestJourneyContributorsRepo(testDb), await createTestShareTokensRepo(testDb), await createTestPluginsRepo(testDb), await createTestPluginUserErasureQueueRepo(testDb)), new PermissionsService(await createTestAppSettingsRepo(testDb), await createTestUnitOfWork(testDb)), realtime, notificationsStub(), await createTestUnitOfWork(testDb), await createTestTripsRepo(testDb), await createTestTripMembersRepo(testDb), await createTestUsersRepo(testDb));
|
||||
membersSvc = new TripMembersService(budgetSvc, new UserCleanupService(new MaintenanceRepository(dbsEm!), budgetSvc, await createTestUnitOfWork(testDb), await createTestUsersRepo(testDb), await createTestTripMembersRepo(testDb), await createTestBudgetItemsRepo(testDb), await createTestBudgetSettlementsRepo(testDb), await createTestJourneyShareTokensRepo(testDb), await createTestJourneysRepo(testDb), await createTestJourneyEntriesRepo(testDb), await createTestJourneyContributorsRepo(testDb), await createTestShareTokensRepo(testDb), await createTestPluginsRepo(testDb), await createTestPluginUserErasureQueueRepo(testDb)), new PermissionsService(await createTestAppSettingsRepo(testDb), await createTestUnitOfWork(testDb)), realtime, notificationsStub(), journalLinksStub(), await createTestUnitOfWork(testDb), await createTestTripsRepo(testDb), await createTestTripMembersRepo(testDb), await createTestUsersRepo(testDb));
|
||||
readModelSvc = new TripReadModelService(
|
||||
await createTestTripsRepo(testDb), membersSvc, daysSvc, accommodationsSvc, budgetSvc,
|
||||
new PackingService(
|
||||
|
||||
Reference in New Issue
Block a user