using Microsoft.AspNetCore.Mvc; using System.Text.Json; using AcaMate.Common.Data; using AcaMate.Common.Models; using AcaMate.Common.Token; using AcaMate.V1.Models; using AcaMate.V1.Services; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Version = AcaMate.V1.Models.Version; namespace AcaMate.V1.Controllers; [ApiController] [Route("/api/v1/in/app")] [ApiExplorerSettings(GroupName = "공통")] public class AppController : ControllerBase { private readonly AppDbContext _dbContext; private readonly ILogger _logger; private readonly IRepositoryService _repositoryService; private readonly JwtTokenService _jwtTokenService; public AppController(AppDbContext dbContext, ILogger logger, IRepositoryService repositoryService, JwtTokenService jwtTokenService) { _dbContext = dbContext; _logger = logger; _repositoryService = repositoryService; _jwtTokenService = jwtTokenService; } [HttpGet("version")] [CustomOperation("앱 버전 확인","앱 버전을 확인해서 업데이트 여부 판단", "시스템")] public IActionResult GetVersionData(string type) { if (string.IsNullOrEmpty(type)) { return BadRequest(APIResponse.InvalidInputError); } try { var version = _dbContext.Version.FirstOrDefault(v => v.os_type == (type == "I" ? "VO01" : "VO02")); if (version == null) { return NotFound(APIResponse.NotFoundError); } var response = new APIResponseStatus { status = new Status() { code = "000", message = "정상" }, data = new Version() { os_type = (version.os_type == "VO01" ? "I" : (version.os_type == "VO02" ? "A" : "W")), final_ver = version.final_ver, force_ver = version.force_ver, dev_ver = version.dev_ver, choice_update_yn = version.choice_update_yn } }; string jsonString = JsonSerializer.Serialize(response); // return Ok(jsonString); return Ok(response.JsonToString()); } catch (Exception ex) { Console.WriteLine($"{ex.Message}\n{ex.StackTrace}"); return StatusCode(500, APIResponse.UnknownError); } } [HttpGet("auth")] [CustomOperation("서버 접근 권한 확인", "서버 기능을 사용하기 위한 접근에 대해 권한 확인", "시스템")] public async Task AuthProgram([FromBody] AuthKey keys) { string summary = String.Empty; try { summary = _repositoryService.ReadSummary(typeof(AppController), "AuthProgram"); } catch (Exception ex) { _logger.LogError($"[{summary}] : {ex.Message}"); return StatusCode(500, APIResponse.UnknownError(ex.Message)); } return Ok(APIResponse.Send("000", "OK", Empty)); } [HttpGet("retryAccess")] [CustomOperation("엑세스 토큰 재발급", "액세스 토큰 재발급 동작 수행", "시스템")] public async Task RetryAccessToken(string refresh) { string summary = String.Empty; try { summary = _repositoryService.ReadSummary(typeof(AppController), "AuthProgram"); var refreshToken = await _dbContext.RefreshTokens .FirstOrDefaultAsync(t => t.refresh_token == refresh); if (refreshToken == null) throw new TokenException($"[{summary}] : 리프레시 토큰의 문제"); if (refreshToken.revoke_Date < DateTime.Now) throw new TokenException($"[{summary}] : 리프레시 토큰 만료"); if (refreshToken.expire_date < DateTime.Now) throw new TokenException($"[{summary}] : 리프레시 토큰 폐기"); string access = _jwtTokenService.GenerateJwtToken(refreshToken.uid); return Ok(APIResponse.Send("000", $"[{summary}], 토큰 생성 완료", new { access = access })); } catch (TokenException ex) { _logger.LogError($"[{summary}] : {ex.Message}"); return Ok(APIResponse.InvalidInputError(ex.Message)); } catch (Exception ex) { _logger.LogError($"[{summary}] : {ex.Message}"); return StatusCode(500, APIResponse.UnknownError(ex.Message)); } } }