From 0d80b8c25f7637eebede3497323d5991cdfe60f1 Mon Sep 17 00:00:00 2001 From: SEAN Date: Tue, 10 Feb 2026 14:11:28 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=95=B1=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=20API=20=EA=B5=AC=ED=98=84=20(#86)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SPMS.API/Controllers/AppVersionController.cs | 32 +++++++++++++++++++ .../DTOs/AppConfig/AppVersionRequestDto.cs | 12 +++++++ .../DTOs/AppConfig/AppVersionResponseDto.cs | 18 +++++++++++ .../Interfaces/IAppConfigService.cs | 1 + SPMS.Application/Services/AppConfigService.cs | 22 +++++++++++++ 5 files changed, 85 insertions(+) create mode 100644 SPMS.API/Controllers/AppVersionController.cs create mode 100644 SPMS.Application/DTOs/AppConfig/AppVersionRequestDto.cs create mode 100644 SPMS.Application/DTOs/AppConfig/AppVersionResponseDto.cs diff --git a/SPMS.API/Controllers/AppVersionController.cs b/SPMS.API/Controllers/AppVersionController.cs new file mode 100644 index 0000000..3165fb5 --- /dev/null +++ b/SPMS.API/Controllers/AppVersionController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Mvc; +using Swashbuckle.AspNetCore.Annotations; +using SPMS.Application.DTOs.AppConfig; +using SPMS.Application.Interfaces; +using SPMS.Domain.Common; + +namespace SPMS.API.Controllers; + +[ApiController] +[Route("v1/in/public/app")] +[ApiExplorerSettings(GroupName = "public")] +public class AppVersionController : ControllerBase +{ + private readonly IAppConfigService _appConfigService; + + public AppVersionController(IAppConfigService appConfigService) + { + _appConfigService = appConfigService; + } + + [HttpPost("version")] + [SwaggerOperation(Summary = "앱 버전 체크", Description = "현재 앱 버전 정보를 확인하고 업데이트 필요 여부를 반환합니다.")] + public async Task CheckVersionAsync([FromBody] AppVersionRequestDto request) + { + var serviceCode = Request.Headers["X-Service-Code"].FirstOrDefault(); + if (string.IsNullOrWhiteSpace(serviceCode)) + return BadRequest(ApiResponse.Fail(ErrorCodes.BadRequest, "X-Service-Code 헤더가 필요합니다.")); + + var result = await _appConfigService.GetAppVersionAsync(serviceCode, request); + return Ok(ApiResponse.Success(result)); + } +} diff --git a/SPMS.Application/DTOs/AppConfig/AppVersionRequestDto.cs b/SPMS.Application/DTOs/AppConfig/AppVersionRequestDto.cs new file mode 100644 index 0000000..99d5f19 --- /dev/null +++ b/SPMS.Application/DTOs/AppConfig/AppVersionRequestDto.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace SPMS.Application.DTOs.AppConfig; + +public class AppVersionRequestDto +{ + [JsonPropertyName("platform")] + public string Platform { get; set; } = string.Empty; + + [JsonPropertyName("app_version")] + public string AppVersion { get; set; } = string.Empty; +} diff --git a/SPMS.Application/DTOs/AppConfig/AppVersionResponseDto.cs b/SPMS.Application/DTOs/AppConfig/AppVersionResponseDto.cs new file mode 100644 index 0000000..9397fd7 --- /dev/null +++ b/SPMS.Application/DTOs/AppConfig/AppVersionResponseDto.cs @@ -0,0 +1,18 @@ +using System.Text.Json.Serialization; + +namespace SPMS.Application.DTOs.AppConfig; + +public class AppVersionResponseDto +{ + [JsonPropertyName("latest_version")] + public string? LatestVersion { get; set; } + + [JsonPropertyName("min_version")] + public string? MinVersion { get; set; } + + [JsonPropertyName("is_force_update")] + public bool IsForceUpdate { get; set; } + + [JsonPropertyName("update_url")] + public string? UpdateUrl { get; set; } +} diff --git a/SPMS.Application/Interfaces/IAppConfigService.cs b/SPMS.Application/Interfaces/IAppConfigService.cs index 2e65a3f..b9e84b6 100644 --- a/SPMS.Application/Interfaces/IAppConfigService.cs +++ b/SPMS.Application/Interfaces/IAppConfigService.cs @@ -6,4 +6,5 @@ public interface IAppConfigService { Task GetTermsAsync(string serviceCode); Task GetPrivacyAsync(string serviceCode); + Task GetAppVersionAsync(string serviceCode, AppVersionRequestDto request); } diff --git a/SPMS.Application/Services/AppConfigService.cs b/SPMS.Application/Services/AppConfigService.cs index ba39f3b..966827e 100644 --- a/SPMS.Application/Services/AppConfigService.cs +++ b/SPMS.Application/Services/AppConfigService.cs @@ -27,6 +27,28 @@ public class AppConfigService : IAppConfigService 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 + }; + } + private async Task GetConfigUrlAsync(string serviceCode, string configKey) { var service = await _serviceRepository.GetByServiceCodeAsync(serviceCode); -- 2.45.1