forked from AcaMate/AcaMate_API
[♻️] USER API 로직 점검 및 로그 추가
This commit is contained in:
parent
d537ad7a25
commit
19fb34bc32
|
@ -34,6 +34,7 @@ public class AppDbContext: DbContext
|
|||
|
||||
//MARK: LOG
|
||||
public DbSet<LogPush> LogPush { get; set; }
|
||||
public DbSet<LogUser> LogUser { get; set; }
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
|
|
|
@ -42,81 +42,23 @@ public static class APIResponse
|
|||
return Send("000", "정상", "");
|
||||
}
|
||||
|
||||
public static APIResponseStatus<string> InvalidInputError()
|
||||
public static APIResponseStatus<string> InvalidInputError(string? msg = null)
|
||||
{
|
||||
return Send("100", "입력 값이 유효하지 않습니다.", "");
|
||||
return Send("100", msg ?? "입력 값이 유효하지 않습니다.", "");
|
||||
}
|
||||
|
||||
public static APIResponseStatus<string> NotFoundError()
|
||||
public static APIResponseStatus<string> NotFoundError(string? msg = null)
|
||||
{
|
||||
return Send("200", "알맞은 값을 찾을 수 없습니다.", "");
|
||||
return Send("200", msg ?? "알맞은 값을 찾을 수 없습니다.", "");
|
||||
}
|
||||
|
||||
public static APIResponseStatus<string> InternalSeverError()
|
||||
public static APIResponseStatus<string> InternalSeverError(string? msg = null)
|
||||
{
|
||||
return Send("300", "통신에 오류가 발생하였습니다.", "");
|
||||
return Send("300", msg ?? "통신에 오류가 발생하였습니다.", "");
|
||||
}
|
||||
|
||||
public static APIResponseStatus<string> UnknownError()
|
||||
public static APIResponseStatus<string> UnknownError(string? msg = null)
|
||||
{
|
||||
return Send("999", "알 수 없는 오류가 발생하였습니다.", "");
|
||||
return Send("999", msg ?? "알 수 없는 오류가 발생하였습니다.", "");
|
||||
}
|
||||
}
|
||||
//
|
||||
// public static class DefaultResponse
|
||||
// {
|
||||
// // private static readonly Lazy<ErrorResponse> _instance = new Lazy<ErrorResponse>();
|
||||
// // public static ErrorResponse Instace => _instance.Value;
|
||||
//
|
||||
// // private ErrorResponse()
|
||||
// // {
|
||||
// // // 외부 초기화 방지
|
||||
// // }
|
||||
//
|
||||
//
|
||||
// public static APIResponseStatus<string> Success = new APIResponseStatus<string>
|
||||
// {
|
||||
// status = new Status()
|
||||
// {
|
||||
// code = "000",
|
||||
// message = "정상"
|
||||
// }
|
||||
// };
|
||||
//
|
||||
// public static APIResponseStatus<string> InvalidInputError = new APIResponseStatus<string>
|
||||
// {
|
||||
// status = new Status()
|
||||
// {
|
||||
// code = "001",
|
||||
// message = "입력 값이 유효하지 않습니다."
|
||||
// }
|
||||
// };
|
||||
//
|
||||
// public static APIResponseStatus<string> NotFoundError = new APIResponseStatus<string>
|
||||
// {
|
||||
// status = new Status()
|
||||
// {
|
||||
// code = "002",
|
||||
// message = "알맞은 값을 찾을 수 없습니다."
|
||||
// }
|
||||
// };
|
||||
//
|
||||
// public static APIResponseStatus<string> InternalSeverError = new APIResponseStatus<string>
|
||||
// {
|
||||
// status = new Status
|
||||
// {
|
||||
// code = "003",
|
||||
// message = "통신에 오류가 발생하였습니다."
|
||||
// }
|
||||
// };
|
||||
//
|
||||
//
|
||||
// public static APIResponseStatus<string> UnknownError = new APIResponseStatus<string>
|
||||
// {
|
||||
// status = new Status()
|
||||
// {
|
||||
// code = "999",
|
||||
// message = "알 수 없는 오류가 발생하였습니다."
|
||||
// }
|
||||
// };
|
||||
// }
|
||||
|
|
|
@ -18,6 +18,9 @@ using AcaMate.V1.Services;
|
|||
|
||||
namespace AcaMate.V1.Controllers;
|
||||
|
||||
/// <summary>
|
||||
/// USER는 사용자가 자신의 데이터를 보거나 만들거나 하는 등 직접 사용하는 경우에 사용
|
||||
/// </summary>
|
||||
[ApiController]
|
||||
[Route("/api/v1/in/user")]
|
||||
[ApiExplorerSettings(GroupName = "사용자")]
|
||||
|
@ -37,16 +40,17 @@ public class UserController : ControllerBase
|
|||
}
|
||||
|
||||
[HttpGet]
|
||||
[CustomOperation("회원 정보 조회", "회원 정보 조회", "사용자")]
|
||||
[CustomOperation("회원 정보 조회", "회원 정보 조회 (자기자신)", "사용자")]
|
||||
public async Task<IActionResult> GetUserData(string token, string refresh)
|
||||
{
|
||||
if(string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh))
|
||||
return BadRequest(APIResponse.InvalidInputError());
|
||||
|
||||
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError());
|
||||
if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
|
||||
string summary = String.Empty;
|
||||
|
||||
try
|
||||
{
|
||||
var validateToken = await _repositoryService.ValidateToken(token, refresh);
|
||||
summary = _repositoryService.ReadSummary(typeof(PushController), "GetUserData");
|
||||
|
||||
var user = await _dbContext.User
|
||||
.Where(u => u.uid == validateToken.uid)
|
||||
|
@ -62,140 +66,149 @@ public class UserController : ControllerBase
|
|||
})
|
||||
.FirstOrDefaultAsync();
|
||||
|
||||
// _logger.LogInformation($"CHECK!! {user.}");
|
||||
|
||||
return Ok(APIResponse.Send("000", "정상", user));
|
||||
return Ok(APIResponse.Send("000", $"[{summary}], 정상", user));
|
||||
}
|
||||
catch (TokenException tokenEx)
|
||||
{
|
||||
_logger.LogInformation($"[로그인] : {tokenEx}");
|
||||
return Ok(APIResponse.Send("001", "로그인 진행: 토큰에 문제가 있음",Empty));
|
||||
_logger.LogInformation($"[{summary}] : {tokenEx}");
|
||||
return Ok(APIResponse.Send("001", $"[{summary}], 토큰에 문제가 있음",Empty));
|
||||
}
|
||||
catch (RefreshRevokeException refreshEx)
|
||||
{
|
||||
_logger.LogInformation($"[로그인] : {refreshEx}");
|
||||
return Ok(APIResponse.Send("001", "로그인 진행: 리프레시 토큰 폐기",Empty));
|
||||
_logger.LogInformation($"[{summary}] : {refreshEx}");
|
||||
return Ok(APIResponse.Send("001", $"[{summary}], 폐기된 리프레시 토큰",Empty));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return StatusCode(500, APIResponse.UnknownError());
|
||||
return StatusCode(500, APIResponse.UnknownError(ex.Message));
|
||||
}
|
||||
}
|
||||
[HttpGet("academy")]
|
||||
[CustomOperation("학원 리스트 확인", "사용자가 등록된 학원 리스트 확인", "사용자")]
|
||||
public async Task<IActionResult> ReadAcademyInfo(string token, string refresh)
|
||||
{
|
||||
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError());
|
||||
if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
|
||||
string summary = String.Empty;
|
||||
|
||||
try
|
||||
{
|
||||
var validateToken = await _repositoryService.ValidateToken(token, refresh);
|
||||
summary = _repositoryService.ReadSummary(typeof(PushController), "ReadAcademyInfo");
|
||||
|
||||
var academies = await (from ua in _dbContext.UserAcademy
|
||||
join a in _dbContext.Academy on ua.bid equals a.bid
|
||||
where ua.uid == validateToken.uid
|
||||
select new AcademyName
|
||||
{
|
||||
bid = a.bid,
|
||||
name = a.business_name
|
||||
}).ToListAsync();
|
||||
|
||||
|
||||
return Ok(APIResponse.Send("000",$"[{summary}], 정상.",academies));
|
||||
}
|
||||
catch (TokenException tokenEx)
|
||||
{
|
||||
_logger.LogInformation($"[{summary}] : {tokenEx}");
|
||||
return Ok(APIResponse.Send("001", $"[{summary}], 토큰에 문제가 있음",Empty));
|
||||
}
|
||||
catch (RefreshRevokeException refreshEx)
|
||||
{
|
||||
_logger.LogInformation($"[{summary}] : {refreshEx}");
|
||||
return Ok(APIResponse.Send("001", $"[{summary}], 폐기된 리프레시 토큰",Empty));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogInformation($"[{summary}] : {ex}");
|
||||
return StatusCode(500, APIResponse.UnknownError(ex.Message));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[HttpGet("login")]
|
||||
[CustomOperation("SNS 로그인", "로그인 후 회원이 있는지 확인", "사용자")]
|
||||
public async Task<IActionResult> Login(string acctype, string sns_id)
|
||||
{
|
||||
// API 동작 파라미터 입력 값 확인
|
||||
if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(sns_id))
|
||||
return BadRequest(APIResponse.InvalidInputError());
|
||||
if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(sns_id)) return BadRequest(APIResponse.InvalidInputError());
|
||||
if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
|
||||
string summary = String.Empty;
|
||||
|
||||
try
|
||||
{
|
||||
summary = _repositoryService.ReadSummary(typeof(PushController), "Login");
|
||||
|
||||
var login = await _dbContext.Login
|
||||
.FirstOrDefaultAsync(l => l.sns_type == acctype && l.sns_id == sns_id);
|
||||
|
||||
if (login != null)
|
||||
{
|
||||
// 로그인 정보가 존재 하는 상황
|
||||
var uid = login.uid;
|
||||
|
||||
var user = await _dbContext.User
|
||||
.FirstOrDefaultAsync(u => u.uid == uid);
|
||||
.FirstOrDefaultAsync(u => u.uid == login.uid);
|
||||
|
||||
// 회원 정보 없음
|
||||
if (user == null) return Ok(APIResponse.Send("002", $"[{summary}], 회원 정보 오류",Empty));
|
||||
|
||||
if (user != null)
|
||||
{
|
||||
// 정상적으로 User 테이블에도 있는것이 확인 됨
|
||||
user.login_date = DateTime.Now;
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
// 토큰 생성은 로그인이 이제 되고 나서 한다.
|
||||
var accessToken = _jwtTokenService.GenerateJwtToken(uid);//, "Normal");
|
||||
var refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
|
||||
_logger.LogInformation($"{uid}: {accessToken}, {refreshToken}");
|
||||
var accessToken = _jwtTokenService.GenerateJwtToken(login.uid);
|
||||
var refreshToken = _jwtTokenService.GenerateRefreshToken(login.uid);
|
||||
_logger.LogInformation($"[{summary}] : {login.uid} = {accessToken}, {refreshToken}");
|
||||
|
||||
// await _repositoryService.SaveData<RefreshToken, string>(refreshToken, rt => rt.uid);
|
||||
await _repositoryService.SaveData<RefreshToken>(refreshToken);
|
||||
|
||||
return Ok(APIResponse.Send("000","정상", new
|
||||
if (await _repositoryService.SaveData<RefreshToken>(refreshToken))
|
||||
{
|
||||
token = accessToken,
|
||||
refresh = refreshToken.refresh_token
|
||||
}));
|
||||
var logUser = new LogUser
|
||||
{
|
||||
uid = login.uid,
|
||||
create_date = DateTime.Now,
|
||||
create_uid = "System",
|
||||
log = $"[{summary}] : 정상"
|
||||
};
|
||||
await _repositoryService.SaveData<LogUser>(logUser);
|
||||
return Ok(APIResponse.Send("000",$"[{summary}], 정상",
|
||||
new { token = accessToken, refresh = refreshToken.refresh_token }));
|
||||
}
|
||||
}
|
||||
// case 1: Login 테이블에 값이 없다 == 로그인이 처음
|
||||
// case 2: User 테이블에 값이 없다 == 이건 문제가 있는 상황 -> 해결은 회원가입 재 진행 시도
|
||||
// Login에는 있는데 User 테이블에 없다? 말이 안되긴 하는데...
|
||||
else
|
||||
{
|
||||
var logUser = new LogUser
|
||||
{
|
||||
uid = login.uid,
|
||||
create_date = DateTime.Now,
|
||||
create_uid = "System",
|
||||
log = $"[{summary}] : 실패"
|
||||
};
|
||||
await _repositoryService.SaveData<LogUser>(logUser);
|
||||
|
||||
return Ok(APIResponse.Send("001", "회원가입 진행: 로그인 정보가 없음",Empty));
|
||||
return Ok(APIResponse.InternalSeverError($"[{summary}], 로그인 저장 실패"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return Ok(APIResponse.Send("001", $"[{summary}], 로그인 정보 없음",Empty));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogInformation($"[로그인][에러] : {ex}");
|
||||
return StatusCode(500, APIResponse.UnknownError());
|
||||
_logger.LogInformation($"[{summary}] : {ex}");
|
||||
return StatusCode(500, APIResponse.UnknownError(ex.Message));
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet("academy")]
|
||||
[CustomOperation("학원 리스트 확인", "사용자가 등록된 학원 리스트 확인", "사용자")]
|
||||
public async Task<IActionResult> ReadAcademyInfo(string token, string refresh)
|
||||
{
|
||||
_logger.LogInformation($"토큰 : {token}, {refresh}");
|
||||
|
||||
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh))
|
||||
{
|
||||
return BadRequest(APIResponse.InvalidInputError());
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var validateToken = await _repositoryService.ValidateToken(token, refresh);
|
||||
var uid = validateToken.uid;
|
||||
|
||||
var userAcademy = await _dbContext.UserAcademy
|
||||
.Where(ua => ua.uid == uid)
|
||||
.Select(ua => ua.bid)
|
||||
.ToListAsync();
|
||||
|
||||
|
||||
var academies = await _dbContext.Academy
|
||||
.Where(a => userAcademy.Contains(a.bid))
|
||||
.Select(a => new AcademyName
|
||||
{
|
||||
bid = a.bid,
|
||||
name = a.business_name
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
return Ok(APIResponse.Send("000","정상.",academies));
|
||||
}
|
||||
catch (TokenException tokenEx)
|
||||
{
|
||||
_logger.LogInformation($"[로그인] : {tokenEx}");
|
||||
return Ok(APIResponse.Send("001", "[로그인] : 토큰에 문제가 있음",Empty));
|
||||
}
|
||||
catch (RefreshRevokeException refreshEx)
|
||||
{
|
||||
_logger.LogInformation($"[로그인] : {refreshEx}");
|
||||
return Ok(APIResponse.Send("001", "[로그인] : 폐기된 리프레시 토큰",Empty));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogInformation($"[로그인][에러] : {ex}");
|
||||
return StatusCode(500, APIResponse.UnknownError());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[HttpPost("register")]
|
||||
[CustomOperation("회원 가입", "사용자 회원 가입", "사용자")]
|
||||
public async Task<IActionResult> UserRegister([FromBody] UserAll request)
|
||||
{
|
||||
if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
|
||||
if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
|
||||
string summary = String.Empty;
|
||||
|
||||
var atIndex = request.email.IndexOf('@');
|
||||
var localPartEmail = request.email.Substring(0, atIndex);
|
||||
try
|
||||
{
|
||||
summary = _repositoryService.ReadSummary(typeof(PushController), "UserRegister");
|
||||
var localPartEmail = request.email.Substring(0, request.email.IndexOf('@'));
|
||||
var uid = $"AM{localPartEmail}{DateTime.Now:yyyyMMdd}";
|
||||
|
||||
var user = new User
|
||||
|
@ -236,69 +249,115 @@ public class UserController : ControllerBase
|
|||
address = request.address
|
||||
};
|
||||
|
||||
|
||||
if (await _repositoryService.SaveData<User>(user))
|
||||
var logUser = new LogUser
|
||||
{
|
||||
uid = login.uid,
|
||||
create_date = DateTime.Now,
|
||||
create_uid = "System",
|
||||
log = ""
|
||||
};
|
||||
|
||||
var saveUser = await _repositoryService.SaveData<User>(user);
|
||||
var saveLogin = await _repositoryService.SaveData<Login>(login);
|
||||
var savePermission = await _repositoryService.SaveData<Permission>(permission);
|
||||
var saveContact = await _repositoryService.SaveData<Contact>(contact);
|
||||
if (saveUser && saveLogin && savePermission && saveContact)
|
||||
{
|
||||
await _repositoryService.SaveData<Login>(login);
|
||||
await _repositoryService.SaveData<Permission>(permission);
|
||||
await _repositoryService.SaveData<Contact>(contact);
|
||||
}
|
||||
|
||||
// TO-DO: jwt 토큰 만들어서 여기서 보내는 작업을 해야 함
|
||||
var token = _jwtTokenService.GenerateJwtToken(uid);
|
||||
var refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
|
||||
|
||||
await _repositoryService.SaveData<RefreshToken>(refreshToken);
|
||||
if (await _repositoryService.SaveData<RefreshToken>(refreshToken))
|
||||
{
|
||||
logUser.log = $"[{summary}] : 정상";
|
||||
|
||||
return Ok(APIResponse.Send("000","정상",new
|
||||
if (await _repositoryService.SaveData<LogUser>(logUser))
|
||||
_logger.LogError($"[{summary}] : 로그 저장 성공");
|
||||
|
||||
return Ok(APIResponse.Send("000",$"[{summary}], 정상",new
|
||||
{
|
||||
accessToken = token,
|
||||
refreshToken = refreshToken.refresh_token
|
||||
}));
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogError($"[{summary}] : 토큰 저장 실패");
|
||||
}
|
||||
}
|
||||
|
||||
logUser.log = $"[{summary}] : 동작 실패";
|
||||
await _repositoryService.SaveData<LogUser>(logUser);
|
||||
|
||||
return Ok(APIResponse.InternalSeverError());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogInformation($"[{summary}] : {ex.Message}");
|
||||
return BadRequest(APIResponse.UnknownError(ex.Message));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[HttpGet("logout")]
|
||||
[CustomOperation("로그아웃", "사용자 로그아웃", "사용자")]
|
||||
public async Task<IActionResult> Logout(string token, string refresh) //([FromBody] UserAll request)
|
||||
public async Task<IActionResult> Logout(string token, string refresh)
|
||||
{
|
||||
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError());
|
||||
if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
|
||||
string summary = String.Empty;
|
||||
|
||||
try
|
||||
{
|
||||
summary = _repositoryService.ReadSummary(typeof(PushController), "UserRegister");
|
||||
|
||||
// 여기서 애초에 토큰 관련 에러가 2개가 나오게 만들어져 있음
|
||||
var validateToken = await _repositoryService.ValidateToken(token, refresh);
|
||||
|
||||
var refreshToken = await _dbContext.RefreshTokens.FirstOrDefaultAsync(r => r.uid == validateToken.uid);
|
||||
|
||||
if (refreshToken != null)
|
||||
{
|
||||
refreshToken.revoke_Date = DateTime.Now;
|
||||
await _repositoryService.SaveData<RefreshToken>(refreshToken);
|
||||
return Ok(APIResponse.Send("000", "로그아웃 정상", Empty));
|
||||
}
|
||||
else
|
||||
{
|
||||
return Ok(APIResponse.Send("000", "로그아웃 정상", Empty));
|
||||
return Ok(APIResponse.Send("000", $"[{summary}], 로그아웃 정상", Empty));
|
||||
}
|
||||
// 리프레시 토큰이 없다?? 그럼 이거 무조건 문제지 (이유를 알 수 없는)
|
||||
return Ok(APIResponse.UnknownError());
|
||||
}
|
||||
catch (TokenException tokenEx)
|
||||
{
|
||||
return Ok(APIResponse.Send("101", "입력 받은 토큰의 문제", Empty));
|
||||
return Ok(APIResponse.Send("101", $"[{summary}], 입력 받은 토큰의 문제", Empty));
|
||||
}
|
||||
catch (RefreshRevokeException refreshEx)
|
||||
{
|
||||
return Ok(APIResponse.Send("102", "폐기된 리프레시 토큰", Empty));
|
||||
return Ok(APIResponse.Send("102", $"[{summary}], 폐기된 리프레시 토큰", Empty));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return StatusCode(500, APIResponse.UnknownError());
|
||||
return StatusCode(500, APIResponse.UnknownError($"[{summary}], {ex.Message}"));
|
||||
}
|
||||
}
|
||||
|
||||
// [HttpGet("set")]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
string uid = "";
|
||||
if (token == "System") uid = "System";
|
||||
else {
|
||||
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError());
|
||||
if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
|
||||
|
||||
var validateToken = await _repositoryService.ValidateToken(token, refresh);
|
||||
uid = validateToken.uid;
|
||||
}
|
||||
|
||||
string summary = String.Empty;
|
||||
try
|
||||
{
|
||||
summary = _repositoryService.ReadSummary(typeof(PushController), "GetUserData");
|
||||
}
|
||||
*/
|
|
@ -17,3 +17,15 @@ public class LogPush
|
|||
public string create_uid {get; set;}
|
||||
public string log { get; set; }
|
||||
}
|
||||
|
||||
[Table("log_user")]
|
||||
public class LogUser
|
||||
{
|
||||
[Key]
|
||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||
public int lid { get; set; }
|
||||
public string uid {get; set;}
|
||||
public DateTime create_date {get; set;}
|
||||
public string create_uid {get; set;}
|
||||
public string log { get; set; }
|
||||
}
|
Loading…
Reference in New Issue
Block a user