main #36

Merged
seonkyu.kim merged 12 commits from seonkyu.kim/AcaMate_API:main into debug 2025-03-11 04:45:59 +00:00
7 changed files with 654 additions and 376 deletions

View File

@ -25,4 +25,35 @@
### 4. DB 저장 & 삭제 로직 변경하기 ### 4. DB 저장 & 삭제 로직 변경하기
1. [X] 저장 로직 통일하기 1. [X] 저장 로직 통일하기
2. [X] 삭제 로직 통일하기 2. [X] 삭제 로직 통일하기
---
## 10일(월)
### 1. PUSH API 만들기
1. [X] 사용자가 받은 전체 푸시 확인 [./push/list]
2. [X] 사용자가 받은 푸시 목록 삭제 [./push/delete/list]
### 2. log 기록 남게 만들기
1. [ ] 유저 관련 테이블들 로그 기록 만들기
2. [X] 푸시 관련 테이블들 로그 기록 만들기
### 3. PUSH API 로직 변경
1. [X] 전송 로직 변경
2. [X] 케비닛 저장 로직 변경
---
## 11일(화)
### 1. USER API 점검 및 수정
1. [X] 회원 정보 조회 [./user]
2. [X] 회원 가입 [./user/register]
3. [X] 로그인 [./user/login]
4. [X] 로그아웃 [./user/logout]
5. [X] 학원 조회 [./user/academy]
### 2. USER API 로그 기록 만들기
1. [X] 필요한 위치에 등록하기
### 3. USER API 만들기
1. [X] 회원 탈퇴 [./user/cancel]
2. [보류] 회원 정보 변경 [./user/set]
- 근데 회원 정보를 변경하는게 뭐뭐를 변경해야 하는지 아직 정해진게 없어서 이건 일단 보류

View File

@ -34,14 +34,15 @@ public class AppDbContext: DbContext
//MARK: LOG //MARK: LOG
public DbSet<LogPush> LogPush { get; set; } public DbSet<LogPush> LogPush { get; set; }
public DbSet<LogUser> LogUser { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
modelBuilder.Entity<User_Academy>() modelBuilder.Entity<User_Academy>()
.HasKey(ua => new { ua.uid, ua.bid }); .HasKey(ua => new { ua.uid, ua.bid });
modelBuilder.Entity<PushCabinet>() // modelBuilder.Entity<PushCabinet>()
.HasKey(c => new { c.uid, c.bid, c.pid }); // .HasKey(c => new { c.uid, c.bid, c.pid });
modelBuilder.Entity<DBPayload>() modelBuilder.Entity<DBPayload>()
.HasKey(p => new { p.bid, p.pid }); .HasKey(p => new { p.bid, p.pid });

View File

@ -42,81 +42,23 @@ public static class APIResponse
return Send("000", "정상", ""); 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(string? msg = null)
{
return Send("300", msg ?? "통신에 오류가 발생하였습니다.", "");
} }
public static APIResponseStatus<string> InternalSeverError() public static APIResponseStatus<string> UnknownError(string? msg = null)
{ {
return Send("300", "통신에 오류가 발생하였습니다.", ""); return Send("999", msg ?? "알 수 없는 오류가 발생하였습니다.", "");
} }
}
public static APIResponseStatus<string> UnknownError()
{
return Send("999", "알 수 없는 오류가 발생하였습니다.", "");
}
}
//
// 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 = "알 수 없는 오류가 발생하였습니다."
// }
// };
// }

View File

