in Backend/src/Trackable.Repositories/AutoMapper/ModelMappingProfile.cs [19:186]
public ModelMappingProfile()
{
// Configuration Mappings
CreateMap<ConfigurationData, Configuration>()
.ConvertUsing(dest => new Configuration(dest.Key1, dest.Key2, dest.Description, dest.Value));
CreateMap<Configuration, ConfigurationData>()
.ForMember(dest => dest.Key1, opt => opt.MapFrom(src => src.Namespace))
.ForMember(dest => dest.Key2, opt => opt.MapFrom(src => src.Key))
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.SerializedValue))
.ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Description));
// Role Mappings
CreateMap<RoleData, Role>();
CreateMap<Role, RoleData>();
// TrackingDevice Mappings
CreateMap<TrackingDeviceData, TrackingDevice>()
.ForMember(dest => dest.AssetId, opt => opt.MapFrom(src => (src.Asset != null && !src.Asset.Deleted) ? src.Asset.Id : null))
.ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.Tags.Select(t => t.TagName)))
.ForMember(dest => dest.Asset, opt => opt.MapFrom(src => (src.Asset != null && !src.Asset.Deleted) ? src.Asset : null))
.ForPath(dest => dest.Asset.TrackingDevice, opt => opt.Ignore())
.AfterMap((src, dst) =>
{
// Avoid circular serialization
if (dst.Asset != null)
{
dst.Asset.TrackingDevice = null;
}
});
CreateMap<TrackingDevice, TrackingDeviceData>()
.ForMember(dest => dest.Asset, opt => opt.ResolveUsing<TrackingDeviceAssetResolver>())
.ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.Tags.Select(t => new TagData { TagName = t })));
// Location Mappings
CreateMap<LocationData, Location>()
.ForMember(dest => dest.Latitude, opt => opt.MapFrom(src => src.Location.Latitude.Value))
.ForMember(dest => dest.Longitude, opt => opt.MapFrom(src => src.Location.Longitude.Value))
.ForMember(dest => dest.InterestLevel, opt =>
{
opt.MapFrom(src => (InterestLevel)(src.InterestLevel ?? 0));
})
.ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.Tags.Select(t => t.TagName)));
CreateMap<Location, LocationData>()
.ForMember(dest => dest.InterestLevel, opt => opt.MapFrom(src => (int)src.InterestLevel))
.ForMember(dest => dest.Location, opt => opt.MapFrom(src => GeographyHelper.CreateDbPoint(src)))
.ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.Tags.Select(t => new TagData { TagName = t })));
// GeoFence Mappings
CreateMap<GeoFenceData, GeoFence>()
.ForMember(dest => dest.FenceType, opt => opt.MapFrom(src => (FenceType)src.FenceType))
.ForMember(dest => dest.Cooldown, opt => opt.MapFrom(src => src.CooldownInMinutes))
.ForMember(dest => dest.EmailsToNotify, opt => opt.MapFrom(src => src.Emails.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)))
.ForMember(dest => dest.WebhooksToNotify, opt => opt.MapFrom(src => src.Webhooks.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)))
.ForMember(dest => dest.AssetIds, opt => opt.MapFrom(src => src.AssetDatas.Select(a => a.Id)))
.ForMember(dest => dest.GeoFenceArea, opt => opt.MapFrom(src =>
(src.AreaType == (int)GeoFenceAreaType.Polygon) ?
(IGeoFenceArea)new PolygonGeoFenceArea
{
FencePolygon = GeographyHelper.FromDbPolygon(src.Polygon)
} : (src.AreaType == (int)GeoFenceAreaType.Circular) ?
(IGeoFenceArea)new CircularGeoFenceArea
{
Center = new Point(src.Polygon.Latitude.Value, src.Polygon.Longitude.Value),
RadiusInMeters = src.Radius.Value
} : null))
.ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.Tags.Select(t => t.TagName)));
CreateMap<GeoFence, GeoFenceData>()
.ForMember(dest => dest.AssetDatas, opt => opt.ResolveUsing<GeoFenceAssetResolver>())
.ForMember(dest => dest.FenceType, opt => opt.MapFrom(src => (int)src.FenceType))
.ForMember(dest => dest.CooldownInMinutes, opt => opt.MapFrom(src => src.Cooldown))
.ForMember(dest => dest.Emails, opt => opt.MapFrom(src => src.EmailsToNotify == null ? string.Empty : string.Join(",", src.EmailsToNotify)))
.ForMember(dest => dest.Webhooks, opt => opt.MapFrom(src => src.WebhooksToNotify == null ? string.Empty : string.Join(",", src.WebhooksToNotify)))
.ForMember(dest => dest.Polygon, opt => opt.MapFrom(src => src.GeoFenceArea.AreaType == GeoFenceAreaType.Polygon ? GeographyHelper.CreateDbPolygon(((PolygonGeoFenceArea)src.GeoFenceArea).FencePolygon) : GeographyHelper.CreateDbPoint(((CircularGeoFenceArea)src.GeoFenceArea).Center)))
.ForMember(dest => dest.Radius, opt => opt.MapFrom(src => src.GeoFenceArea.AreaType == GeoFenceAreaType.Circular ? (long?)((CircularGeoFenceArea)src.GeoFenceArea).RadiusInMeters : null))
.ForMember(dest => dest.AreaType, opt => opt.MapFrom(src => src.GeoFenceArea.AreaType))
.ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.Tags.Select(t => new TagData
{
TagName = t
})));
// GeoFence update Mappings
CreateMap<GeoFenceUpdateData, GeoFenceUpdate>()
.ForMember(dest => dest.NotificationStatus, opt => opt.MapFrom(src => (NotificationStatus)src.Status))
.ForMember(dest => dest.GeoFenceId, opt => opt.MapFrom(src => src.GeoFenceDataId))
.ForMember(dest => dest.AssetId, opt => opt.MapFrom(src => src.AssetDataId))
.ForMember(dest => dest.UpdatedAt, opt => opt.MapFrom(src => src.CreatedAtTimeUtc));
CreateMap<GeoFenceUpdate, GeoFenceUpdateData>()
.ForMember(dest => dest.Status, opt => opt.MapFrom(src => (int)src.NotificationStatus))
.ForMember(dest => dest.GeoFenceDataId, opt => opt.MapFrom(src => src.GeoFenceId))
.ForMember(dest => dest.AssetDataId, opt => opt.MapFrom(src => src.AssetId));
// Tracking point Mappings
CreateMap<TrackingPointData, TrackingPoint>()
.ForMember(dest => dest.CreatedAtUtc, opt => opt.MapFrom(src => src.CreatedAtTimeUtc))
.ForMember(dest => dest.Latitude, opt => opt.MapFrom(src => src.Location.Latitude))
.ForMember(dest => dest.Longitude, opt => opt.MapFrom(src => src.Location.Longitude));
CreateMap<TrackingPoint, TrackingPointData>()
.ForMember(dest => dest.CreatedAtTimeUtc, opt => opt.MapFrom(src => src.CreatedAtUtc))
.ForMember(dest => dest.Location, opt => opt.MapFrom(src => GeographyHelper.CreateDbPoint(src)));
//AssetProperties Mappings
CreateMap<AssetPropertiesData, AssetProperties>();
CreateMap<AssetProperties, AssetPropertiesData>();
// Asset Mappings
CreateMap<AssetData, Asset>()
.ForMember(dest => dest.AssetType, opt => opt.MapFrom(src => (AssetType)src.AssetType))
.ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.Tags.Select(t => t.TagName)))
.ForMember(dest => dest.TrackingDeviceId,
opt => opt.MapFrom(src => (src.TrackingDevice != null && !src.TrackingDevice.Deleted) ? src.TrackingDevice.Id : null))
.ForMember(dest => dest.TrackingDevice, opt => opt.MapFrom(src => (src.TrackingDevice != null && !src.TrackingDevice.Deleted) ? src.TrackingDevice : null))
.AfterMap((src, dst) =>
{
// Avoid circular serialization
if (dst.TrackingDevice != null)
{
dst.TrackingDevice.Asset = null;
}
});
CreateMap<Asset, AssetData>()
.ForMember(dest => dest.TrackingDevice, opt => opt.ResolveUsing<AssetTrackingDeviceResolver>())
.ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.Tags.Select(t => new TagData
{
TagName = t
})))
.ForMember(dest => dest.AssetType, opt => opt.MapFrom(src => (int)src.AssetType));
// Trip leg mapping
CreateMap<TripLegData, TripLeg>()
.ForMember(dest => dest.TripId, opt => opt.MapFrom(src => src.TripDataId))
.ForMember(dest => dest.Route, opt => opt.MapFrom(src => GeographyHelper.FromDbLine(src.Route)));
CreateMap<TripLeg, TripLegData>()
.ForMember(dest => dest.Route, opt => opt.MapFrom(src => GeographyHelper.CreateDbLine(src.Route)));
// Trip mapping
CreateMap<TripData, Trip>()
.ForMember(dest => dest.TripLegs, opt => opt.MapFrom(src => src.TripLegDatas));
CreateMap<Trip, TripData>()
.ForMember(dest => dest.TripLegDatas, opt => opt.MapFrom(src => src.TripLegs));
// User Mapping
CreateMap<UserData, User>();
CreateMap<User, UserData>();
// Deployment Id Mapping
CreateMap<DeploymentIdData, DeploymentId>();
CreateMap<DeploymentId, DeploymentIdData>();
// Jwt Tokens
CreateMap<TokenData, JwtToken>()
.ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.User == null ? default(string) : src.User.Id))
.ForMember(dest => dest.TrackingDeviceId, opt => opt.MapFrom(src => src.TrackingDevice == null ? null : src.TrackingDevice.Id))
.ForMember(dest => dest.Claims, opt => opt.MapFrom(src => JsonConvert.DeserializeObject<Dictionary<string, string>>(src.Value).Select(d => new Claim(d.Key, d.Value))));
CreateMap<JwtToken, TokenData>()
.ForMember(dest => dest.User, opt => opt.ResolveUsing<TokenUserResolver>())
.ForMember(dest => dest.TrackingDevice, opt => opt.ResolveUsing<TokenTrackingDeviceResolver>())
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => JsonConvert.SerializeObject(src.Claims.ToDictionary(c => c.Type, c => c.Value))));
}