import { createMap, forMember, mapFrom, Mapper } from '@automapper/core'; import { AutomapperProfile, InjectMapper } from '@automapper/nestjs'; import { Injectable } from '@nestjs/common'; import { Ad } from '../domain/entities/ad'; import { AdPresenter } from '../adapters/primaries/ad.presenter'; import { CreateAdRequest } from '../domain/dtos/create-ad.request'; import { Coordinates } from '../../geography/domain/entities/coordinates'; import { TimeConverter } from '../domain/entities/time-converter'; @Injectable() export class AdProfile extends AutomapperProfile { constructor(@InjectMapper() mapper: Mapper) { super(mapper); } override get profile() { return (mapper: any) => { createMap(mapper, Ad, AdPresenter); createMap( mapper, CreateAdRequest, CreateAdRequest, forMember( (dest) => dest.waypoints, mapFrom((source) => source.waypoints.map( (waypoint) => new Coordinates( waypoint.lon ?? undefined, waypoint.lat ?? undefined, ), ), ), ), ); createMap( mapper, CreateAdRequest, Ad, forMember( (dest) => dest.fromDate, mapFrom((source) => new Date(source.fromDate)), ), forMember( (dest) => dest.toDate, mapFrom((source) => new Date(source.toDate)), ), forMember( (dest) => dest.createdAt, mapFrom((source) => new Date(source.createdAt)), ), forMember( (dest) => dest.updatedAt, mapFrom((source) => new Date(source.updatedAt)), ), forMember( (dest) => dest.monTime, mapFrom((source) => TimeConverter.toUtcDatetime( source.fromDate, source.monTime, source.timezone, ), ), ), forMember( (dest) => dest.tueTime, mapFrom((source) => TimeConverter.toUtcDatetime( source.fromDate, source.tueTime, source.timezone, ), ), ), forMember( (dest) => dest.wedTime, mapFrom((source) => TimeConverter.toUtcDatetime( source.fromDate, source.wedTime, source.timezone, ), ), ), forMember( (dest) => dest.thuTime, mapFrom((source) => TimeConverter.toUtcDatetime( source.fromDate, source.thuTime, source.timezone, ), ), ), forMember( (dest) => dest.friTime, mapFrom((source) => TimeConverter.toUtcDatetime( source.fromDate, source.friTime, source.timezone, ), ), ), forMember( (dest) => dest.satTime, mapFrom((source) => TimeConverter.toUtcDatetime( source.fromDate, source.satTime, source.timezone, ), ), ), forMember( (dest) => dest.sunTime, mapFrom((source) => TimeConverter.toUtcDatetime( source.fromDate, source.sunTime, source.timezone, ), ), ), ); }; } }