using System.Data; using Dapper; using SatelliteProvider.Common.Enums; namespace SatelliteProvider.DataAccess.TypeHandlers; // AZ-484: TileSource needs an explicit string mapping because the multi-word // member 'GoogleMaps' must round-trip as the snake_case wire value 'google_maps' // per the v1.0.0 tile-storage contract. The generic EnumStringTypeHandler // only does ToString().ToLowerInvariant(), which would emit 'googlemaps'. public class TileSourceTypeHandler : SqlMapper.TypeHandler { public const string GoogleMapsWireValue = "google_maps"; public const string UavWireValue = "uav"; public override TileSource Parse(object value) { if (value is null || value is DBNull) { throw new DataException("Cannot parse null DB value into enum TileSource"); } var s = value as string ?? value.ToString(); if (string.IsNullOrEmpty(s)) { throw new DataException("Cannot parse empty DB value into enum TileSource"); } return s.ToLowerInvariant() switch { GoogleMapsWireValue => TileSource.GoogleMaps, UavWireValue => TileSource.Uav, _ => throw new DataException($"DB value '{s}' is not a defined member of enum TileSource"), }; } public override void SetValue(IDbDataParameter parameter, TileSource value) { parameter.Value = ToWireValue(value); parameter.DbType = DbType.String; } public static string ToWireValue(TileSource value) => value switch { TileSource.GoogleMaps => GoogleMapsWireValue, TileSource.Uav => UavWireValue, _ => throw new ArgumentOutOfRangeException(nameof(value), value, "Unknown TileSource"), }; }