accounts db & http sdk db impl

This commit is contained in:
rfi
2024-02-19 18:11:00 +07:00
parent 5e8f90b2e9
commit fea7b78126
8 changed files with 216 additions and 3 deletions

View File

@@ -7,6 +7,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.2" />
<PackageReference Include="protobuf-net" Version="3.2.30" />
</ItemGroup>

View File

@@ -0,0 +1,34 @@
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations.Schema;
namespace BLHX.Server.Common.Database
{
public sealed class AccountContext : DbContext, IBLHXDBContext<AccountContext>
{
public static string DbPath => "Databases/accounts.db";
public DbSet<Account> Accounts { get; set; }
public AccountContext()
{
Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite($"Data Source={((IBLHXDBContext)this).GetFullDbPath()}");
}
[PrimaryKey(nameof(Uid))]
public class Account
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public uint Uid { get; set; }
public string DeviceId { get; set; }
public string Token { get; set; }
public Account(string deviceId, string token)
{
DeviceId = deviceId;
Token = token;
}
}
}

View File

@@ -0,0 +1,36 @@
using BLHX.Server.Common.Utils;
using Microsoft.EntityFrameworkCore;
using System.Reflection;
namespace BLHX.Server.Common.Database
{
public static class DBManager
{
public static readonly Logger c = new(nameof(DBManager), ConsoleColor.DarkCyan);
public static AccountContext AccountContext { get; }
static DBManager()
{
foreach (var dbCtx in Assembly.GetExecutingAssembly().GetTypes().Where(p => typeof(IBLHXDBContext).IsAssignableFrom(p) && !p.IsInterface))
{
var dbPath = (string)dbCtx.GetProperty(nameof(AccountContext.DbPath))!.GetValue(null)!;
var saveDir = Path.GetDirectoryName(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, dbPath))!;
if (!Directory.Exists(saveDir))
Directory.CreateDirectory(saveDir);
}
AccountContext = new AccountContext();
}
}
public interface IBLHXDBContext
{
public static abstract string DbPath { get; }
public string GetFullDbPath();
}
public interface IBLHXDBContext<TSelf> : IBLHXDBContext where TSelf : DbContext
{
string IBLHXDBContext.GetFullDbPath() => Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, (string)typeof(TSelf).GetProperty(nameof(DbPath))!.GetValue(null)!);
}
}