@ -33,66 +33,41 @@ public class PushController : ControllerBase
[HttpGet()] [HttpGet()]
[CustomOperation("푸시 확인", "저장된 양식을 확인 할 수 있다.", "푸시")] [CustomOperation("푸시 확인", "저장된 양식을 확인 할 수 있다.", "푸시")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))]
public async Task<IActionResult> GetPush(string bid, string? pid, string? category) public async Task<IActionResult> GetPush(string bid, string? pid, string? category)
{ {
if (!(await _dbContext.Academy.AnyAsync(a=>a.bid == bid))) string summary = String.Empty;
return Ok(APIResponse.Send("100", "존재하지 않는 BID", Empty));
List<DBPayload> pushData = new List<DBPayload>();
if (pid == null && category == null)
{
pushData = await _dbContext.DBPayload
.Where(p => p.bid == bid)
.ToListAsync();
}
else if (pid != null && category == null)
{
pushData = await _dbContext.DBPayload
.Where(p => p.bid == bid && p.pid == pid)
.ToListAsync();
}
else if (pid == null && category != null)
{
pushData = await _dbContext.DBPayload
.Where(p => p.bid == bid && p.category == category)
.ToListAsync();
}
else //if (pid != null && category != null)
{
pushData = await _dbContext.DBPayload
.Where(p => p.bid == bid && p.pid == pid && p.category == category)
.ToListAsync();
}
try try
{ {
summary = _repositoryService.ReadSummary(typeof(PushController), "GetPush");
if (!(await _dbContext.Academy.AnyAsync(a=>a.bid == bid)))
return Ok(APIResponse.Send("100", $"[{summary}], 존재하지 않는 BID", Empty));
List<DBPayload> pushData = new List<DBPayload>();
var pushQuery = _dbContext.DBPayload.Where(p => p.bid == bid);
if (pid != null)
pushQuery = pushQuery.Where(p=>p.pid == pid);
if (category != null)
pushQuery = pushQuery.Where(p=>p.category == category);
pushData = await pushQuery.ToListAsync();
if (pushData.Count > 0) if (pushData.Count > 0)
{ {
return Ok(APIResponse.Send("000", "정상", pushData)); return Ok(APIResponse.Send("000", $"[{summary}, 정상", pushData));
} }
return Ok(APIResponse.Send("001", "PUSH 데이터가 없음", Empty)); return Ok(APIResponse.Send("001", $"[{summary}], PUSH 데이터 없음", Empty));
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError($"[푸시] {ex.Message}"); _logger.LogError($"[{summary}] : {ex.Message}");
return StatusCode(500, APIResponse.UnknownError()); return StatusCode(500, APIResponse.UnknownError());
} }
} }
/// <summary>
/// Sends a push notification to the specified device token with the provided payload.
/// </summary>
///
/// <returns>An IActionResult indicating the result of the operation.</returns>
/// <response code="200">Push notification sent successfully.</response>
/// <response code="400">Invalid input parameters.</response>
/// <response code="500">Internal server error occurred.</response>
/// <response code="999">Service unavailable.</response>
[HttpPost("send")] [HttpPost("send")]
[CustomOperation("푸시 발송", "저장된 양식으로, 사용자에게 푸시를 송신한다.", "푸시")] [CustomOperation("푸시 발송", "저장된 양식으로, 사용자에게 푸시를 송신한다.", "푸시")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))]
@ -115,27 +90,32 @@ public class PushController : ControllerBase
}, },
pid = pushRequest.pid, pid = pushRequest.pid,
bid = pushRequest.bid, bid = pushRequest.bid,
content = p.content ?? "", content = pushRequest.content ?? (p.content ?? ""),
}) })
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
await Task.Run(async () => await Task.Run(async () =>
{ {
if (payload == null)
throw new PushInvalidException("payload is NULL");
foreach (var uid in pushRequest.uids) foreach (var uid in pushRequest.uids)
{ {
// 학원 내부에 해당 uid의 일원이 존재하는지 확인
if ( if (
await _dbContext.UserAcademy await _dbContext.UserAcademy
.Where(ua => ua.uid == uid && ua.bid == pushRequest.bid) .Where(ua => ua.uid == uid && ua.bid == pushRequest.bid)
.AnyAsync() .AnyAsync()
) )
{ {
// 유저한테 온 모든 푸시에 대해서 안 읽은 것에 대한 뱃지 갯수 확인
var badge = await _dbContext.PushCabinet var badge = await _dbContext.PushCabinet
.Where(c => c.uid == uid .Where(c => c.uid == uid
&& c.bid == pushRequest.bid
&& c.pid != pushRequest.pid
&& c.check_yn == false) && c.check_yn == false)
.CountAsync(); .CountAsync();
payload.aps.badge = badge + 1;
// 푸시를 보내야 하니 푸시 토큰 확인
var pushToken = await _dbContext.User var pushToken = await _dbContext.User
.Where(u => u.uid == uid) .Where(u => u.uid == uid)
.Select(u => u.push_token) .Select(u => u.push_token)
@ -147,109 +127,161 @@ public class PushController : ControllerBase
bid = pushRequest.bid, bid = pushRequest.bid,
pid = pushRequest.pid, pid = pushRequest.pid,
send_date = DateTime.Now, send_date = DateTime.Now,
content = payload.content != "" ? payload.content : null,
}; };
if (payload != null) payload.aps.badge = badge + 1;
var pushData = new PushData var pushData = new PushData
{ {
pushToken = pushToken, pushToken = pushToken,
payload = payload ?? throw new PushInvalidException("payload is NULL") payload = payload
}; };
await _repositoryService.SaveData<PushCabinet>(pushCabinet);
if (await _repositoryService.SaveData<PushCabinet>(pushCabinet))
{
var logPush = new LogPush
{
bid = pushRequest.bid,
pid = pushRequest.pid,
create_date = DateTime.Now,
create_uid = "System",
log = $"[{summary}] : 푸시 캐비닛 저장 성공"
};
if (await _repositoryService.SaveData<LogPush>(logPush))
_logger.LogInformation($"[{summary}] : 로그 추가");
}
_pushQueue.Enqueue(pushData); _pushQueue.Enqueue(pushData);
} }
else
{
// 존재하지 않는 경우에는 지나가서 다른 uid 로 확인 하겠지
var logPush = new LogPush
{
bid = pushRequest.bid,
pid = pushRequest.pid,
create_date = DateTime.Now,
create_uid = "System",
log = $"[{summary}] : 푸시 전송 실패"
};
if (await _repositoryService.SaveData<LogPush>(logPush))
_logger.LogInformation($"[{summary}] : 로그 추가");
}
} }
}); });
return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty));
return Ok(APIResponse.Send("000", "정상", Empty));
} }
catch (PushInvalidException ex) catch (PushInvalidException ex)
{ {
_logger.LogError(ex.Message); _logger.LogError($"[{summary}] : {ex.Message}");
return Ok(APIResponse.Send("001", $"[{summary}]: 푸시 송신 중 문제 발생",Empty)); return Ok(APIResponse.Send("001", $"[{summary}], 푸시 송신 중 문제 발생",Empty));
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError($"[푸시] {ex.Message}"); _logger.LogError($"[{summary}] : {ex.Message}");
return StatusCode(500, APIResponse.UnknownError()); return StatusCode(500, APIResponse.UnknownError(ex.Message));
} }
} }
[HttpPost("set")] [HttpPost("set")]
[CustomOperation("[푸시 변경]", " .", "")] [CustomOperation("푸시 변경", "저장된 양식을 변경한다.", "푸시")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))]
public async Task<IActionResult> SetPush([FromBody] DBPayload request) public async Task<IActionResult> SetPush(string token, string refresh, [FromBody] DBPayload request)
{ {
string uid = "";
string summary = String.Empty;
try {
if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
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;
}
try summary = _repositoryService.ReadSummary(typeof(PushController), "SetPush");
{
var dbPayload = await _dbContext.DBPayload var dbPayload = await _dbContext.DBPayload
.FirstOrDefaultAsync(p => p.pid == request.pid && p.bid == request.bid); .FirstOrDefaultAsync(p => p.pid == request.pid && p.bid == request.bid);
if (dbPayload != null) if (dbPayload != null)
{ {
var logPush = new LogPush
{
bid = dbPayload.bid,
pid = dbPayload.pid,
create_uid = uid,
create_date = DateTime.Now,
};
if (dbPayload.title != request.title && request.title != "") dbPayload.title = request.title; if (dbPayload.title != request.title && request.title != "") dbPayload.title = request.title;
if (dbPayload.body != request.body && request.body != "") dbPayload.body = request.body; if (dbPayload.body != request.body && request.body != "") dbPayload.body = request.body;
if (dbPayload.subtitle != request.subtitle) dbPayload.subtitle = request.subtitle; if (dbPayload.subtitle != request.subtitle) dbPayload.subtitle = request.subtitle;
if (dbPayload.alert_yn != request.alert_yn) dbPayload.alert_yn = request.alert_yn; if (dbPayload.alert_yn != request.alert_yn) dbPayload.alert_yn = request.alert_yn;
if (dbPayload.category != request.category && request.category != "") dbPayload.category = request.category; if (dbPayload.category != request.category && request.category != "") dbPayload.category = request.category;
if (dbPayload.content != request.content) dbPayload.content = request.content; if (dbPayload.content != request.content) dbPayload.content = request.content;
// if (await _repositoryService.SaveData<DBPayload, string>(dbPayload, p => p.pid))
if (await _repositoryService.SaveData<DBPayload>(dbPayload)) if (await _repositoryService.SaveData<DBPayload>(dbPayload))
return Ok(APIResponse.Send("000", "[푸시 변경] : PUSH 정보 변경 완료", Empty)); {
logPush.log = $"[{summary} : 정상 변경";
return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty));
}
// 로그를 이제 만들어서 추가를 해야 합니다.
if (await _repositoryService.SaveData<LogPush>(logPush))
_logger.LogInformation($"[{summary}] : 로그 추가");
} }
return Ok(APIResponse.Send("100", "PID, BID 또는 Cabinet 오류", Empty)); return Ok(APIResponse.Send("100", $"[{summary}], PID, BID 또는 Cabinet 오류", Empty));
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError($"[푸시] {ex.Message}"); _logger.LogError($"[{summary}] : {ex.Message}");
return StatusCode(500, APIResponse.UnknownError()); return StatusCode(500, APIResponse.UnknownError(ex.Message));
} }
} }
[HttpPost("create")] [HttpPost("create")]
[CustomOperation("푸시 생성", "새로운 푸시 양식을 생성한다.", "푸시")] [CustomOperation("푸시 생성", "새로운 푸시 양식을 생성한다.", "푸시")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))]
public async Task<IActionResult> CreatePush(string token, string refresh, [FromBody] CreatePush createPush) public async Task<IActionResult> CreatePush(string token, string refresh, [FromBody] CreatePush request)
{ {
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError()); string uid = "";
if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string summary = String.Empty;
var validateToken = await _repositoryService.ValidateToken(token, refresh);
var uid = validateToken.uid;
Func<string, int, string> randomLetter = (letters, count) => new string(Enumerable.Range(0, count).Select(_ => letters[new Random().Next(letters.Length)]).ToArray()); Func<string, int, string> randomLetter = (letters, count) => new string(Enumerable.Range(0, count).Select(_ => letters[new Random().Next(letters.Length)]).ToArray());
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var digits = "0123456789"; var digits = "0123456789";
var frontLetters = $"{randomLetter(letters, 1)}{randomLetter(digits, 1)}{randomLetter(letters, 1)}"; var frontLetters = $"{randomLetter(letters, 1)}{randomLetter(digits, 1)}{randomLetter(letters, 1)}";
var afterLetters = $"{randomLetter(letters, 1)}{randomLetter(digits, 1)}{randomLetter(letters, 1)}"; var afterLetters = $"{randomLetter(letters, 1)}{randomLetter(digits, 1)}{randomLetter(letters, 1)}";
string summary = String.Empty;
try { try {
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;
}
summary = _repositoryService.ReadSummary(typeof(PushController), "CreatePush"); summary = _repositoryService.ReadSummary(typeof(PushController), "CreatePush");
if (await _dbContext.Academy.AnyAsync(a => a.bid == createPush.bid)) if (await _dbContext.Academy.AnyAsync(a => a.bid == request.bid))
{ {
DBPayload payload = new DBPayload DBPayload payload = new DBPayload
{ {
bid = createPush.bid, bid = request.bid,
pid = $"AP{DateTime.Now:yyyyMMdd}{frontLetters}{DateTime.Now:HHmmss}{afterLetters}", pid = $"AP{DateTime.Now:yyyyMMdd}{frontLetters}{DateTime.Now:HHmmss}{afterLetters}",
title = createPush.title, title = request.title,
subtitle = createPush.subtitle, subtitle = request.subtitle,
body = createPush.body, body = request.body,
alert_yn = createPush.alert_yn, alert_yn = request.alert_yn,
category = createPush.category, category = request.category,
content = createPush.content, content = request.content,
}; };
if (await _repositoryService.SaveData<DBPayload>(payload)) if (await _repositoryService.SaveData<DBPayload>(payload))
@ -260,85 +292,178 @@ public class PushController : ControllerBase
pid = payload.pid, pid = payload.pid,
create_uid = uid, create_uid = uid,
create_date = DateTime.Now, create_date = DateTime.Now,
log = $"[{summary}] {payload.pid} 최초 생성 - {uid}" log = $"[{summary}] : 정상 생성"
}; };
// 로그를 이제 만들어서 추가를 해야 합니다. // 로그를 이제 만들어서 추가를 해야 합니다.
if (await _repositoryService.SaveData<LogPush>(logPush)) if (await _repositoryService.SaveData<LogPush>(logPush))
_logger.LogInformation("[푸시 생성] 로그 추가"); _logger.LogInformation($"[{summary}] : 로그 추가");
return Ok(APIResponse.Send("000", "정상, push 저장 완료", Empty)); return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty));
} }
} }
return Ok(APIResponse.Send("100", "학원 정보(BID) 확인 불가", Empty)); return Ok(APIResponse.Send("100", $"[{summary}], 학원 정보(BID) 확인 불가", Empty));
} }
catch (TokenException tokenEx) catch (TokenException tokenEx)
{ {
_logger.LogInformation($"[푸시 생성] : {tokenEx}"); _logger.LogInformation($"[{summary}] : {tokenEx}");
return Ok(APIResponse.Send("001", "[푸시 생성] : 토큰에 문제가 있음",Empty)); return Ok(APIResponse.Send("001", $"[{summary}], 토큰에 문제가 있음",Empty));
} }
catch (RefreshRevokeException refreshEx) catch (RefreshRevokeException refreshEx)
{ {
_logger.LogInformation($"[푸시 생성] : {refreshEx}"); _logger.LogInformation($"[{summary}] : {refreshEx}");
return Ok(APIResponse.Send("001", "[푸시 생성] : 폐기된 리프레시 토큰",Empty)); return Ok(APIResponse.Send("001", $"[{summary}], 폐기된 리프레시 토큰",Empty));
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError($"[푸시] {ex.Message}"); _logger.LogError($"[{summary}] : {ex.Message}");
return StatusCode(500, APIResponse.UnknownError()); return StatusCode(500, APIResponse.UnknownError());
} }
} }
[HttpDelete("delete")] [HttpDelete("delete")]
[CustomOperation("푸시 삭제", "저장된 푸시 양식을 삭제 한다.", "푸시")] [CustomOperation("푸시 삭제", "저장된 푸시 양식을 삭제 한다.", "푸시")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))]
public async Task<IActionResult> DeletePush(string token, string refresh, string bid, string pid) public async Task<IActionResult> DeletePush(string token, string refresh, string bid, string pid)
{ {
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError()); string uid = "";
if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
var validateToken = await _repositoryService.ValidateToken(token, refresh);
var uid = validateToken.uid;
string summary = String.Empty; string summary = String.Empty;
try try
{ {
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;
}
summary = _repositoryService.ReadSummary(typeof(PushController), "DeletePush"); summary = _repositoryService.ReadSummary(typeof(PushController), "DeletePush");
var payload = await _dbContext.DBPayload.FirstOrDefaultAsync(p => p.bid == bid && p.pid == pid); var payload = await _dbContext.DBPayload.FirstOrDefaultAsync(p => p.bid == bid && p.pid == pid);
if (await _repositoryService.DeleteData<DBPayload>(payload)) if (payload == null) return Ok(APIResponse.Send("001", $"[{summary}], 삭제 할 PUSH 없음", Empty));
if (!await _repositoryService.DeleteData<DBPayload>(payload)) return Ok(APIResponse.Send("002", $"[{summary}], PUSH 삭제 실패", Empty));
// 로그를 이제 만들어서 추가를 해야 합니다.
var logPush = new LogPush
{ {
// 로그를 이제 만들어서 추가를 해야 합니다. bid = bid,
var logPush = new LogPush pid = pid,
{ create_uid = uid,
bid = bid, create_date = DateTime.Now,
pid = pid, log = $"[{summary}] : {pid} 삭제 - {uid}"
create_uid = uid, };
create_date = DateTime.Now,
log = $"[{summary}] {pid} 삭제 - {uid}"
};
// 로그를 이제 만들어서 추가를 해야 합니다. // 로그를 이제 만들어서 추가를 해야 합니다.
if (await _repositoryService.SaveData<LogPush>(logPush)) if (await _repositoryService.SaveData<LogPush>(logPush)) _logger.LogInformation($"[{summary}] : 로그 추가");
_logger.LogInformation($"[{summary}] 로그 추가");
return Ok(APIResponse.Send("000", "정상, push 삭제 완료", Empty));
}
return Ok(APIResponse.Send("001", "push 삭제 실패", Empty));
return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty));
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError($"{ex}"); _logger.LogError($"[{summary}] : {ex.Message}");
return BadRequest(APIResponse.UnknownError()); return BadRequest(APIResponse.UnknownError(ex.Message));
} }
} }
[HttpDelete("delete/list")]
[CustomOperation("사용자 푸시 목록 삭제", "사용자가 받은 푸시목록에서 푸시를 삭제한다..", "푸시")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))]
public async Task<IActionResult> DeleteListPush(string token, string refresh, int id)
{
string uid = "";
string summary = String.Empty;
try
{
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;
}
summary = _repositoryService.ReadSummary(typeof(PushController), "DeleteListPush");
var cabinetPush = await _dbContext.PushCabinet.FirstOrDefaultAsync(c => c.id == id);
if (cabinetPush == null) return Ok(APIResponse.Send("001", $"[{summary}], 삭제 할 PUSH 없음", Empty));
if (!await _repositoryService.DeleteData<PushCabinet>(cabinetPush))
return Ok(APIResponse.Send("002", $"[{summary}], PUSH 삭제 실패", Empty));
// // 로그를 이제 만들어서 추가를 해야 합니다.
var logPush = new LogPush
{
bid = cabinetPush.bid,
pid = cabinetPush.pid,
create_uid = uid,
create_date = DateTime.Now,
log = $"[{summary}] : {cabinetPush.pid} 삭제 - {uid}"
};
if (await _repositoryService.SaveData<LogPush>(logPush)) _logger.LogInformation($"[{summary}] : 로그 추가");
return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty));
}
catch (Exception ex)
{
_logger.LogError($"[{summary}] : {ex.Message}");
return BadRequest(APIResponse.UnknownError(ex.Message));
}
}
[HttpPost("list")]
[CustomOperation("사용자 푸시 목록 조회", "해당 사용자가 받은 푸시의 정보를 조회한다.", "푸시")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus<object>))]
public async Task<IActionResult> SearchToUserPush(string token, string refresh, int size, [FromBody] PushCabinet? request)
{
string uid = "";
string summary = String.Empty;
try
{
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;
}
summary = _repositoryService.ReadSummary(typeof(PushController), "SearchToUserPush");
if (request == null)
{
var pagedData = await _dbContext.PushCabinet.Where(c => c.uid == uid)
.OrderBy(c=> c.send_date)
.Take(size)
.ToListAsync();
return Ok(APIResponse.Send("000", $"[{summary}], 정상", pagedData));
}
else
{
var sort = await _dbContext.PushCabinet.Where(p=> p.id == request.id)
.Select(p => p.send_date).FirstOrDefaultAsync();
var query = _dbContext.PushCabinet.OrderBy(c => c.send_date).AsQueryable();
query = query.Where(c => c.send_date > sort);
var pagedData = await query.Take(size).ToListAsync();
return Ok(APIResponse.Send("000", $"[{summary}], 정상", pagedData));
}
}
catch (Exception ex)
{
_logger.LogError($"[{summary}] : {ex.Message}");
return BadRequest(APIResponse.UnknownError(ex.Message));
}
}
}// END PUSH CONTROLLER }// END PUSH CONTROLLER

