get candidates in ad repository

This commit is contained in:
sbriat
2023-09-04 10:15:02 +02:00
parent f4097e96eb
commit 717d047aa8
8 changed files with 227 additions and 92 deletions

View File

@@ -9,7 +9,7 @@ import { AdMapper } from '../ad.mapper';
import { ExtendedPrismaRepositoryBase } from '@mobicoop/ddd-library/dist/db/prisma-repository.base';
import { Frequency } from '../core/domain/ad.types';
export type AdBaseModel = {
export type AdModel = {
uuid: string;
driver: boolean;
passenger: boolean;
@@ -29,62 +29,42 @@ export type AdBaseModel = {
updatedAt: Date;
};
export type AdReadModel = AdBaseModel & {
export type AdReadModel = AdModel & {
waypoints: string;
schedule: ScheduleItemModel[];
};
export type AdWriteModel = AdBaseModel & {
export type AdWriteModel = AdModel & {
schedule: {
create: ScheduleItemModel[];
};
};
export type AdUnsupportedWriteModel = {
export type AdWriteExtraModel = {
waypoints: string;
direction: string;
};
export type ScheduleItemModel = {
uuid: string;
export type ScheduleItem = {
day: number;
time: Date;
margin: number;
};
export type ScheduleItemModel = ScheduleItem & {
uuid: string;
createdAt: Date;
updatedAt: Date;
};
export type RawAdBaseModel = {
uuid: string;
driver: boolean;
passenger: boolean;
frequency: Frequency;
fromDate: Date;
toDate: Date;
seatsProposed: number;
seatsRequested: number;
strict: boolean;
driverDuration?: number;
driverDistance?: number;
passengerDuration?: number;
passengerDistance?: number;
fwdAzimuth: number;
backAzimuth: number;
export type UngroupedAdModel = AdModel &
ScheduleItem & {
waypoints: string;
};
export type GroupedAdModel = AdModel & {
schedule: ScheduleItem[];
waypoints: string;
createdAt: Date;
updatedAt: Date;
};
export type RawScheduleItemModel = {
day: number;
time: Date;
margin: number;
};
export type RawAdModel = RawAdBaseModel & RawScheduleItemModel;
export type RawAdReadModel = RawAdBaseModel & {
schedule: RawScheduleItemModel[];
};
/**
@@ -96,7 +76,7 @@ export class AdRepository
AdEntity,
AdReadModel,
AdWriteModel,
AdUnsupportedWriteModel
AdWriteExtraModel
>
implements AdRepositoryPort
{
@@ -121,40 +101,44 @@ export class AdRepository
}
getCandidates = async (queryString: string): Promise<AdReadModel[]> =>
this.toReadModels((await this.queryRawUnsafe(queryString)) as RawAdModel[]);
this.toAdReadModels(
(await this.prismaRaw.$queryRawUnsafe(queryString)) as UngroupedAdModel[],
);
private toReadModels = (rawAds: RawAdModel[]): AdReadModel[] => {
const rawAdReadModels: RawAdReadModel[] = rawAds.map(
(rawAd: RawAdModel) => ({
uuid: rawAd.uuid,
driver: rawAd.driver,
passenger: rawAd.passenger,
frequency: rawAd.frequency,
fromDate: rawAd.fromDate,
toDate: rawAd.toDate,
private toAdReadModels = (
ungroupedAds: UngroupedAdModel[],
): AdReadModel[] => {
const groupedAdModels: GroupedAdModel[] = ungroupedAds.map(
(ungroupedAd: UngroupedAdModel) => ({
uuid: ungroupedAd.uuid,
driver: ungroupedAd.driver,
passenger: ungroupedAd.passenger,
frequency: ungroupedAd.frequency,
fromDate: ungroupedAd.fromDate,
toDate: ungroupedAd.toDate,
schedule: [
{
day: rawAd.day,
time: rawAd.time,
margin: rawAd.margin,
day: ungroupedAd.day,
time: ungroupedAd.time,
margin: ungroupedAd.margin,
},
],
seatsProposed: rawAd.seatsProposed,
seatsRequested: rawAd.seatsRequested,
strict: rawAd.strict,
driverDuration: rawAd.driverDuration,
driverDistance: rawAd.driverDistance,
passengerDuration: rawAd.passengerDuration,
passengerDistance: rawAd.passengerDistance,
fwdAzimuth: rawAd.fwdAzimuth,
backAzimuth: rawAd.backAzimuth,
waypoints: rawAd.waypoints,
createdAt: rawAd.createdAt,
updatedAt: rawAd.updatedAt,
seatsProposed: ungroupedAd.seatsProposed,
seatsRequested: ungroupedAd.seatsRequested,
strict: ungroupedAd.strict,
driverDuration: ungroupedAd.driverDuration,
driverDistance: ungroupedAd.driverDistance,
passengerDuration: ungroupedAd.passengerDuration,
passengerDistance: ungroupedAd.passengerDistance,
fwdAzimuth: ungroupedAd.fwdAzimuth,
backAzimuth: ungroupedAd.backAzimuth,
waypoints: ungroupedAd.waypoints,
createdAt: ungroupedAd.createdAt,
updatedAt: ungroupedAd.updatedAt,
}),
);
const adReadModels: AdReadModel[] = [];
rawAdReadModels.forEach((adReadModel: AdReadModel) => {
groupedAdModels.forEach((adReadModel: AdReadModel) => {
const ad: AdReadModel | undefined = adReadModels.find(
(arm: AdReadModel) => arm.uuid == adReadModel.uuid,
);