using System.Text.Json; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Back.Program.Common.Model; using Back.Program.Controllers.V1; using Back.Program.Services.V1; using Back.Program.Services.V1.Interfaces; using Back.Program.Models.APIResponses; namespace Back.Program.Controllers; [ApiController] [Route("/api/v1/out/user")] [ApiExplorerSettings(GroupName = "외부 동작(사용자)")] public class OutController: ControllerBase { private readonly ILogger _logger; private readonly IRepositoryService _repositoryService; private readonly IUserService _userService; private readonly IKakaoService _kakaoService; private readonly ISessionService _sessionService; public OutController(ILogger logger, IRepositoryService repositoryService, IUserService userService, IKakaoService kakaoService, ISessionService sessionService) { _logger = logger; _repositoryService = repositoryService; _userService = userService; _kakaoService = kakaoService; _sessionService = sessionService; } [HttpGet("kakao/auth")] [CustomOperation("카카오 로그인", "카카오 로그인 동작", "사용자")] public async Task KakaoLogin([FromQuery] string? scope) { var url = await _kakaoService.GetAuthorizationUrl(scope ?? ""); Console.WriteLine($"카카오 로그인 API: {url}"); return Ok(new { url }); } [HttpGet("kakao/redirect")] public async Task RedirectFromKakao([FromQuery] string code) { var (success, response) = await _kakaoService.Redirect(code); Console.WriteLine($"리다이렉트 : {response}"); if (success) { // HttpContext.Session.SetString("AccessToken", response); var (idSuccess, idResponse) = await _kakaoService.UserMe(response); if (idSuccess) { var json = JsonDocument.Parse(idResponse); if (json.RootElement.TryGetProperty("id", out var idElement)) { var snsId = idElement.ToString(); Console.WriteLine($"ID = {snsId}"); var loginResult = await _userService.Login("SNS Login", "ST01", snsId); Console.WriteLine($"login = {loginResult.JsonToString()}"); if (loginResult.status.code == "000") { var data = loginResult.data as LoginAPIResponse ?? new LoginAPIResponse(); if (data != null) { string token = data.token; string refresh = data.refresh; if (await _sessionService.SetString("token", token) && await _sessionService.SetString("refresh", refresh)) { return Redirect("/about"); } } } else if (loginResult.status.code == "001") { if (await _sessionService.SetString("snsId", snsId)) { return Redirect("/auth/register"); } } else { return BadRequest(new { error = "로그인 실패", message = loginResult.status.message }); } // return Ok(new { id="cc" }); } } Console.WriteLine($"ID_res = {idResponse}"); } return BadRequest(); } }