using SPMS.Application.DTOs.AppConfig; using SPMS.Application.Interfaces; using SPMS.Domain.Common; using SPMS.Domain.Exceptions; using SPMS.Domain.Interfaces; namespace SPMS.Application.Services; public class AppConfigService : IAppConfigService { private readonly IAppConfigRepository _appConfigRepository; private readonly IServiceRepository _serviceRepository; public AppConfigService(IAppConfigRepository appConfigRepository, IServiceRepository serviceRepository) { _appConfigRepository = appConfigRepository; _serviceRepository = serviceRepository; } public async Task GetTermsAsync(string serviceCode) { return await GetConfigUrlAsync(serviceCode, "terms_url"); } public async Task GetPrivacyAsync(string serviceCode) { return await GetConfigUrlAsync(serviceCode, "privacy_url"); } public async Task GetAppVersionAsync(string serviceCode, AppVersionRequestDto request) { var service = await _serviceRepository.GetByServiceCodeAsync(serviceCode); if (service == null) throw new SpmsException(ErrorCodes.NotFound, "존재하지 않는 서비스입니다.", 404); var latestVersion = await _appConfigRepository.GetByKeyAsync(service.Id, "latest_version"); var minVersion = await _appConfigRepository.GetByKeyAsync(service.Id, "min_version"); var forceUpdate = await _appConfigRepository.GetByKeyAsync(service.Id, "force_update"); var updateUrlKey = request.Platform?.ToLowerInvariant() == "ios" ? "update_url_ios" : "update_url_android"; var updateUrl = await _appConfigRepository.GetByKeyAsync(service.Id, updateUrlKey); return new AppVersionResponseDto { LatestVersion = latestVersion?.ConfigValue, MinVersion = minVersion?.ConfigValue, IsForceUpdate = string.Equals(forceUpdate?.ConfigValue, "true", StringComparison.OrdinalIgnoreCase), UpdateUrl = updateUrl?.ConfigValue }; } public async Task GetAppSettingsAsync(string serviceCode) { var service = await _serviceRepository.GetByServiceCodeAsync(serviceCode); if (service == null) throw new SpmsException(ErrorCodes.NotFound, "존재하지 않는 서비스입니다.", 404); var configs = await _appConfigRepository.GetAllByServiceAsync(service.Id); var configDict = configs.ToDictionary(c => c.ConfigKey, c => c.ConfigValue); return new AppSettingsResponseDto { MinAppVersion = configDict.GetValueOrDefault("min_version"), IsMaintenance = string.Equals(configDict.GetValueOrDefault("maintenance_mode"), "true", StringComparison.OrdinalIgnoreCase), MaintenanceMsg = configDict.GetValueOrDefault("maintenance_message"), CsEmail = configDict.GetValueOrDefault("cs_email"), CsPhone = configDict.GetValueOrDefault("cs_phone") }; } private async Task GetConfigUrlAsync(string serviceCode, string configKey) { var service = await _serviceRepository.GetByServiceCodeAsync(serviceCode); if (service == null) throw new SpmsException(ErrorCodes.NotFound, "존재하지 않는 서비스입니다.", 404); var config = await _appConfigRepository.GetByKeyAsync(service.Id, configKey); return new AppConfigResponseDto { Url = config?.ConfigValue }; } }