From c36204dbb9eb9d2af33df0f18c35dbd7d537eb75 Mon Sep 17 00:00:00 2001 From: Tech Garage Date: Thu, 25 Jan 2024 20:36:44 +0330 Subject: [PATCH] Update Models --- Application/Models/DataUsage.cs | 21 ++++++++++++ Application/Models/LastKnownTraffic.cs | 22 +++++++++++++ Application/Models/Mikrotik/DNS.cs | 13 ++++++++ Application/Models/Mikrotik/IPAddress.cs | 20 +++++++++++ Application/Models/Mikrotik/IPPool.cs | 32 ++++++++++++++++++ Application/Models/Mikrotik/Identity.cs | 7 +++- Application/Models/Mikrotik/Scheduler.cs | 33 +++++++++++++++++++ Application/Models/Mikrotik/Script.cs | 30 +++++++++++++++++ Application/Models/Mikrotik/WGPeer.cs | 22 ++++++++++++- Application/Models/Mikrotik/WGServer.cs | 30 +++++++++++++++-- .../Models/Requests/ChangeStateRequest.cs | 14 ++++++++ .../Models/Requests/CreateClientRequest.cs | 22 +++++++++++++ .../Models/Requests/CreatePoolRequest.cs | 15 +++++++++ .../Models/Requests/CreateScriptRequest.cs | 10 ++++++ .../Models/Requests/CreateServerRequest.cs | 25 ++++++++++++++ Application/Models/Requests/DeleteRequest.cs | 7 ++++ Application/Models/Requests/LoginRequest.cs | 14 ++++++++ .../Models/Requests/SyncUserRequest.cs | 23 +++++++++++++ .../Models/Requests/UpdateClientRequest.cs | 27 +++++++++++++++ .../Models/Requests/UpdateDNSRequest.cs | 13 ++++++++ .../Models/Requests/UpdateIPPoolRequest.cs | 16 +++++++++ .../Models/Requests/UpdateIdentityRequest.cs | 13 ++++++++ .../Models/Requests/UpdateServerRequest.cs | 25 ++++++++++++++ Application/Models/Responses/ToastMessage.cs | 9 +++++ Application/Models/Responses/ToastResult.cs | 22 +++++++++++++ Application/Models/UsageObject.cs | 15 +++++++++ Application/Models/UserActivityUpdate.cs | 14 ++++++++ 27 files changed, 509 insertions(+), 5 deletions(-) create mode 100644 Application/Models/DataUsage.cs create mode 100644 Application/Models/LastKnownTraffic.cs create mode 100644 Application/Models/Mikrotik/DNS.cs create mode 100644 Application/Models/Mikrotik/IPAddress.cs create mode 100644 Application/Models/Mikrotik/IPPool.cs create mode 100644 Application/Models/Mikrotik/Scheduler.cs create mode 100644 Application/Models/Mikrotik/Script.cs create mode 100644 Application/Models/Requests/ChangeStateRequest.cs create mode 100644 Application/Models/Requests/CreateClientRequest.cs create mode 100644 Application/Models/Requests/CreatePoolRequest.cs create mode 100644 Application/Models/Requests/CreateScriptRequest.cs create mode 100644 Application/Models/Requests/CreateServerRequest.cs create mode 100644 Application/Models/Requests/DeleteRequest.cs create mode 100644 Application/Models/Requests/LoginRequest.cs create mode 100644 Application/Models/Requests/SyncUserRequest.cs create mode 100644 Application/Models/Requests/UpdateClientRequest.cs create mode 100644 Application/Models/Requests/UpdateDNSRequest.cs create mode 100644 Application/Models/Requests/UpdateIPPoolRequest.cs create mode 100644 Application/Models/Requests/UpdateIdentityRequest.cs create mode 100644 Application/Models/Requests/UpdateServerRequest.cs create mode 100644 Application/Models/Responses/ToastMessage.cs create mode 100644 Application/Models/Responses/ToastResult.cs create mode 100644 Application/Models/UsageObject.cs create mode 100644 Application/Models/UserActivityUpdate.cs diff --git a/Application/Models/DataUsage.cs b/Application/Models/DataUsage.cs new file mode 100644 index 0000000..90ce7a5 --- /dev/null +++ b/Application/Models/DataUsage.cs @@ -0,0 +1,21 @@ +using SQLite; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models +{ + public class DataUsage + { + [PrimaryKey, AutoIncrement] + public int Id { get; set; } + public int UserID { get; set; } + public int RX { get; set; } + public int TX { get; set; } + public bool UserReset { get; set; } + public string? ResetNotes { get; set; } + public DateTime CreationTime { get; set; } + } +} diff --git a/Application/Models/LastKnownTraffic.cs b/Application/Models/LastKnownTraffic.cs new file mode 100644 index 0000000..59368f4 --- /dev/null +++ b/Application/Models/LastKnownTraffic.cs @@ -0,0 +1,22 @@ +using SQLite; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models +{ + public class LastKnownTraffic + { + [Key] + public int UserID { get; set; } + [DefaultValue(0)] + public int RX { get; set; } + [DefaultValue(0)] + public int TX { get; set; } + public DateTime CreationTime { get; set; } + } +} diff --git a/Application/Models/Mikrotik/DNS.cs b/Application/Models/Mikrotik/DNS.cs new file mode 100644 index 0000000..a997b0f --- /dev/null +++ b/Application/Models/Mikrotik/DNS.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models.Mikrotik +{ + public class DNSUpdateModel + { + public List Servers { get; set; } + } +} diff --git a/Application/Models/Mikrotik/IPAddress.cs b/Application/Models/Mikrotik/IPAddress.cs new file mode 100644 index 0000000..2fd4d84 --- /dev/null +++ b/Application/Models/Mikrotik/IPAddress.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models.Mikrotik +{ + public class IPAddressViewModel + { + public int Id { get; set; } + public string ActualInterface { get; set; } + public string Address { get; set; } + public bool Enabled { get; set; } + public bool Dynamic { get; set; } + public string Interface { get; set; } + public bool Valid { get; set; } + public string Network { get; set; } + } +} diff --git a/Application/Models/Mikrotik/IPPool.cs b/Application/Models/Mikrotik/IPPool.cs new file mode 100644 index 0000000..9ac74fd --- /dev/null +++ b/Application/Models/Mikrotik/IPPool.cs @@ -0,0 +1,32 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models.Mikrotik +{ + public class IPPoolViewModel + { + public int Id { get; set; } + public string Name { get; set; } + public List Ranges { get; set; } + public string NextPool { get; set; } + } + + public class PoolCreateModel + { + public string Name { get; set; } + public string? Next { get; set; } + public string Ranges { get; set; } + } + + public class PoolUpdateModel + { + public string Id { get; set; } + public string Name { get; set; } + public string? Next { get; set; } + public string Ranges { get; set; } + } +} diff --git a/Application/Models/Mikrotik/Identity.cs b/Application/Models/Mikrotik/Identity.cs index 1a9f31b..8814536 100644 --- a/Application/Models/Mikrotik/Identity.cs +++ b/Application/Models/Mikrotik/Identity.cs @@ -1,6 +1,11 @@ namespace MTWireGuard.Application.Models.Mikrotik { - public class MTIdentityViewModel + public class IdentityViewModel + { + public string Name { get; set; } + } + + public class IdentityUpdateModel { public string Name { get; set; } } diff --git a/Application/Models/Mikrotik/Scheduler.cs b/Application/Models/Mikrotik/Scheduler.cs new file mode 100644 index 0000000..e0e18ac --- /dev/null +++ b/Application/Models/Mikrotik/Scheduler.cs @@ -0,0 +1,33 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models.Mikrotik +{ + public class SchedulerViewModel + { + public int Id { get; set; } + public string Name { get; set; } + public string Owner { get; set; } + public DateOnly StartDate { get; set; } + public TimeSpan StartTime { get; set; } + public TimeSpan Interval { get; set; } + public List Policies { get; set; } + public int RunCount { get; set; } + public DateTime NextRun { get; set; } + public string OnEvent { get; set; } + public bool Enabled { get; set; } + } + public class SchedulerCreateModel + { + public string Name { get; set; } + public DateOnly? StartDate { get; set; } + public TimeSpan? StartTime { get; set; } + public TimeSpan? Interval { get; set; } + public List? Policies { get; set; } + public string? OnEvent { get; set; } + } +} diff --git a/Application/Models/Mikrotik/Script.cs b/Application/Models/Mikrotik/Script.cs new file mode 100644 index 0000000..a6b7031 --- /dev/null +++ b/Application/Models/Mikrotik/Script.cs @@ -0,0 +1,30 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models.Mikrotik +{ + public class ScriptViewModel + { + public int Id { get; set; } + public string Name { get; set; } + public string Owner { get; set; } + public string Source { get; set; } + public DateTime LastStarted { get; set; } + public int RunCount { get; set; } + public List Policies { get; set; } + public bool IsValid { get; set; } + public bool DontRequiredPermissions { get; set; } + } + + public class ScriptCreateModel + { + public string Name { get; set; } + public List Policies { get; set; } + public string Source { get; set; } + public bool DontRequiredPermissions { get; set; } + } +} diff --git a/Application/Models/Mikrotik/WGPeer.cs b/Application/Models/Mikrotik/WGPeer.cs index 9ace923..ad1ff86 100644 --- a/Application/Models/Mikrotik/WGPeer.cs +++ b/Application/Models/Mikrotik/WGPeer.cs @@ -13,6 +13,12 @@ namespace MTWireGuard.Application.Models.Mikrotik public string PublicKey { get; set; } public DateTime? Expire { get; set; } public int? ExpireID { get; set; } + public int RX { get; set; } + public int TX { get; set; } + public int TrafficLimit { get; set; } + public string? DNSAddress { get; set; } + public bool InheritDNS { get; set; } + public bool InheritIP { get; set; } } public class WGPeerViewModel @@ -31,6 +37,12 @@ namespace MTWireGuard.Application.Models.Mikrotik public long UploadBytes { get; set; } public bool IsDifferent { get; set; } public string Expire { get; set; } + public int Traffic { get; set; } + public uint TrafficUsed { get; set; } + public string LastHandshake { get; set; } + public string DNSAddress { get; set; } + public bool InheritDNS { get; set; } + public bool InheritIP { get; set; } } public class UserCreateModel @@ -45,7 +57,11 @@ namespace MTWireGuard.Application.Models.Mikrotik public string PublicKey { get; set; } public string PresharedKey { get; set; } public string PersistentKeepalive { get; set; } - public DateTime Expire { get; set; } + public DateTime? Expire { get; set; } = null; + public int Traffic { get; set; } + public string DNSAddress { get; set; } + public bool InheritDNS { get; set; } + public bool InheritIP { get; set; } } public class UserSyncModel @@ -69,5 +85,9 @@ namespace MTWireGuard.Application.Models.Mikrotik public string PresharedKey { get; set; } public int PersistentKeepalive { get; set; } public DateTime Expire { get; set; } + public int Traffic { get; set; } + public string DNSAddress { get; set; } + public bool InheritDNS { get; set; } + public bool InheritIP { get; set; } } } diff --git a/Application/Models/Mikrotik/WGServer.cs b/Application/Models/Mikrotik/WGServer.cs index 58f23a7..fc655fe 100644 --- a/Application/Models/Mikrotik/WGServer.cs +++ b/Application/Models/Mikrotik/WGServer.cs @@ -1,5 +1,14 @@ namespace MTWireGuard.Application.Models.Mikrotik { + public class WGServerDBModel + { + public int Id { get; set; } + public string? DNSAddress { get; set; } + public bool InheritDNS { get; set; } + public bool UseIPPool { get; set; } + public int? IPPoolId { get; set; } + } + public class WGServerViewModel { public int Id { get; set; } @@ -10,6 +19,11 @@ public string PrivateKey { get; set; } public string PublicKey { get; set; } public bool Running { get; set; } + public string IPAddress { get; set; } + public string DNSAddress { get; set; } + public bool InheritDNS { get; set; } + public bool UseIPPool { get; set; } + public string IPPool { get; set; } } public class ServerCreateModel @@ -19,14 +33,24 @@ public string ListenPort { get; set; } public string MTU { get; set; } public string PrivateKey { get; set; } + public string IPAddress { get; set; } + public bool UseIPPool { get; set; } + public int IPPoolId { get; set; } + public bool InheritDNS { get; set; } + public string DNSAddress { get; set; } } public class ServerUpdateModel { public int Id { get; set; } public string Name { get; set; } - public ushort ListenPort { get; set; } - public ushort MTU { get; set; } - public string PrivateKey { get; set; } + public ushort? ListenPort { get; set; } + public ushort? MTU { get; set; } + public string? PrivateKey { get; set; } + public string? IPAddress { get; set; } + public bool UseIPPool { get; set; } + public int? IPPoolId { get; set; } + public bool InheritDNS { get; set; } + public string? DNSAddress { get; set; } } } diff --git a/Application/Models/Requests/ChangeStateRequest.cs b/Application/Models/Requests/ChangeStateRequest.cs new file mode 100644 index 0000000..b777051 --- /dev/null +++ b/Application/Models/Requests/ChangeStateRequest.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; + +namespace MTWireGuard.Application.Models.Requests +{ + public class ChangeStateRequest + { + [FromRoute(Name = "id"), Required] + public int Id { get; set; } + + [FromBody, Required] + public bool Enabled { get; set; } + } +} diff --git a/Application/Models/Requests/CreateClientRequest.cs b/Application/Models/Requests/CreateClientRequest.cs new file mode 100644 index 0000000..3c9394e --- /dev/null +++ b/Application/Models/Requests/CreateClientRequest.cs @@ -0,0 +1,22 @@ +namespace MTWireGuard.Application.Models.Requests +{ + public class CreateClientRequest + { + public string Name { get; set; } + public string? Endpoint { get; set; } + public ushort? EndpointPort { get; set; } + public string? AllowedAddress { get; set; } + public string? PresharedKey { get; set; } + public string PrivateKey { get; set; } + public string PublicKey { get; set; } + public string Interface { get; set; } + public int? KeepAlive { get; set; } + public bool Enabled { get; set; } + public string? Expire { get; set; } + public string? Password { get; set; } + public int? Traffic { get; set; } + public bool InheritIP { get; set; } + public bool InheritDNS { get; set; } + public string? DNSAddress { get; set; } + } +} diff --git a/Application/Models/Requests/CreatePoolRequest.cs b/Application/Models/Requests/CreatePoolRequest.cs new file mode 100644 index 0000000..4519bfb --- /dev/null +++ b/Application/Models/Requests/CreatePoolRequest.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models.Requests +{ + public class CreatePoolRequest + { + public string Name { get; set; } + public string? Next { get; set; } + public List Ranges { get; set; } + } +} diff --git a/Application/Models/Requests/CreateScriptRequest.cs b/Application/Models/Requests/CreateScriptRequest.cs new file mode 100644 index 0000000..f403159 --- /dev/null +++ b/Application/Models/Requests/CreateScriptRequest.cs @@ -0,0 +1,10 @@ +namespace MTWireGuard.Application.Models.Requests +{ + public class CreateScriptRequest + { + public string Name { get; set; } + public List Policy { get; set; } + public string Source { get; set; } + public bool DontRequiredPermissions { get; set; } + } +} diff --git a/Application/Models/Requests/CreateServerRequest.cs b/Application/Models/Requests/CreateServerRequest.cs new file mode 100644 index 0000000..65df32e --- /dev/null +++ b/Application/Models/Requests/CreateServerRequest.cs @@ -0,0 +1,25 @@ +namespace MTWireGuard.Application.Models.Requests +{ + public class CreateServerRequest + { + public string Name { get; set; } + + public ushort Port { get; set; } = 13231; + + public ushort MTU { get; set; } = 1420; + + public string PrivateKey { get; set; } + + public bool Enabled { get; set; } + + public string IPAddress { get; set; } + + public bool UseIPPool { get; set; } + + public int IPPoolId { get; set; } + + public bool InheritDNS { get; set; } + + public string DNSAddress { get; set; } + } +} diff --git a/Application/Models/Requests/DeleteRequest.cs b/Application/Models/Requests/DeleteRequest.cs new file mode 100644 index 0000000..55b1969 --- /dev/null +++ b/Application/Models/Requests/DeleteRequest.cs @@ -0,0 +1,7 @@ +namespace MTWireGuard.Application.Models.Requests +{ + public class DeleteRequest + { + public int Id { get; set; } + } +} diff --git a/Application/Models/Requests/LoginRequest.cs b/Application/Models/Requests/LoginRequest.cs new file mode 100644 index 0000000..479cc0e --- /dev/null +++ b/Application/Models/Requests/LoginRequest.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models.Requests +{ + public class LoginRequest + { + public string Username { get; set; } + public string Password { get; set; } + } +} diff --git a/Application/Models/Requests/SyncUserRequest.cs b/Application/Models/Requests/SyncUserRequest.cs new file mode 100644 index 0000000..4bc10b4 --- /dev/null +++ b/Application/Models/Requests/SyncUserRequest.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; + +namespace MTWireGuard.Application.Models.Requests +{ + public class SyncUserRequest + { + [FromRoute(Name = "id"), Required] + public int ID { get; set; } + + [Required(ErrorMessage = "Username is required.")] + public string Name { get; set; } + + [Required(ErrorMessage = "Password is required.")] + public string Password { get; set; } + + [Required(ErrorMessage = "PrivateKey is required.")] + public string PrivateKey { get; set; } + + [Required(ErrorMessage = "PublicKey is required.")] + public string PublicKey { get; set; } + } +} diff --git a/Application/Models/Requests/UpdateClientRequest.cs b/Application/Models/Requests/UpdateClientRequest.cs new file mode 100644 index 0000000..63241cb --- /dev/null +++ b/Application/Models/Requests/UpdateClientRequest.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; +using System.Xml.Linq; + +namespace MTWireGuard.Application.Models.Requests +{ + public class UpdateClientRequest + { + [FromRoute(Name = "id"), Required] + public int ID { get; set; } + public string? Name { get; set; } + public string? Endpoint { get; set; } + public ushort? EndpointPort { get; set; } + public string? AllowedAddress { get; set; } + public string? PresharedKey { get; set; } + public string? PrivateKey { get; set; } + public string? PublicKey { get; set; } + public string Interface { get; set; } + public int? KeepAlive { get; set; } + public string? Expire { get; set; } + public string? Password { get; set; } + public int? Traffic { get; set; } + public bool InheritIP { get; set; } + public bool InheritDNS { get; set; } + public string? DNSAddress { get; set; } + } +} diff --git a/Application/Models/Requests/UpdateDNSRequest.cs b/Application/Models/Requests/UpdateDNSRequest.cs new file mode 100644 index 0000000..f2737c1 --- /dev/null +++ b/Application/Models/Requests/UpdateDNSRequest.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models.Requests +{ + public class UpdateDNSRequest + { + public List Servers { get; set; } + } +} diff --git a/Application/Models/Requests/UpdateIPPoolRequest.cs b/Application/Models/Requests/UpdateIPPoolRequest.cs new file mode 100644 index 0000000..e6a27ad --- /dev/null +++ b/Application/Models/Requests/UpdateIPPoolRequest.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models.Requests +{ + public class UpdateIPPoolRequest + { + public int Id { get; set; } + public string Name { get; set; } + public string? Next { get; set; } + public List Ranges { get; set; } + } +} diff --git a/Application/Models/Requests/UpdateIdentityRequest.cs b/Application/Models/Requests/UpdateIdentityRequest.cs new file mode 100644 index 0000000..1dee20d --- /dev/null +++ b/Application/Models/Requests/UpdateIdentityRequest.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models.Requests +{ + public class UpdateIdentityRequest + { + public string Name { get; set; } + } +} diff --git a/Application/Models/Requests/UpdateServerRequest.cs b/Application/Models/Requests/UpdateServerRequest.cs new file mode 100644 index 0000000..64c6180 --- /dev/null +++ b/Application/Models/Requests/UpdateServerRequest.cs @@ -0,0 +1,25 @@ +namespace MTWireGuard.Application.Models.Requests +{ + public class UpdateServerRequest + { + public int Id { get; set; } + + public string Name { get; set; } + + public ushort? Port { get; set; } + + public ushort? MTU { get; set; } + + public string? PrivateKey { get; set; } + + public string? IPAddress { get; set; } + + public bool UseIPPool { get; set; } + + public int? IPPoolId { get; set; } + + public bool InheritDNS { get; set; } + + public string? DNSAddress { get; set; } + } +} diff --git a/Application/Models/Responses/ToastMessage.cs b/Application/Models/Responses/ToastMessage.cs new file mode 100644 index 0000000..2104611 --- /dev/null +++ b/Application/Models/Responses/ToastMessage.cs @@ -0,0 +1,9 @@ +namespace MTWireGuard.Application.Models.Models.Responses +{ + public class ToastMessage + { + public string Title { get; set; } + public string Body { get; set; } + public string Background { get; set; } + } +} diff --git a/Application/Models/Responses/ToastResult.cs b/Application/Models/Responses/ToastResult.cs new file mode 100644 index 0000000..c3e5d03 --- /dev/null +++ b/Application/Models/Responses/ToastResult.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; + +namespace MTWireGuard.Application.Models.Models.Responses +{ + public class ToastResult : IActionResult + { + private readonly ToastMessage _result; + + public ToastResult(ToastMessage message) + { + _result = message; + } + + public async Task ExecuteResultAsync(ActionContext context) + { + var objectResult = new ObjectResult(_result); + + await objectResult.ExecuteResultAsync(context); + } + } +} diff --git a/Application/Models/UsageObject.cs b/Application/Models/UsageObject.cs new file mode 100644 index 0000000..bb56c96 --- /dev/null +++ b/Application/Models/UsageObject.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models +{ + public class UsageObject + { + public string Id { get; set; } + public int RX { get; set; } + public int TX { get; set; } + } +} diff --git a/Application/Models/UserActivityUpdate.cs b/Application/Models/UserActivityUpdate.cs new file mode 100644 index 0000000..ea13df8 --- /dev/null +++ b/Application/Models/UserActivityUpdate.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MTWireGuard.Application.Models +{ + public class UserActivityUpdate + { + public int Id { get; set; } + public string LastHandshake { get; set; } + } +}