using Application.Abstractions.Cache;
using Application.Abstractions.Data;
using Application.Features.Config.Get;
using Microsoft.EntityFrameworkCore;
namespace Application.Helpers;
public static class AccountConfigLoader
{
///
/// Redis 캐시 → MSSQL 폴백으로 AccountConfigDto를 로드합니다.
///
public static async Task GetAccountConfigAsync(
ICacheService cache, IAppDbContext db, CancellationToken ct)
{
// 1. Redis 캐시에서 조회
var config = await cache.GetAsync(CacheKeys.Config, ct);
if (config is not null)
{
return config.Account;
}
// 2. MSSQL 폴백
var entity = await db.Config.AsNoTracking()
.OrderByDescending(x => x.ID)
.FirstOrDefaultAsync(ct);
if (entity is null)
{
// Config가 없으면 기본값 반환
return new Response.AccountConfigDto();
}
return new Response.AccountConfigDto
{
IsRegisterBlock = entity.Account.IsRegisterBlock,
IsRegisterEmailAuth = entity.Account.IsRegisterEmailAuth,
PasswordMinLength = entity.Account.PasswordMinLength,
PasswordUppercaseLength = entity.Account.PasswordUppercaseLength,
PasswordNumbersLength = entity.Account.PasswordNumbersLength,
PasswordSpecialcharsLength = entity.Account.PasswordSpecialcharsLength,
DeniedEmailList = entity.Account.DeniedEmailList,
DeniedNameList = entity.Account.DeniedNameList,
ChangeEmailDay = entity.Account.ChangeEmailDay,
ChangeNameDay = entity.Account.ChangeNameDay,
ChangeSummaryDay = entity.Account.ChangeSummaryDay,
ChangeIntroDay = entity.Account.ChangeIntroDay,
ChangePasswordDay = entity.Account.ChangePasswordDay,
IsLoginEmailVerifiedOnly = entity.Account.IsLoginEmailVerifiedOnly,
MaxLoginTryCount = entity.Account.MaxLoginTryCount,
MaxLoginTryLimitSecond = entity.Account.MaxLoginTryLimitSecond
};
}
}