Skip to content

Commit

Permalink
Update handling expiration
Browse files Browse the repository at this point in the history
  • Loading branch information
techgarage-ir committed Feb 4, 2025
1 parent 8568445 commit 443b61a
Show file tree
Hide file tree
Showing 7 changed files with 186 additions and 29 deletions.
15 changes: 9 additions & 6 deletions Application/Mapper/PeerMapping.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using MikrotikAPI.Models;
Expand Down Expand Up @@ -121,21 +122,23 @@ private string GetPeerExpire(WGPeer source)
{
try
{
var dbuser = GetDBUser(source);
if (dbuser == null || dbuser.ExpireID == null || dbuser.ExpireID == 0) return string.Empty;
if (source == null)
{
return string.Empty;
}
var userId = ConverterUtil.ParseEntityID(source.Id);
_schedulerCache = _memoryCache.GetOrCreate(
"Schedulers",
cacheEntry =>
{
cacheEntry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(3);
var api = Provider.GetService<IMikrotikRepository>();
return api.GetSchedulers().Result.ToDictionary(s => s.Id);
return api.GetSchedulers().Result.Where(s => s.Name.StartsWith("DisableUser")).ToDictionary(s => int.Parse(s.Name[11..]));
});
if (_schedulerCache.TryGetValue((int)dbuser.ExpireID, out var expire))
if (_schedulerCache.TryGetValue(userId, out var expire))
return expire != null ? expire.StartDate.ToDateTime(expire.StartTime).ToString("yyyy/MM/dd HH:mm:ss") : string.Empty;
else
_logger.Error("Can't find expiration scheduler for user #{UserID}: {Username}", dbuser.Id, source.Name);
return string.Empty;
return string.Empty;
}
catch (Exception ex)
{
Expand Down
130 changes: 130 additions & 0 deletions Application/Migrations/20250201200133_RemoveExpireDBField.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions Application/Migrations/20250201200133_RemoveExpireDBField.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace MTWireGuard.Application.Migrations
{
/// <inheritdoc />
public partial class RemoveExpireDBField : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "ExpireID",
table: "Users");
}

/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "ExpireID",
table: "Users",
type: "INTEGER",
nullable: true);
}
}
}
5 changes: 1 addition & 4 deletions Application/Migrations/DBContextModelSnapshot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ partial class DBContextModelSnapshot : ModelSnapshot
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "8.0.6");
modelBuilder.HasAnnotation("ProductVersion", "8.0.10");