View File

@ -18,6 +18,9 @@ using AcaMate.V1.Services;
namespace AcaMate.V1.Controllers; namespace AcaMate.V1.Controllers;
/// <summary>
/// USER는 사용자가 자신의 데이터를 보거나 만들거나 하는 등 직접 사용하는 경우에 사용
/// </summary>
[ApiController] [ApiController]
[Route("/api/v1/in/user")] [Route("/api/v1/in/user")]
[ApiExplorerSettings(GroupName = "사용자")] [ApiExplorerSettings(GroupName = "사용자")]
@ -28,7 +31,8 @@ public class UserController : ControllerBase
private readonly JwtTokenService _jwtTokenService; private readonly JwtTokenService _jwtTokenService;
private readonly IRepositoryService _repositoryService; private readonly IRepositoryService _repositoryService;
public UserController(AppDbContext dbContext, ILogger<UserController> logger, JwtTokenService jwtTokenService, IRepositoryService repositoryService) public UserController(AppDbContext dbContext, ILogger<UserController> logger, JwtTokenService jwtTokenService,
IRepositoryService repositoryService)
{ {
_dbContext = dbContext; _dbContext = dbContext;
_logger = logger; _logger = logger;
@ -37,51 +41,95 @@ public class UserController : ControllerBase
} }
[HttpGet] [HttpGet]
[CustomOperation("회원 정보 조회", "회원 정보 조회", "사용자")] [CustomOperation("회원 정보 조회", "회원 정보 조회 (자기자신)", "사용자")]
public async Task<IActionResult> GetUserData(string token, string refresh) public async Task<IActionResult> GetUserData(string token, string refresh)
{ {
if(string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh))
return BadRequest(APIResponse.InvalidInputError()); return BadRequest(APIResponse.InvalidInputError());
if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
string summary = String.Empty;
try try
{ {
var validateToken = await _repositoryService.ValidateToken(token, refresh); var validateToken = await _repositoryService.ValidateToken(token, refresh);
summary = _repositoryService.ReadSummary(typeof(UserController), "GetUserData");
var user = await _dbContext.User
.Where(u => u.uid == validateToken.uid)
.Select(u => new User
{
uid = u.uid,
name = u.name,
auto_login_yn = u.auto_login_yn,
birth = u.birth,
device_id = u.device_id,
login_date = u.login_date,
type = u.type
})
.FirstOrDefaultAsync();
// _logger.LogInformation($"CHECK!! {user.}");
return Ok(APIResponse.Send("000", "정상", user)); var user = await _dbContext.User
.Where(u => u.uid == validateToken.uid)
.Select(u => new User
{
uid = u.uid,
name = u.name,
auto_login_yn = u.auto_login_yn,
birth = u.birth,
device_id = u.device_id,
login_date = u.login_date,
type = u.type
})
.FirstOrDefaultAsync();
return Ok(APIResponse.Send("000", $"[{summary}], 정상", user));
} }
catch (TokenException tokenEx) catch (TokenException tokenEx)
{ {
_logger.LogInformation($"[로그인] : {tokenEx}"); _logger.LogInformation($"[{summary}] : {tokenEx}");
return Ok(APIResponse.Send("001", "로그인 진행: 토큰에 문제가 있음",Empty)); return Ok(APIResponse.Send("001", $"[{summary}], 토큰에 문제가 있음", Empty));
} }
catch (RefreshRevokeException refreshEx) catch (RefreshRevokeException refreshEx)
{ {
_logger.LogInformation($"[로그인] : {refreshEx}"); _logger.LogInformation($"[{summary}] : {refreshEx}");
return Ok(APIResponse.Send("001", "로그인 진행: 리프레시 토큰 폐기",Empty)); return Ok(APIResponse.Send("001", $"[{summary}], 폐기된 리프레시 토큰", Empty));
} }
catch (Exception ex) 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(UserController), "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")] [HttpGet("login")]
[CustomOperation("SNS 로그인", "로그인 후 회원이 있는지 확인", "사용자")] [CustomOperation("SNS 로그인", "로그인 후 회원이 있는지 확인", "사용자")]
public async Task<IActionResult> Login(string acctype, string sns_id) public async Task<IActionResult> Login(string acctype, string sns_id)
@ -89,103 +137,70 @@ public class UserController : ControllerBase
// API 동작 파라미터 입력 값 확인 // API 동작 파라미터 입력 값 확인
if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(sns_id)) if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(sns_id))
return BadRequest(APIResponse.InvalidInputError()); return BadRequest(APIResponse.InvalidInputError());
if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
string summary = String.Empty;
try try
{ {
summary = _repositoryService.ReadSummary(typeof(UserController), "Login");
var login = await _dbContext.Login var login = await _dbContext.Login
.FirstOrDefaultAsync(l => l.sns_type == acctype && l.sns_id == sns_id); .FirstOrDefaultAsync(l => l.sns_type == acctype && l.sns_id == sns_id);
if (login != null) if (login != null)
{ {
// 로그인 정보가 존재 하는 상황 // 로그인 정보가 존재 하는 상황
var uid = login.uid;
var user = await _dbContext.User var user = await _dbContext.User
.FirstOrDefaultAsync(u => u.uid == uid); .FirstOrDefaultAsync(u => u.uid == login.uid);
if (user != null) // 회원 정보 없음
if (user == null) return Ok(APIResponse.Send("002", $"[{summary}], 회원 정보 오류", Empty));
// 정상적으로 User 테이블에도 있는것이 확인 됨
user.login_date = DateTime.Now;
await _dbContext.SaveChangesAsync();
// 토큰 생성은 로그인이 이제 되고 나서 한다.
var accessToken = _jwtTokenService.GenerateJwtToken(login.uid);
var refreshToken = _jwtTokenService.GenerateRefreshToken(login.uid);
_logger.LogInformation($"[{summary}] : {login.uid} = {accessToken}, {refreshToken}");
if (await _repositoryService.SaveData<RefreshToken>(refreshToken))
{ {
// 정상적으로 User 테이블에도 있는것이 확인 됨 var logUser = new LogUser
user.login_date = DateTime.Now;
await _dbContext.SaveChangesAsync();
// 토큰 생성은 로그인이 이제 되고 나서 한다.
var accessToken = _jwtTokenService.GenerateJwtToken(uid);//, "Normal");
var refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
_logger.LogInformation($"{uid}: {accessToken}, {refreshToken}");
// await _repositoryService.SaveData<RefreshToken, string>(refreshToken, rt => rt.uid);
await _repositoryService.SaveData<RefreshToken>(refreshToken);
return Ok(APIResponse.Send("000","정상", new
{ {
token = accessToken, uid = login.uid,
refresh = refreshToken.refresh_token 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 }));
} }
} else
// case 1: Login 테이블에 값이 없다 == 로그인이 처음
// case 2: User 테이블에 값이 없다 == 이건 문제가 있는 상황 -> 해결은 회원가입 재 진행 시도
// Login에는 있는데 User 테이블에 없다? 말이 안되긴 하는데...
return Ok(APIResponse.Send("001", "회원가입 진행: 로그인 정보가 없음",Empty));
}
catch (Exception ex)
{
_logger.LogInformation($"[로그인][에러] : {ex}");
return StatusCode(500, APIResponse.UnknownError());
}
}
[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, var logUser = new LogUser
name = a.business_name {
}) uid = login.uid,
.ToListAsync(); create_date = DateTime.Now,
create_uid = "System",
return Ok(APIResponse.Send("000","정상.",academies)); log = $"[{summary}] : 실패"
} };
catch (TokenException tokenEx) await _repositoryService.SaveData<LogUser>(logUser);
{
_logger.LogInformation($"[로그인] : {tokenEx}"); return Ok(APIResponse.InternalSeverError($"[{summary}], 로그인 저장 실패"));
return Ok(APIResponse.Send("001", "[로그인] : 토큰에 문제가 있음",Empty)); }
}
catch (RefreshRevokeException refreshEx) }
{
_logger.LogInformation($"[로그인] : {refreshEx}"); return Ok(APIResponse.Send("001", $"[{summary}], 로그인 정보 없음", Empty));
return Ok(APIResponse.Send("001", "[로그인] : 폐기된 리프레시 토큰",Empty));
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogInformation($"[로그인][에러] : {ex}"); _logger.LogInformation($"[{summary}] : {ex}");
return StatusCode(500, APIResponse.UnknownError()); return StatusCode(500, APIResponse.UnknownError(ex.Message));
} }
} }
[HttpPost("register")] [HttpPost("register")]
@ -193,112 +208,261 @@ public class UserController : ControllerBase
public async Task<IActionResult> UserRegister([FromBody] UserAll request) 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);
var uid = $"AM{localPartEmail}{DateTime.Now:yyyyMMdd}";
var user = new User
{
uid = uid,
name = request.name,
birth = request.birth,
type = request.type,
device_id = request.device_id,
auto_login_yn = request.auto_login_yn,
login_date = request.login_date,
push_token = request.push_token
};
var login = new Login
{
uid = uid,
sns_id = request.sns_id,
sns_type = request.sns_type
};
var permission = new Permission try
{ {
uid = uid, summary = _repositoryService.ReadSummary(typeof(UserController), "UserRegister");
location_yn = request.location_yn, var localPartEmail = request.email.Substring(0, request.email.IndexOf('@'));
camera_yn = request.camera_yn, var uid = $"AM{localPartEmail}{DateTime.Now:yyyyMMdd}";
photo_yn = request.photo_yn,
push_yn = request.push_yn,
market_app_yn = request.market_app_yn,
market_sms_yn = request.market_sms_yn,
market_email_yn = request.market_email_yn
};
var contact = new Contact var user = new User
{ {
uid = uid, uid = uid,
email = request.email, name = request.name,
phone = request.phone, birth = request.birth,
address = request.address type = request.type,
}; device_id = request.device_id,
auto_login_yn = request.auto_login_yn,
login_date = request.login_date,
push_token = request.push_token
};
var login = new Login
{
uid = uid,
sns_id = request.sns_id,
sns_type = request.sns_type
};
var permission = new Permission
if (await _repositoryService.SaveData<User>(user)) {
{ uid = uid,
await _repositoryService.SaveData<Login>(login); location_yn = request.location_yn,
await _repositoryService.SaveData<Permission>(permission); camera_yn = request.camera_yn,
await _repositoryService.SaveData<Contact>(contact); photo_yn = request.photo_yn,
push_yn = request.push_yn,
market_app_yn = request.market_app_yn,
market_sms_yn = request.market_sms_yn,
market_email_yn = request.market_email_yn
};
var contact = new Contact
{
uid = uid,
email = request.email,
phone = request.phone,
address = request.address
};
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)
{
var token = _jwtTokenService.GenerateJwtToken(uid);
var refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
if (await _repositoryService.SaveData<RefreshToken>(refreshToken))
{
logUser.log = $"[{summary}] : 정상";
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)
// TO-DO: jwt 토큰 만들어서 여기서 보내는 작업을 해야 함
var token = _jwtTokenService.GenerateJwtToken(uid);
var refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
await _repositoryService.SaveData<RefreshToken>(refreshToken);
return Ok(APIResponse.Send("000","정상",new
{ {
accessToken = token, _logger.LogInformation($"[{summary}] : {ex.Message}");
refreshToken = refreshToken.refresh_token return BadRequest(APIResponse.UnknownError(ex.Message));
})); }
} }
[HttpGet("logout")] [HttpGet("logout")]
[CustomOperation("로그아웃", "사용자 로그아웃", "사용자")] [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 (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh))
return BadRequest(APIResponse.InvalidInputError());
if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
string summary = String.Empty;
try try
{ {
summary = _repositoryService.ReadSummary(typeof(UserController), "UserRegister");
// 여기서 애초에 토큰 관련 에러가 2개가 나오게 만들어져 있음
var validateToken = await _repositoryService.ValidateToken(token, refresh); var validateToken = await _repositoryService.ValidateToken(token, refresh);
var refreshToken = await _dbContext.RefreshTokens.FirstOrDefaultAsync(r => r.uid == validateToken.uid); var refreshToken = await _dbContext.RefreshTokens.FirstOrDefaultAsync(r => r.uid == validateToken.uid);
if (refreshToken != null) if (refreshToken != null)
{ {
refreshToken.revoke_Date = DateTime.Now; refreshToken.revoke_Date = DateTime.Now;
await _repositoryService.SaveData<RefreshToken>(refreshToken); await _repositoryService.SaveData<RefreshToken>(refreshToken);
return Ok(APIResponse.Send("000", "로그아웃 정상", Empty)); return Ok(APIResponse.Send("000", $"[{summary}], 로그아웃 정상", Empty));
}
else
{
return Ok(APIResponse.Send("000", "로그아웃 정상", Empty));
} }
// 리프레시 토큰이 없다?? 그럼 이거 무조건 문제지 (이유를 알 수 없는)
return Ok(APIResponse.UnknownError());
} }
catch (TokenException tokenEx) catch (TokenException tokenEx)
{ {
return Ok(APIResponse.Send("101", "입력 받은 토큰의 문제", Empty)); return Ok(APIResponse.Send("101", $"[{summary}], 입력 받은 토큰의 문제", Empty));
} }
catch (RefreshRevokeException refreshEx) catch (RefreshRevokeException refreshEx)
{ {
return Ok(APIResponse.Send("102", "폐기된 리프레시 토큰", Empty)); return Ok(APIResponse.Send("102", $"[{summary}], 폐기된 리프레시 토큰", Empty));
} }
catch (Exception ex) catch (Exception ex)
{ {
return StatusCode(500, APIResponse.UnknownError()); return StatusCode(500, APIResponse.UnknownError($"[{summary}], {ex.Message}"));
} }
} }
// [HttpGet("set")]
[HttpGet("cancel")]
[CustomOperation("회원 탈퇴", "사용자 탈퇴", "사용자")]
public async Task<IActionResult> Cancel(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(UserController), "Cancel");
// 여기서 애초에 토큰 관련 에러가 2개가 나오게 만들어져 있음
var validateToken = await _repositoryService.ValidateToken(token, refresh);
var user = await _dbContext.User.FirstOrDefaultAsync(u => u.uid == validateToken.uid);
if (user == null)
return Ok(APIResponse.Send("001", $"[{summary}], 회원 정보 확인 오류", Empty));
} var logUser = new LogUser
{
uid = validateToken.uid,
create_date = DateTime.Now,
create_uid = "System",
log = ""
};
string returnCode = "000";
string returnMsg = $"[{summary}], 정상";
if (await _repositoryService.DeleteData<User>(user))
logUser.log = $"[{summary}] : 정상";
else
{
logUser.log = $"[{summary}] : 실패";
returnMsg = $"[{summary}], 실패";
returnCode = "001";
}
if (!(await _repositoryService.SaveData<LogUser>(logUser)))
_logger.LogError($"[{summary}] : 로그 저장 실패");
return Ok(APIResponse.Send(returnCode, returnMsg, Empty));
}
catch (TokenException tokenEx)
{
return Ok(APIResponse.Send("101", $"[{summary}], 입력 받은 토큰의 문제", Empty));
}
catch (RefreshRevokeException refreshEx)
{
return Ok(APIResponse.Send("102", $"[{summary}], 폐기된 리프레시 토큰", Empty));
}
catch (Exception ex)
{
return StatusCode(500, APIResponse.UnknownError($"[{summary}], {ex.Message}"));
}
}
}
// 근데 회원 정보를 변경하는게 뭐뭐를 변경해야 하는지 아직 정해진게 없어서 이건 일단 보류
/*
[HttpGet("set")]
[CustomOperation("회원 정보 변경", "회원 정보 변경", "사용자")]
public async Task<IActionResult> SetUserData(string token, string refresh) //, [FromBody])
{
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(UserController), "Cancel");
// 여기서 애초에 토큰 관련 에러가 2개가 나오게 만들어져 있음
var validateToken = await _repositoryService.ValidateToken(token, refresh);
var user = await _dbContext.User.FirstOrDefaultAsync(u => u.uid == validateToken.uid);
}
catch (TokenException tokenEx)
{
return Ok(APIResponse.Send("101", $"[{summary}], 입력 받은 토큰의 문제", Empty));
}
catch (RefreshRevokeException refreshEx)
{
return Ok(APIResponse.Send("102", $"[{summary}], 폐기된 리프레시 토큰", Empty));
}
catch (Exception ex)
{
return StatusCode(500, APIResponse.UnknownError($"[{summary}], {ex.Message}"));
}
}
}
/*
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");
}
*/

View File

@ -14,8 +14,18 @@ public class LogPush
public string bid {get; set;} public string bid {get; set;}
public string pid {get; set;} public string pid {get; set;}
public DateTime create_date {get; set;} public DateTime create_date {get; set;}
public DateTime? update_date {get; set;}
public string create_uid {get; set;} public string create_uid {get; set;}
public string? update_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; } public string log { get; set; }
} }

View File

@ -89,11 +89,14 @@ public class DBPayload
[Table("push_cabinet")] [Table("push_cabinet")]
public class PushCabinet public class PushCabinet
{ {
[Key]
public int id { get; set; }
public string uid { get; set; } public string uid { get; set; }
public string pid { get; set; } public string pid { get; set; }
public string bid { get; set; } public string bid { get; set; }
public DateTime send_date { get; set; } public DateTime send_date { get; set; }
public bool check_yn { get; set; } public bool check_yn { get; set; }
public string? content {get; set;}
} }
public class PushRequest public class PushRequest
@ -101,6 +104,8 @@ public class PushRequest
public string bid { get; set; } public string bid { get; set; }
public List<string> uids { get; set; } public List<string> uids { get; set; }
public string pid { get; set; } public string pid { get; set; }
public string? content { get; set; }
} }