techgarage-ir.MTWireGuard/Application/Mapper/PeerMapping.cs

82 lines
3.7 KiB
C#
Raw Normal View History

2023-03-03 23:24:18 +03:30
using AutoMapper;
2023-06-02 15:26:29 +03:30
using Microsoft.Extensions.DependencyInjection;
using MikrotikAPI.Models;
using MTWireGuard.Application.Models.Mikrotik;
2023-03-03 23:24:18 +03:30
2023-06-02 15:26:29 +03:30
namespace MTWireGuard.Application.Mapper
2023-03-03 23:24:18 +03:30
{
public class PeerMapping : Profile
{
2023-06-02 15:26:29 +03:30
private readonly IServiceProvider _provider;
private IServiceProvider Provider => _provider.CreateScope().ServiceProvider;
2023-03-03 23:24:18 +03:30
2023-06-02 15:26:29 +03:30
public PeerMapping(IServiceProvider provider)
{
_provider = provider;
2023-03-03 23:24:18 +03:30
/*
* Mikrotik Peer to ViewModel
*/
CreateMap<WGPeer, WGPeerViewModel>()
.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)));
// WGPeer
CreateMap<UserCreateModel, WGPeerCreateModel>();
CreateMap<WGPeerCreateModel, WGPeerDBModel>();
CreateMap<UserUpdateModel, WGPeerUpdateModel>()
.ForMember(dest => dest.Id,
opt => opt.MapFrom(src => $"*{src.Id:X}"));
// DBUser
CreateMap<WGPeerViewModel, WGPeerDBModel>();
CreateMap<UserSyncModel, WGPeerDBModel>();
CreateMap<UserSyncModel, WGPeerUpdateModel>()
.ForMember(dest => dest.Id,
opt => opt.MapFrom(src => $"*{src.Id:X}"));
CreateMap<UserUpdateModel, WGPeerDBModel>();
}
private string? GetPeerName(WGPeer source)
{
2023-06-02 15:26:29 +03:30
var db = Provider.GetService<DBContext>();
2023-03-03 23:24:18 +03:30
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)
{
2023-06-02 15:26:29 +03:30
var db = Provider.GetService<DBContext>();
2023-03-03 23:24:18 +03:30
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 bool HasDifferences(WGPeer source)
{
2023-06-02 15:26:29 +03:30
var db = Provider.GetService<DBContext>();
2023-03-03 23:24:18 +03:30
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);
}
}
}