AcaMate_Web/Program/Services/UserService.cs
SEAN-59 2665dcbf64 [♻️] 로그인 동작 로직 개편
1. 로그인 동작을 위해서 viewmodel 로 관련 뷰에서 동작할 모든 로직을 viewmodel에서 관리
1.1. view 와 viewmodel의 관계는 1:N으로 동작하는것을 기반으로 두고 있음
2. API 접근하는 방식도 웹만의 접근 방법에서 수정
3. 로그인 동작 정보 받는 로직 수정
2025-06-16 17:47:35 +09:00

123 lines
4.5 KiB
C#

using System.Text.Json;
using Front.Program.Models;
using Microsoft.JSInterop;
namespace Front.Program.Services;
public class UserService
{
private readonly StorageService _storageService;
private readonly SecureService _secureService;
private readonly IJSRuntime _js;
private readonly ILogger<UserService> _logger;
public UserService(
StorageService storageService,
SecureService secureService,
IJSRuntime js,
ILogger<UserService> logger)
{
_storageService = storageService;
_secureService = secureService;
_js = js;
_logger = logger;
}
public async Task<(bool success, UserData? userData)> GetUserData()
{
try
{
// 1. 먼저 저장된 데이터 확인
var encryptedUserData = await _storageService.GetItemAsync("USER_DATA");
if (!string.IsNullOrEmpty(encryptedUserData))
{
try
{
var decryptedUserData = await _secureService.DecryptAsync(encryptedUserData);
var userData = JsonSerializer.Deserialize<UserData>(decryptedUserData);
if (userData != null && !string.IsNullOrEmpty(userData.Name))
{
_logger.LogInformation("저장된 사용자 데이터 로드 성공");
return (true, userData);
}
}
catch (Exception ex)
{
_logger.LogWarning($"저장된 사용자 데이터 복호화 실패: {ex.Message}");
await _storageService.RemoveItemAsync("USER_DATA");
}
}
// 2. API 호출
var headerValue = await _storageService.GetItemAsync("Web_AM_Connect_Key");
if (string.IsNullOrEmpty(headerValue))
{
_logger.LogWarning("연결 키가 없습니다");
return (false, null);
}
_logger.LogInformation("세션 API 호출 시작");
var response = await _js.InvokeAsync<JsonElement>("fetchWithHeaderAndReturnUrl",
"/api/v1/in/user/auth/session",
"GET",
"Web_AM_Connect_Key",
headerValue);
if (response.TryGetProperty("data", out var dataElement))
{
try
{
// 전체 데이터 암호화 저장
var userDataJson = dataElement.ToString();
var userData = JsonSerializer.Deserialize<UserData>(userDataJson);
if (userData != null && !string.IsNullOrEmpty(userData.Name))
{
var encryptedData = await _secureService.EncryptAsync(userDataJson);
await _storageService.SetItemAsync("USER_DATA", encryptedData);
await _storageService.SetItemAsync("Web_AM_Connect_Key", headerValue);
_logger.LogInformation($"사용자 데이터 저장 성공: {userData.Name}");
return (true, userData);
}
else
{
_logger.LogWarning("사용자 데이터에 필수 정보가 없습니다");
return (false, null);
}
}
catch (Exception ex)
{
_logger.LogError($"사용자 데이터 처리 중 오류: {ex.Message}");
return (false, null);
}
}
_logger.LogWarning("사용자 데이터를 찾을 수 없습니다");
return (false, null);
}
catch (Exception ex)
{
_logger.LogError($"사용자 데이터 조회 중 오류: {ex.Message}");
return (false, null);
}
}
public async Task<bool> ClearUserData()
{
try
{
await _storageService.RemoveItemAsync("USER_DATA");
await _storageService.RemoveItemAsync("USER");
await _storageService.RemoveItemAsync("Web_AM_Connect_Key");
_logger.LogInformation("사용자 데이터 삭제 성공");
return true;
}
catch (Exception ex)
{
_logger.LogError($"사용자 데이터 삭제 중 오류: {ex.Message}");
return false;
}
}
}