modelBuilder.Entity("MTWireGuard.Application.Models.DataUsage", b =>
{
Expand Down Expand Up @@ -76,9 +76,6 @@ protected override void BuildModel(ModelBuilder modelBuilder)
.IsRequired()
.HasColumnType("TEXT");

b.Property<int?>("ExpireID")
.HasColumnType("INTEGER");

b.Property<bool>("InheritDNS")
.HasColumnType("INTEGER");

Expand Down
1 change: 0 additions & 1 deletion Application/Models/Mikrotik/WGPeer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ namespace MTWireGuard.Application.Models.Mikrotik
public class WGPeerDBModel
{
public int Id { get; set; }
public int? ExpireID { get; set; }
public string AllowedIPs { get; set; }
public ulong RX { get; set; }
public ulong TX { get; set; }
Expand Down
30 changes: 12 additions & 18 deletions Application/Services/MTAPI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,19 +257,11 @@ public async Task<CreationResult> CreateUser(UserCreateModel peer)
Comment = $"Disable Wireguard Peer: {peer.Name}",
Interval = TimeSpan.Zero
}) : null;
var schedulerId = 0;
if (deleteScheduler == null || deleteScheduler.Code == "200")
{
if (deleteScheduler == null) goto skipGettingScheduler;
var schedulers = await GetSchedulers();
var scheduler = schedulers.Find(s => s.Name == $"DisableUser{userID}");
schedulerId = scheduler.Id;
skipGettingScheduler:
var expireID = deleteScheduler != null ? schedulerId : 0;
await dbContext.Users.AddAsync(new()
{
Id = userID,
ExpireID = expireID,
TrafficLimit = peer.Traffic,
AllowedIPs = peer.AllowedIPs ?? "0.0.0.0/0",
InheritDNS = inheritDNS,
Expand Down Expand Up @@ -348,8 +340,7 @@ public async Task<CreationResult> UpdateUser(UserUpdateModel user)
var mtUpdate = await wrapper.UpdateUser(mtPeer);
if (mtUpdate.Success)
{
var schedulers = await GetSchedulers();
var scheduler = schedulers.Find(s => s.Name == $"DisableUser{user.Id}");
var scheduler = await GetSchedulerByName($"DisableUser{user.Id}");
var exists = await dbContext.Users.FindAsync(user.Id);
dbContext.ChangeTracker.Clear();
var schedulerId = scheduler?.Id ?? 0;
Expand All @@ -375,8 +366,7 @@ await UpdateScheduler(new()
});
if (deleteScheduler.Code == "200")
{
schedulers = await GetSchedulers();
scheduler = schedulers.Find(s => s.Name == $"DisableUser{user.Id}");
scheduler = await GetSchedulerByName($"DisableUser{user.Id}");
schedulerId = scheduler.Id;
}
else
Expand All @@ -390,7 +380,6 @@ await UpdateScheduler(new()
dbContext.Users.Update(new()
{
Id = user.Id,
ExpireID = expireID,
InheritDNS = user.InheritDNS,
InheritIP = user.InheritIP,
TrafficLimit = user.Traffic,
Expand All @@ -403,7 +392,6 @@ await UpdateScheduler(new()
await dbContext.Users.AddAsync(new()
{
Id = user.Id,
ExpireID = expireID,
InheritDNS = user.InheritDNS,
InheritIP = user.InheritIP,
TrafficLimit = user.Traffic,
Expand Down Expand Up @@ -547,10 +535,10 @@ public async Task<CreationResult> DeleteUser(int id)
var user = await dbContext.Users.FindAsync(id);
if (user != null)
{
if (user.ExpireID != null)
{
await wrapper.DeleteScheduler(ConverterUtil.ParseEntityID((int)user.ExpireID));
}
var schedulers = await wrapper.GetSchedulers();
var scheduler = schedulers.Find(s => s.Name == $"DisableUser{id}");
if (scheduler != null)
await wrapper.DeleteScheduler(scheduler.Id);
dbContext.Users.Remove(user);
}
await dbContext.LastKnownTraffic.Where(t => t.UserID == id).ExecuteDeleteAsync();
Expand Down Expand Up @@ -590,6 +578,12 @@ public async Task<SchedulerViewModel> GetScheduler(int id)
return mapper.Map<SchedulerViewModel>(model);
}

public async Task<SchedulerViewModel> GetSchedulerByName(string name)
{
var model = await wrapper.GetSchedulerByName(name);
return mapper.Map<SchedulerViewModel>(model);
}

public async Task<CreationResult> CreateScheduler(Models.Mikrotik.SchedulerCreateModel scheduler)
{
var sched = mapper.Map<MikrotikAPI.Models.SchedulerCreateModel>(scheduler);
Expand Down
6 changes: 6 additions & 0 deletions MikrotikAPI/APIWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,12 @@ public async Task<Scheduler> GetScheduler(string id)
return json.ToModel<Scheduler>();
}

public async Task<Scheduler> GetSchedulerByName(string name)
{
var json = await SendGetRequestAsync($"{Endpoints.Scheduler}/{name}");
return json.ToModel<Scheduler>();
}

public async Task<CreationStatus> CreateScheduler(SchedulerCreateModel scheduler)
{
return await CreateItem<Scheduler>(Endpoints.Scheduler, scheduler);
Expand Down

0 comments on commit 443b61a

Please sign in to comment.