using AutoMapper; using Microsoft.Extensions.DependencyInjection; using MikrotikAPI.Models; using MTWireGuard.Application.Models.Mikrotik; namespace MTWireGuard.Application.Mapper { public class PeerMapping : Profile { private readonly IServiceProvider _provider; private IServiceProvider Provider => _provider.CreateScope().ServiceProvider; public PeerMapping(IServiceProvider provider) { _provider = provider; /* * Mikrotik Peer to ViewModel */ CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => Convert.ToInt32(src.Id.Substring(1), 16))) .ForMember(dest => dest.Name, opt => opt.MapFrom(src => GetPeerName(src))) .ForMember(dest => dest.PrivateKey, opt => opt.MapFrom(src => GetPeerPrivateKey(src))) .ForMember(dest => dest.Address, opt => opt.MapFrom(src => src.AllowedAddress)) .ForMember(dest => dest.CurrentAddress, opt => opt.MapFrom(src => $"{src.CurrentEndpointAddress}:{src.CurrentEndpointPort}")) .ForMember(dest => dest.IsEnabled, opt => opt.MapFrom(src => !src.Disabled)) .ForMember(dest => dest.IsDifferent, opt => opt.MapFrom(src => HasDifferences(src))) .ForMember(dest => dest.Upload, opt => opt.MapFrom(src => Helper.ConvertByteSize(Convert.ToInt64(src.TX), 2))) .ForMember(dest => dest.Download, opt => opt.MapFrom(src => Helper.ConvertByteSize(Convert.ToInt64(src.RX), 2))) .ForMember(dest => dest.UploadBytes, opt => opt.MapFrom(src => Convert.ToInt64(src.TX))) .ForMember(dest => dest.DownloadBytes, opt => opt.MapFrom(src => Convert.ToInt64(src.RX))) .ForMember(dest => dest.Expire, opt => opt.MapFrom(src => ExpireDateToString(src))); // WGPeer CreateMap(); CreateMap(); CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => $"*{src.Id:X}")); // DBUser CreateMap() .ForMember(dest => dest.Expire, opt => opt.MapFrom(src => ExpireStringToDate(src.Expire))); CreateMap(); CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => $"*{src.Id:X}")); CreateMap(); } private string? GetPeerName(WGPeer source) { var db = Provider.GetService(); return (db.Users.ToList().Find(u => u.Id == Convert.ToInt32(source.Id[1..], 16)) != null) ? db.Users.ToList().Find(u => u.Id == Convert.ToInt32(source.Id[1..], 16)).Name : ""; } private string? GetPeerPrivateKey(WGPeer source) { var db = Provider.GetService(); return (db.Users.ToList().Find(u => u.Id == Convert.ToInt32(source.Id[1..], 16)) != null) ? db.Users.ToList().Find(u => u.Id == Convert.ToInt32(source.Id[1..], 16)).PrivateKey : ""; } private DateTime GetPeerExpire(WGPeer source) { var db = Provider.GetService(); return (db.Users.ToList().Find(u => u.Id == Convert.ToInt32(source.Id[1..], 16)) != null) ? db.Users.ToList().Find(u => u.Id == Convert.ToInt32(source.Id[1..], 16)).Expire ?? new() : new(); } private string ExpireDateToString(WGPeer source) { var expireDate = GetPeerExpire(source); return expireDate != new DateTime() ? expireDate.ToString() : "Unlimited"; } private DateTime ExpireStringToDate(string expire) { return expire == "Unlimited" ? new() : Convert.ToDateTime(expire); } private bool HasDifferences(WGPeer source) { var db = Provider.GetService(); var id = Convert.ToInt32(source.Id[1..], 16); var dbUser = db.Users.ToList().Find(x => x.Id == id); if (dbUser is null) return true; if (dbUser.PublicKey != source.PublicKey) return true; return string.IsNullOrWhiteSpace(dbUser.PrivateKey); } } }