using Kean.Infrastructure.Database.Repository.Default;
using Kean.Infrastructure.Database.Repository.Default.Entities;
using Kean.Infrastructure.NoSql.Repository.Default;
using Kean.Infrastructure.Utilities;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace Kean.Infrastructure.Repository
{
///
/// 安全仓库
///
public class SecurityRepository :
Domain.App.Repositories.ISecurityRepository,
Domain.Identity.Repositories.ISecurityRepository
{
private readonly IDefaultDb _database; // 默认数据库
private readonly IDefaultRedis _redis; // 默认 Redis
///
/// 依赖注入
///
public SecurityRepository(
IDefaultDb database,
IDefaultRedis redis)
{
_database = database;
_redis = redis;
}
/*
* 实现 Kean.Domain.App.Repositories.ISecurityRepository.LoadBlacklist() 方法
*/
public async Task LoadBlacklist()
{
var blacklist = await _database.From().Where(s => s.SECURITY_TYPE == "Address" && s.SECURITY_STATUS == 0).Select();
if (blacklist.Any())
{
await _redis.Batch(batch =>
{
var hash = batch.Hash["blacklist"];
return batch.Execute(blacklist.Select(b => hash.Set(b.SECURITY_VALUE, JsonHelper.Serialize(b))).ToArray());
});
}
}
/*
* 实现 Kean.Domain.Identity.Repositories.ISecurityRepository.SignAddress(string address) 方法
*/
public async Task SignAddress(string address)
{
if (int.TryParse(await _redis.Hash["param"].Get("address_security"), out int limit) && limit > 0)
{
var timestamp = DateTime.Now;
var security = await _database.From()
.Where(s => s.SECURITY_TYPE == "Address" && s.SECURITY_VALUE == address)
.Single();
if (security == null)
{
await _database.From().Add(new()
{
SECURITY_TYPE = "Address",
SECURITY_VALUE = address,
SECURITY_STATUS = 1,
SECURITY_TIMESTAMP = timestamp,
CREATE_TIME = timestamp,
UPDATE_TIME = timestamp
});
}
else if (security.SECURITY_STATUS > 0)
{
security.SECURITY_TIMESTAMP = timestamp;
security.UPDATE_TIME = timestamp;
if (++security.SECURITY_STATUS > limit)
{
security.SECURITY_STATUS = 0;
await _redis.Hash["blacklist"].Set(address, JsonHelper.Serialize(security));
}
await _database.From().Update(security, nameof(T_SYS_SECURITY.CREATE_TIME));
}
else
{
await _redis.Hash["blacklist"].Set(address, JsonHelper.Serialize(security));
}
}
}
/*
* 实现 Kean.Domain.Identity.Repositories.ISecurityRepository.UnsignAddress(string address) 方法
*/
public async Task UnsignAddress(string address)
{
await _database.From()
.Where(s => s.SECURITY_TYPE == "Address" && s.SECURITY_VALUE == address)
.Delete();
}
/*
* 实现 Kean.Domain.Identity.Repositories.ISecurityRepository.SignAccount(string account) 方法
*/
public async Task SignAccount(string account)
{
if (int.TryParse(await _redis.Hash["param"].Get("account_security"), out int limit) && limit > 0)
{
var timestamp = DateTime.Now;
var security = await _database.From()
.Where(s => s.SECURITY_TYPE == "Account" && s.SECURITY_VALUE == account)
.Single();
if (security == null)
{
await _database.From().Add(new()
{
SECURITY_TYPE = "Account",
SECURITY_VALUE = account,
SECURITY_STATUS = 1,
SECURITY_TIMESTAMP = timestamp,
CREATE_TIME = timestamp,
UPDATE_TIME = timestamp
});
}
else if (security.SECURITY_STATUS > 0)
{
security.SECURITY_TIMESTAMP = timestamp;
security.UPDATE_TIME = timestamp;
if (++security.SECURITY_STATUS > limit)
{
security.SECURITY_STATUS = 0;
}
await _database.From().Update(security, nameof(T_SYS_SECURITY.CREATE_TIME));
}
}
}
/*
* 实现 Kean.Domain.Identity.Repositories.ISecurityRepository.UnsignAccount(string account) 方法
*/
public async Task UnsignAccount(string account)
{
await _database.From()
.Where(s => s.SECURITY_TYPE == "Account" && s.SECURITY_VALUE == account)
.Delete();
}
/*
* 实现 Kean.Domain.Identity.Repositories.ISecurityRepository.AccountIsFrozen(string account) 方法
*/
public async Task AccountIsFrozen(string account)
{
return await _database.From()
.Where(s => s.SECURITY_TYPE == "Account" && s.SECURITY_VALUE == account && s.SECURITY_STATUS == 0)
.Single() != null;
}
/*
* 实现 Kean.Domain.Identity.Repositories.ISecurityRepository.WriteLog(string tag, string content) 方法
*/
public async Task WriteLog(string tag, string content)
{
if (await _redis.Hash["param"].Get("security_log") == "Enable")
{
var timestamp = DateTime.Now;
await _database.From().Add(new()
{
LOG_TAG = tag,
LOG_TIME = timestamp,
LOG_CONTENT = content,
CREATE_TIME = timestamp,
UPDATE_TIME = timestamp
});
}
}
}
}