From d8c16fee2957719a6034fc1c24d031f5699e1b15 Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Mon, 10 Mar 2025 09:44:32 +0900 Subject: [PATCH 01/12] =?UTF-8?q?[=F0=9F=93=9D]=2025.03.10=20TO-DO=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Diary/25.03.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Diary/25.03.md b/Diary/25.03.md index 709dc8b..4d8d74d 100644 --- a/Diary/25.03.md +++ b/Diary/25.03.md @@ -25,4 +25,13 @@ ### 4. DB 저장 & 삭제 로직 변경하기 1. [X] 저장 로직 통일하기 -2. [X] 삭제 로직 통일하기 \ No newline at end of file +2. [X] 삭제 로직 통일하기 + +--- +## 10일(월) +### 1. PUSH API 만들기 +1. [ ] 사용자가 받은 전체 푸시 확인 [./push/list] + +### 2. log 기록 남게 만들기 +1. [ ] 유저 관련 테이블들 로그 기록 만들기 +2. [ ] 푸시 관련 테이블들 로그 기록 만들기 \ No newline at end of file -- 2.45.1 From af0d5e21c1d7250f1ced1eed8d3e872d6dd2d6ef Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Mon, 10 Mar 2025 15:07:18 +0900 Subject: [PATCH 02/12] =?UTF-8?q?[=F0=9F=93=9D]=2025.03.10=20TO-DO=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Diary/25.03.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Diary/25.03.md b/Diary/25.03.md index 4d8d74d..b6b4a97 100644 --- a/Diary/25.03.md +++ b/Diary/25.03.md @@ -29,9 +29,13 @@ --- ## 10일(월) -### 1. PUSH API 만들기 -1. [ ] 사용자가 받은 전체 푸시 확인 [./push/list] +### 1. ~~PUSH API 만들기~~ +1. ~~[ ] 사용자가 받은 전체 푸시 확인 [./push/list]~~ ### 2. log 기록 남게 만들기 1. [ ] 유저 관련 테이블들 로그 기록 만들기 -2. [ ] 푸시 관련 테이블들 로그 기록 만들기 \ No newline at end of file +2. [X] 푸시 관련 테이블들 로그 기록 만들기 + +### 3. PUSH API 로직 변경 +1. [ ] 전송 로직 변경 +2. [ ] 케비닛 저장 로직 변경 \ No newline at end of file -- 2.45.1 From 9acda11556ccac506ccf68cc626761cef12b585b Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Mon, 10 Mar 2025 15:50:41 +0900 Subject: [PATCH 03/12] =?UTF-8?q?[=E2=99=BB=EF=B8=8F]=20=ED=91=B8=EC=8B=9C?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A0=80=EC=9E=A5=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B3=80=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20PUSH=20API=20=EB=B3=80=EA=B2=BD:=20send?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program/V1/Controllers/PushController.cs | 146 +++++++++++++++++------ Program/V1/Models/PushPayload.cs | 5 + 2 files changed, 112 insertions(+), 39 deletions(-) diff --git a/Program/V1/Controllers/PushController.cs b/Program/V1/Controllers/PushController.cs index 78f3562..3a348d2 100644 --- a/Program/V1/Controllers/PushController.cs +++ b/Program/V1/Controllers/PushController.cs @@ -81,18 +81,6 @@ public class PushController : ControllerBase } - - - - /// - /// Sends a push notification to the specified device token with the provided payload. - /// - /// - /// An IActionResult indicating the result of the operation. - /// Push notification sent successfully. - /// Invalid input parameters. - /// Internal server error occurred. - /// Service unavailable. [HttpPost("send")] [CustomOperation("푸시 발송", "저장된 양식으로, 사용자에게 푸시를 송신한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] @@ -115,7 +103,7 @@ public class PushController : ControllerBase }, pid = pushRequest.pid, bid = pushRequest.bid, - content = p.content ?? "", + content = pushRequest.content ?? (p.content ?? ""), }) .FirstOrDefaultAsync(); @@ -123,19 +111,20 @@ public class PushController : ControllerBase { foreach (var uid in pushRequest.uids) { + // 학원 내부에 해당 uid의 일원이 존재하는지 확인 if ( await _dbContext.UserAcademy .Where(ua => ua.uid == uid && ua.bid == pushRequest.bid) .AnyAsync() ) { + // 유저한테 온 모든 푸시에 대해서 안 읽은 것에 대한 뱃지 갯수 확인 var badge = await _dbContext.PushCabinet .Where(c => c.uid == uid - && c.bid == pushRequest.bid - && c.pid != pushRequest.pid && c.check_yn == false) .CountAsync(); + // 푸시를 보내야 하니 푸시 토큰 확인 var pushToken = await _dbContext.User .Where(u => u.uid == uid) .Select(u => u.push_token) @@ -147,6 +136,7 @@ public class PushController : ControllerBase bid = pushRequest.bid, pid = pushRequest.pid, send_date = DateTime.Now, + content = pushRequest.content ?? null, }; if (payload != null) payload.aps.badge = badge + 1; @@ -156,11 +146,38 @@ public class PushController : ControllerBase pushToken = pushToken, payload = payload ?? throw new PushInvalidException("payload is NULL") }; - await _repositoryService.SaveData(pushCabinet); + + if (await _repositoryService.SaveData(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)) + _logger.LogInformation($"[{summary}] : 로그 추가"); + } _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)) + _logger.LogInformation($"[{summary}] : 로그 추가"); + } + } }); @@ -291,13 +308,14 @@ public class PushController : ControllerBase } - + [HttpDelete("delete")] [CustomOperation("푸시 삭제", "저장된 푸시 양식을 삭제 한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] public async Task DeletePush(string token, string refresh, string bid, string pid) { 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); @@ -309,36 +327,86 @@ public class PushController : ControllerBase { summary = _repositoryService.ReadSummary(typeof(PushController), "DeletePush"); - var payload = await _dbContext.DBPayload.FirstOrDefaultAsync(p => p.bid == bid && p.pid == pid); - if (await _repositoryService.DeleteData(payload)) - { - // 로그를 이제 만들어서 추가를 해야 합니다. - var logPush = new LogPush - { - bid = bid, - pid = pid, - create_uid = uid, - create_date = DateTime.Now, - log = $"[{summary}] {pid} 삭제 - {uid}" - }; - - // 로그를 이제 만들어서 추가를 해야 합니다. - if (await _repositoryService.SaveData(logPush)) - _logger.LogInformation($"[{summary}] 로그 추가"); + if (payload == null) + return Ok(APIResponse.Send("001", $"[{summary}], 삭제 할 PUSH 없음", Empty)); - return Ok(APIResponse.Send("000", "정상, push 삭제 완료", Empty)); - } - return Ok(APIResponse.Send("001", "push 삭제 실패", Empty)); + if (!await _repositoryService.DeleteData(payload)) + return Ok(APIResponse.Send("002", $"[{summary}], PUSH 삭제 실패", Empty)); + + // 로그를 이제 만들어서 추가를 해야 합니다. + var logPush = new LogPush + { + bid = bid, + pid = pid, + create_uid = uid, + create_date = DateTime.Now, + log = $"[{summary}] : {pid} 삭제 - {uid}" + }; + + // 로그를 이제 만들어서 추가를 해야 합니다. + if (await _repositoryService.SaveData(logPush)) _logger.LogInformation($"[{summary}] : 로그 추가"); + + return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty)); } + /* + */ + catch (Exception ex) { - _logger.LogError($"{ex}"); + _logger.LogError($"[{summary}] : {ex.Message}"); return BadRequest(APIResponse.UnknownError()); } } - + + [HttpGet("list")] + [CustomOperation("사용자 푸시 목록 조회", "해당 사용자가 받은 푸시의 정보를 조회한다.", "푸시")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] + public async Task SearchToUserPush(string token, string refresh, string? pid) + { + 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); + var uid = validateToken.uid; + + string summary = String.Empty; + + try + { + summary = _repositoryService.ReadSummary(typeof(PushController), "SearchToUserPush"); + if (pid == null) + { + var cabinet = await _dbContext.PushCabinet.Where(c => c.uid == uid).ToListAsync(); + } + else + { + int pageSize = 5; + var sort = await _dbContext.PushCabinet.Where(p=> p.pid == pid).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(pageSize).ToListAsync(); + + foreach (var p in pagedData) + { + _logger.LogInformation($"[{summary}] : {p.pid}"); + } + } + + + + return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty)); + } + catch (Exception ex) + { + _logger.LogError($"[{summary}] : {ex.Message}"); + return BadRequest(APIResponse.UnknownError()); + } + } + + }// END PUSH CONTROLLER diff --git a/Program/V1/Models/PushPayload.cs b/Program/V1/Models/PushPayload.cs index 06a378f..6ee16e1 100644 --- a/Program/V1/Models/PushPayload.cs +++ b/Program/V1/Models/PushPayload.cs @@ -89,11 +89,14 @@ public class DBPayload [Table("push_cabinet")] public class PushCabinet { + [Key] + public int id { get; set; } public string uid { get; set; } public string pid { get; set; } public string bid { get; set; } public DateTime send_date { get; set; } public bool check_yn { get; set; } + public string? content {get; set;} } public class PushRequest @@ -101,6 +104,8 @@ public class PushRequest public string bid { get; set; } public List uids { get; set; } public string pid { get; set; } + + public string? content { get; set; } } -- 2.45.1 From 012e7231db54fbb92325cc3bc6e34cbe84741171 Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Mon, 10 Mar 2025 15:53:09 +0900 Subject: [PATCH 04/12] =?UTF-8?q?[=F0=9F=91=B7]=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC=20=EB=B0=8F=20swagger=20=EC=84=A4=EB=AA=85?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program/V1/Controllers/PushController.cs | 97 ++++++++++-------------- 1 file changed, 40 insertions(+), 57 deletions(-) diff --git a/Program/V1/Controllers/PushController.cs b/Program/V1/Controllers/PushController.cs index 3a348d2..91ec2b8 100644 --- a/Program/V1/Controllers/PushController.cs +++ b/Program/V1/Controllers/PushController.cs @@ -33,49 +33,35 @@ public class PushController : ControllerBase [HttpGet()] [CustomOperation("푸시 확인", "저장된 양식을 확인 할 수 있다.", "푸시")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] public async Task GetPush(string bid, string? pid, string? category) { - if (!(await _dbContext.Academy.AnyAsync(a=>a.bid == bid))) - return Ok(APIResponse.Send("100", "존재하지 않는 BID", Empty)); - - List pushData = new List(); - - 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(); - } + string summary = String.Empty; 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 pushData = new List(); + 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) { - 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) { - _logger.LogError($"[푸시] {ex.Message}"); + _logger.LogError($"[{summary}] : {ex.Message}"); return StatusCode(500, APIResponse.UnknownError()); } } @@ -180,33 +166,30 @@ public class PushController : ControllerBase } }); - - return Ok(APIResponse.Send("000", "정상", Empty)); - + return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty)); } catch (PushInvalidException ex) { - _logger.LogError(ex.Message); - return Ok(APIResponse.Send("001", $"[{summary}]: 푸시 송신 중 문제 발생",Empty)); + _logger.LogError($"[{summary}] : {ex.Message}"); + return Ok(APIResponse.Send("001", $"[{summary}], 푸시 송신 중 문제 발생",Empty)); } catch (Exception ex) { - _logger.LogError($"[푸시] {ex.Message}"); + _logger.LogError($"[{summary}] : {ex.Message}"); return StatusCode(500, APIResponse.UnknownError()); } } [HttpPost("set")] - [CustomOperation("[푸시 변경]", "저장된 양식을 변경한다.", "푸시")] + [CustomOperation("푸시 변경", "저장된 양식을 변경한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] public async Task SetPush([FromBody] DBPayload request) { - - if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); - try - { + string summary = String.Empty; + try { + summary = _repositoryService.ReadSummary(typeof(PushController), "SetPush"); var dbPayload = await _dbContext.DBPayload .FirstOrDefaultAsync(p => p.pid == request.pid && p.bid == request.bid); @@ -218,16 +201,16 @@ public class PushController : ControllerBase 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.content != request.content) dbPayload.content = request.content; - // if (await _repositoryService.SaveData(dbPayload, p => p.pid)) if (await _repositoryService.SaveData(dbPayload)) - return Ok(APIResponse.Send("000", "[푸시 변경] : PUSH 정보 변경 완료", Empty)); + return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty)); + // TODO - 로그 추가 } - return Ok(APIResponse.Send("100", "PID, BID 또는 Cabinet 오류", Empty)); + return Ok(APIResponse.Send("100", $"[{summary}], PID, BID 또는 Cabinet 오류", Empty)); } catch (Exception ex) { - _logger.LogError($"[푸시] {ex.Message}"); + _logger.LogError($"[{summary}] : {ex.Message}"); return StatusCode(500, APIResponse.UnknownError()); } } @@ -277,32 +260,32 @@ public class PushController : ControllerBase pid = payload.pid, create_uid = uid, create_date = DateTime.Now, - log = $"[{summary}] {payload.pid} 최초 생성 - {uid}" + log = $"[{summary}] : {payload.pid} 최초 생성 - {uid}" }; // 로그를 이제 만들어서 추가를 해야 합니다. if (await _repositoryService.SaveData(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) { - _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) { - _logger.LogError($"[푸시] {ex.Message}"); + _logger.LogError($"[{summary}] : {ex.Message}"); return StatusCode(500, APIResponse.UnknownError()); } } -- 2.45.1 From e6672ed630090c5dcd355ffaf61f3baf89d2829b Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Mon, 10 Mar 2025 16:48:29 +0900 Subject: [PATCH 05/12] =?UTF-8?q?[=E2=9C=A8]=20=ED=91=B8=EC=8B=9C=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=ED=99=95=EC=9D=B8=20=EB=B0=8F=20?= =?UTF-8?q?=ED=91=B8=EC=8B=9C=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=82=B4=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=82=AD=EC=A0=9C,=20=EA=B7=B8?= =?UTF-8?q?=EC=99=B8=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program/Common/Data/AppDbContext.cs | 4 +- Program/V1/Controllers/PushController.cs | 171 ++++++++++++++++------- Program/V1/Models/Log.cs | 2 - 3 files changed, 124 insertions(+), 53 deletions(-) diff --git a/Program/Common/Data/AppDbContext.cs b/Program/Common/Data/AppDbContext.cs index 68ddc60..01efaa5 100644 --- a/Program/Common/Data/AppDbContext.cs +++ b/Program/Common/Data/AppDbContext.cs @@ -40,8 +40,8 @@ public class AppDbContext: DbContext modelBuilder.Entity() .HasKey(ua => new { ua.uid, ua.bid }); - modelBuilder.Entity() - .HasKey(c => new { c.uid, c.bid, c.pid }); + // modelBuilder.Entity() + // .HasKey(c => new { c.uid, c.bid, c.pid }); modelBuilder.Entity() .HasKey(p => new { p.bid, p.pid }); diff --git a/Program/V1/Controllers/PushController.cs b/Program/V1/Controllers/PushController.cs index 91ec2b8..db88fd2 100644 --- a/Program/V1/Controllers/PushController.cs +++ b/Program/V1/Controllers/PushController.cs @@ -95,6 +95,9 @@ public class PushController : ControllerBase await Task.Run(async () => { + if (payload == null) + throw new PushInvalidException("payload is NULL"); + foreach (var uid in pushRequest.uids) { // 학원 내부에 해당 uid의 일원이 존재하는지 확인 @@ -109,6 +112,7 @@ public class PushController : ControllerBase .Where(c => c.uid == uid && c.check_yn == false) .CountAsync(); + payload.aps.badge = badge + 1; // 푸시를 보내야 하니 푸시 토큰 확인 var pushToken = await _dbContext.User @@ -122,15 +126,13 @@ public class PushController : ControllerBase bid = pushRequest.bid, pid = pushRequest.pid, send_date = DateTime.Now, - content = pushRequest.content ?? null, + content = payload.content != "" ? payload.content : null, }; - if (payload != null) payload.aps.badge = badge + 1; - var pushData = new PushData { pushToken = pushToken, - payload = payload ?? throw new PushInvalidException("payload is NULL") + payload = payload }; if (await _repositoryService.SaveData(pushCabinet)) @@ -183,9 +185,17 @@ public class PushController : ControllerBase [HttpPost("set")] [CustomOperation("푸시 변경", "저장된 양식을 변경한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] - public async Task SetPush([FromBody] DBPayload request) + public async Task SetPush(string token, string refresh, [FromBody] DBPayload request) { - if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); + 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 { @@ -193,8 +203,17 @@ public class PushController : ControllerBase var dbPayload = await _dbContext.DBPayload .FirstOrDefaultAsync(p => p.pid == request.pid && p.bid == request.bid); + 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.body != request.body && request.body != "") dbPayload.body = request.body; if (dbPayload.subtitle != request.subtitle) dbPayload.subtitle = request.subtitle; @@ -202,8 +221,14 @@ public class PushController : ControllerBase if (dbPayload.category != request.category && request.category != "") dbPayload.category = request.category; if (dbPayload.content != request.content) dbPayload.content = request.content; if (await _repositoryService.SaveData(dbPayload)) + { + logPush.log = $"[{summary} : 정상 변경"; return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty)); - // TODO - 로그 추가 + } + + // 로그를 이제 만들어서 추가를 해야 합니다. + if (await _repositoryService.SaveData(logPush)) + _logger.LogInformation($"[{summary}] : 로그 추가"); } return Ok(APIResponse.Send("100", $"[{summary}], PID, BID 또는 Cabinet 오류", Empty)); @@ -220,11 +245,15 @@ public class PushController : ControllerBase [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] public async Task CreatePush(string token, string refresh, [FromBody] CreatePush createPush) { - 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); - var uid = validateToken.uid; + 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; + } Func randomLetter = (letters, count) => new string(Enumerable.Range(0, count).Select(_ => letters[new Random().Next(letters.Length)]).ToArray()); var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; @@ -260,7 +289,7 @@ public class PushController : ControllerBase pid = payload.pid, create_uid = uid, create_date = DateTime.Now, - log = $"[{summary}] : {payload.pid} 최초 생성 - {uid}" + log = $"[{summary}] : 정상 생성" }; // 로그를 이제 만들어서 추가를 해야 합니다. @@ -297,12 +326,15 @@ public class PushController : ControllerBase [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] public async Task DeletePush(string token, string refresh, string bid, string pid) { - 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); - var uid = validateToken.uid; + 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; @@ -311,11 +343,8 @@ public class PushController : ControllerBase summary = _repositoryService.ReadSummary(typeof(PushController), "DeletePush"); var payload = await _dbContext.DBPayload.FirstOrDefaultAsync(p => p.bid == bid && p.pid == pid); - if (payload == null) - return Ok(APIResponse.Send("001", $"[{summary}], 삭제 할 PUSH 없음", Empty)); - - if (!await _repositoryService.DeleteData(payload)) - return Ok(APIResponse.Send("002", $"[{summary}], PUSH 삭제 실패", Empty)); + if (payload == null) return Ok(APIResponse.Send("001", $"[{summary}], 삭제 할 PUSH 없음", Empty)); + if (!await _repositoryService.DeleteData(payload)) return Ok(APIResponse.Send("002", $"[{summary}], PUSH 삭제 실패", Empty)); // 로그를 이제 만들어서 추가를 해야 합니다. var logPush = new LogPush @@ -331,11 +360,53 @@ public class PushController : ControllerBase if (await _repositoryService.SaveData(logPush)) _logger.LogInformation($"[{summary}] : 로그 추가"); return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty)); - } - /* - */ + catch (Exception ex) + { + _logger.LogError($"[{summary}] : {ex.Message}"); + return BadRequest(APIResponse.UnknownError()); + } + } + + + [HttpDelete("delete/list")] + [CustomOperation("사용자 푸시 목록 삭제", "사용자가 받은 푸시목록에서 푸시를 삭제한다..", "푸시")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] + public async Task DeleteListPush(string token, string refresh, int id) + { + 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), "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(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)) _logger.LogInformation($"[{summary}] : 로그 추가"); + + return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty)); + } catch (Exception ex) { _logger.LogError($"[{summary}] : {ex.Message}"); @@ -343,44 +414,46 @@ public class PushController : ControllerBase } } - [HttpGet("list")] + + + [HttpPost("list")] [CustomOperation("사용자 푸시 목록 조회", "해당 사용자가 받은 푸시의 정보를 조회한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] - public async Task SearchToUserPush(string token, string refresh, string? pid) + public async Task SearchToUserPush(string token, string refresh, int size, [FromBody] PushCabinet? pushData) { - 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); - var uid = validateToken.uid; + 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), "SearchToUserPush"); - if (pid == null) + if (pushData == null) { - var cabinet = await _dbContext.PushCabinet.Where(c => c.uid == uid).ToListAsync(); + 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 { - int pageSize = 5; - var sort = await _dbContext.PushCabinet.Where(p=> p.pid == pid).Select(p => p.send_date).FirstOrDefaultAsync(); + var sort = await _dbContext.PushCabinet.Where(p=> p.id == pushData.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(pageSize).ToListAsync(); - - foreach (var p in pagedData) - { - _logger.LogInformation($"[{summary}] : {p.pid}"); - } + var pagedData = await query.Take(size).ToListAsync(); + return Ok(APIResponse.Send("000", $"[{summary}], 정상", pagedData)); } - - - - return Ok(APIResponse.Send("000", $"[{summary}], 정상", Empty)); } catch (Exception ex) { diff --git a/Program/V1/Models/Log.cs b/Program/V1/Models/Log.cs index 58e538f..ca2b213 100644 --- a/Program/V1/Models/Log.cs +++ b/Program/V1/Models/Log.cs @@ -14,8 +14,6 @@ public class LogPush public string bid {get; set;} public string pid {get; set;} public DateTime create_date {get; set;} - public DateTime? update_date {get; set;} public string create_uid {get; set;} - public string? update_uid {get; set;} public string log { get; set; } } \ No newline at end of file -- 2.45.1 From a0beed0415f091fa121cfa989630bbc7b03b33e9 Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Mon, 10 Mar 2025 17:04:39 +0900 Subject: [PATCH 06/12] =?UTF-8?q?[=E2=99=BB=EF=B8=8F]=20=ED=91=B8=EC=8B=9C?= =?UTF-8?q?=20API=20=EB=82=B4=EC=9D=98=20=EB=B3=80=EC=88=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=ED=86=B5=EC=9D=BC=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program/V1/Controllers/PushController.cs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Program/V1/Controllers/PushController.cs b/Program/V1/Controllers/PushController.cs index db88fd2..467ca58 100644 --- a/Program/V1/Controllers/PushController.cs +++ b/Program/V1/Controllers/PushController.cs @@ -243,7 +243,7 @@ public class PushController : ControllerBase [HttpPost("create")] [CustomOperation("푸시 생성", "새로운 푸시 양식을 생성한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] - public async Task CreatePush(string token, string refresh, [FromBody] CreatePush createPush) + public async Task CreatePush(string token, string refresh, [FromBody] CreatePush request) { string uid = ""; if (token == "System") uid = "System"; @@ -267,18 +267,18 @@ public class PushController : ControllerBase try { 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 { - bid = createPush.bid, + bid = request.bid, pid = $"AP{DateTime.Now:yyyyMMdd}{frontLetters}{DateTime.Now:HHmmss}{afterLetters}", - title = createPush.title, - subtitle = createPush.subtitle, - body = createPush.body, - alert_yn = createPush.alert_yn, - category = createPush.category, - content = createPush.content, + title = request.title, + subtitle = request.subtitle, + body = request.body, + alert_yn = request.alert_yn, + category = request.category, + content = request.content, }; if (await _repositoryService.SaveData(payload)) @@ -419,7 +419,7 @@ public class PushController : ControllerBase [HttpPost("list")] [CustomOperation("사용자 푸시 목록 조회", "해당 사용자가 받은 푸시의 정보를 조회한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] - public async Task SearchToUserPush(string token, string refresh, int size, [FromBody] PushCabinet? pushData) + public async Task SearchToUserPush(string token, string refresh, int size, [FromBody] PushCabinet? request) { string uid = ""; if (token == "System") uid = "System"; @@ -436,7 +436,7 @@ public class PushController : ControllerBase try { summary = _repositoryService.ReadSummary(typeof(PushController), "SearchToUserPush"); - if (pushData == null) + if (request == null) { var pagedData = await _dbContext.PushCabinet.Where(c => c.uid == uid) .OrderBy(c=> c.send_date) @@ -447,7 +447,7 @@ public class PushController : ControllerBase } else { - var sort = await _dbContext.PushCabinet.Where(p=> p.id == pushData.id) + 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); -- 2.45.1 From 166fe3dd5de122be56698081913091698f9a75c2 Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Tue, 11 Mar 2025 08:59:52 +0900 Subject: [PATCH 07/12] =?UTF-8?q?[=F0=9F=93=9D]=2025.03.11=20TO-DO=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Diary/25.03.md | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Diary/25.03.md b/Diary/25.03.md index b6b4a97..6a47330 100644 --- a/Diary/25.03.md +++ b/Diary/25.03.md @@ -29,13 +29,30 @@ --- ## 10일(월) -### 1. ~~PUSH API 만들기~~ -1. ~~[ ] 사용자가 받은 전체 푸시 확인 [./push/list]~~ +### 1. PUSH API 만들기 +1. [X] 사용자가 받은 전체 푸시 확인 [./push/list] +2. [X] 사용자가 받은 푸시 목록 삭제 [./push/delete/list] ### 2. log 기록 남게 만들기 1. [ ] 유저 관련 테이블들 로그 기록 만들기 2. [X] 푸시 관련 테이블들 로그 기록 만들기 ### 3. PUSH API 로직 변경 -1. [ ] 전송 로직 변경 -2. [ ] 케비닛 저장 로직 변경 \ No newline at end of file +1. [X] 전송 로직 변경 +2. [X] 케비닛 저장 로직 변경 + +--- +## 11일(화) +### 1. USER API 점검 및 수정 +1. [ ] 회원 정보 조회 [./user] +2. [ ] 회원 가입 [./user/register] +3. [ ] 로그인 [./user/login] +4. [ ] 로그아웃 [./user/logout] +5. [ ] 학원 조회 [./user/academy] + +### 2. USER API 로그 기록 만들기 +1. [ ] 필요한 위치에 등록하기 + +### 3. USER API 만들기 +1. [ ] 회원 탈퇴 [./user/cancel] +2. [ ] 회원 정보 변경 [./user/set] -- 2.45.1 From d537ad7a25a5f852ed8ce14271d643db632186ba Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Tue, 11 Mar 2025 09:22:25 +0900 Subject: [PATCH 08/12] =?UTF-8?q?[=E2=99=BB=EF=B8=8F]=20=ED=91=B8=EC=8B=9C?= =?UTF-8?q?=20API=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program/V1/Controllers/PushController.cs | 107 ++++++++++++----------- 1 file changed, 54 insertions(+), 53 deletions(-) diff --git a/Program/V1/Controllers/PushController.cs b/Program/V1/Controllers/PushController.cs index 467ca58..6619f9c 100644 --- a/Program/V1/Controllers/PushController.cs +++ b/Program/V1/Controllers/PushController.cs @@ -37,6 +37,7 @@ public class PushController : ControllerBase public async Task GetPush(string bid, string? pid, string? category) { string summary = String.Empty; + try { summary = _repositoryService.ReadSummary(typeof(PushController), "GetPush"); @@ -178,7 +179,7 @@ public class PushController : ControllerBase catch (Exception ex) { _logger.LogError($"[{summary}] : {ex.Message}"); - return StatusCode(500, APIResponse.UnknownError()); + return StatusCode(500, APIResponse.UnknownError(ex.Message)); } } @@ -188,17 +189,19 @@ public class PushController : ControllerBase public async Task SetPush(string token, string refresh, [FromBody] DBPayload request) { 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 { + + 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), "SetPush"); var dbPayload = await _dbContext.DBPayload .FirstOrDefaultAsync(p => p.pid == request.pid && p.bid == request.bid); @@ -236,7 +239,7 @@ public class PushController : ControllerBase catch (Exception ex) { _logger.LogError($"[{summary}] : {ex.Message}"); - return StatusCode(500, APIResponse.UnknownError()); + return StatusCode(500, APIResponse.UnknownError(ex.Message)); } } @@ -246,25 +249,25 @@ public class PushController : ControllerBase public async Task CreatePush(string token, string refresh, [FromBody] CreatePush request) { 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; + Func randomLetter = (letters, count) => new string(Enumerable.Range(0, count).Select(_ => letters[new Random().Next(letters.Length)]).ToArray()); var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var digits = "0123456789"; var frontLetters = $"{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 { + + 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"); if (await _dbContext.Academy.AnyAsync(a => a.bid == request.bid)) @@ -327,19 +330,18 @@ public class PushController : ControllerBase public async Task DeletePush(string token, string refresh, string bid, string pid) { 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 { + 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"); var payload = await _dbContext.DBPayload.FirstOrDefaultAsync(p => p.bid == bid && p.pid == pid); @@ -364,7 +366,7 @@ public class PushController : ControllerBase catch (Exception ex) { _logger.LogError($"[{summary}] : {ex.Message}"); - return BadRequest(APIResponse.UnknownError()); + return BadRequest(APIResponse.UnknownError(ex.Message)); } } @@ -375,19 +377,18 @@ public class PushController : ControllerBase public async Task DeleteListPush(string token, string refresh, int id) { 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 { + 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)); @@ -410,7 +411,7 @@ public class PushController : ControllerBase catch (Exception ex) { _logger.LogError($"[{summary}] : {ex.Message}"); - return BadRequest(APIResponse.UnknownError()); + return BadRequest(APIResponse.UnknownError(ex.Message)); } } @@ -422,19 +423,19 @@ public class PushController : ControllerBase public async Task SearchToUserPush(string token, string refresh, int size, [FromBody] PushCabinet? request) { 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 { + 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) { @@ -458,7 +459,7 @@ public class PushController : ControllerBase catch (Exception ex) { _logger.LogError($"[{summary}] : {ex.Message}"); - return BadRequest(APIResponse.UnknownError()); + return BadRequest(APIResponse.UnknownError(ex.Message)); } } -- 2.45.1 From 19fb34bc32bc48d886a81c99974de3b515c0cefc Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Tue, 11 Mar 2025 11:14:51 +0900 Subject: [PATCH 09/12] =?UTF-8?q?[=E2=99=BB=EF=B8=8F]=20USER=20API=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=A0=90=EA=B2=80=20=EB=B0=8F=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program/Common/Data/AppDbContext.cs | 1 + Program/Common/Model/Status.cs | 82 +---- Program/V1/Controllers/UserController.cs | 393 +++++++++++++---------- Program/V1/Models/Log.cs | 12 + 4 files changed, 251 insertions(+), 237 deletions(-) diff --git a/Program/Common/Data/AppDbContext.cs b/Program/Common/Data/AppDbContext.cs index 01efaa5..dd2a32a 100644 --- a/Program/Common/Data/AppDbContext.cs +++ b/Program/Common/Data/AppDbContext.cs @@ -34,6 +34,7 @@ public class AppDbContext: DbContext //MARK: LOG public DbSet LogPush { get; set; } + public DbSet LogUser { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { diff --git a/Program/Common/Model/Status.cs b/Program/Common/Model/Status.cs index 6259732..25b8a3e 100644 --- a/Program/Common/Model/Status.cs +++ b/Program/Common/Model/Status.cs @@ -42,81 +42,23 @@ public static class APIResponse return Send("000", "정상", ""); } - public static APIResponseStatus InvalidInputError() + public static APIResponseStatus InvalidInputError(string? msg = null) { - return Send("100", "입력 값이 유효하지 않습니다.", ""); + return Send("100", msg ?? "입력 값이 유효하지 않습니다.", ""); } - public static APIResponseStatus NotFoundError() + public static APIResponseStatus NotFoundError(string? msg = null) { - return Send("200", "알맞은 값을 찾을 수 없습니다.", ""); + return Send("200", msg ?? "알맞은 값을 찾을 수 없습니다.", ""); + } + + public static APIResponseStatus InternalSeverError(string? msg = null) + { + return Send("300", msg ?? "통신에 오류가 발생하였습니다.", ""); } - public static APIResponseStatus InternalSeverError() + public static APIResponseStatus UnknownError(string? msg = null) { - return Send("300", "통신에 오류가 발생하였습니다.", ""); + return Send("999", msg ?? "알 수 없는 오류가 발생하였습니다.", ""); } - - public static APIResponseStatus UnknownError() - { - return Send("999", "알 수 없는 오류가 발생하였습니다.", ""); - } -} -// -// public static class DefaultResponse -// { -// // private static readonly Lazy _instance = new Lazy(); -// // public static ErrorResponse Instace => _instance.Value; -// -// // private ErrorResponse() -// // { -// // // 외부 초기화 방지 -// // } -// -// -// public static APIResponseStatus Success = new APIResponseStatus -// { -// status = new Status() -// { -// code = "000", -// message = "정상" -// } -// }; -// -// public static APIResponseStatus InvalidInputError = new APIResponseStatus -// { -// status = new Status() -// { -// code = "001", -// message = "입력 값이 유효하지 않습니다." -// } -// }; -// -// public static APIResponseStatus NotFoundError = new APIResponseStatus -// { -// status = new Status() -// { -// code = "002", -// message = "알맞은 값을 찾을 수 없습니다." -// } -// }; -// -// public static APIResponseStatus InternalSeverError = new APIResponseStatus -// { -// status = new Status -// { -// code = "003", -// message = "통신에 오류가 발생하였습니다." -// } -// }; -// -// -// public static APIResponseStatus UnknownError = new APIResponseStatus -// { -// status = new Status() -// { -// code = "999", -// message = "알 수 없는 오류가 발생하였습니다." -// } -// }; -// } +} \ No newline at end of file diff --git a/Program/V1/Controllers/UserController.cs b/Program/V1/Controllers/UserController.cs index eba1297..4bb3a0a 100644 --- a/Program/V1/Controllers/UserController.cs +++ b/Program/V1/Controllers/UserController.cs @@ -18,6 +18,9 @@ using AcaMate.V1.Services; namespace AcaMate.V1.Controllers; +/// +/// USER는 사용자가 자신의 데이터를 보거나 만들거나 하는 등 직접 사용하는 경우에 사용 +/// [ApiController] [Route("/api/v1/in/user")] [ApiExplorerSettings(GroupName = "사용자")] @@ -37,16 +40,17 @@ public class UserController : ControllerBase } [HttpGet] - [CustomOperation("회원 정보 조회", "회원 정보 조회", "사용자")] + [CustomOperation("회원 정보 조회", "회원 정보 조회 (자기자신)", "사용자")] public async Task 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) @@ -61,244 +65,299 @@ public class UserController : ControllerBase type = u.type }) .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 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 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) + // 회원 정보 없음 + 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)) { - // 정상적으로 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}"); - - // await _repositoryService.SaveData(refreshToken, rt => rt.uid); - await _repositoryService.SaveData(refreshToken); - - return Ok(APIResponse.Send("000","정상", new + var logUser = new LogUser { - token = accessToken, - refresh = refreshToken.refresh_token - })); + uid = login.uid, + create_date = DateTime.Now, + create_uid = "System", + log = $"[{summary}] : 정상" + }; + await _repositoryService.SaveData(logUser); + return Ok(APIResponse.Send("000",$"[{summary}], 정상", + new { token = accessToken, refresh = refreshToken.refresh_token })); } - } - // 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 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 + else { - bid = a.bid, - name = a.business_name - }) - .ToListAsync(); + var logUser = new LogUser + { + uid = login.uid, + create_date = DateTime.Now, + create_uid = "System", + log = $"[{summary}] : 실패" + }; + await _repositoryService.SaveData(logUser); + + return Ok(APIResponse.InternalSeverError($"[{summary}], 로그인 저장 실패")); + } + + } - 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)); + 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)); } - } - + [HttpPost("register")] [CustomOperation("회원 가입", "사용자 회원 가입", "사용자")] public async Task UserRegister([FromBody] UserAll request) { - if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); - - 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 - }; + if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); + string summary = String.Empty; - var permission = new Permission + try { - uid = uid, - location_yn = request.location_yn, - camera_yn = request.camera_yn, - 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 - }; + 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 + { + 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 contact = new Contact - { - uid = uid, - email = request.email, - phone = request.phone, - address = request.address - }; + var permission = new Permission + { + uid = uid, + location_yn = request.location_yn, + camera_yn = request.camera_yn, + 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 + }; - - if (await _repositoryService.SaveData(user)) - { - await _repositoryService.SaveData(login); - await _repositoryService.SaveData(permission); - await _repositoryService.SaveData(contact); + 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); + var saveLogin = await _repositoryService.SaveData(login); + var savePermission = await _repositoryService.SaveData(permission); + var saveContact = await _repositoryService.SaveData(contact); + if (saveUser && saveLogin && savePermission && saveContact) + { + + var token = _jwtTokenService.GenerateJwtToken(uid); + var refreshToken = _jwtTokenService.GenerateRefreshToken(uid); + + if (await _repositoryService.SaveData(refreshToken)) + { + logUser.log = $"[{summary}] : 정상"; + + if (await _repositoryService.SaveData(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); + + return Ok(APIResponse.InternalSeverError()); } - - // TO-DO: jwt 토큰 만들어서 여기서 보내는 작업을 해야 함 - var token = _jwtTokenService.GenerateJwtToken(uid); - var refreshToken = _jwtTokenService.GenerateRefreshToken(uid); - - await _repositoryService.SaveData(refreshToken); - - return Ok(APIResponse.Send("000","정상",new + catch (Exception ex) { - accessToken = token, - refreshToken = refreshToken.refresh_token - })); + _logger.LogInformation($"[{summary}] : {ex.Message}"); + return BadRequest(APIResponse.UnknownError(ex.Message)); + } + } [HttpGet("logout")] [CustomOperation("로그아웃", "사용자 로그아웃", "사용자")] - public async Task Logout(string token, string refresh) //([FromBody] UserAll request) + public async Task 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); - 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")] - - - - +} - -} \ No newline at end of file +/* + 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"); + } +*/ \ No newline at end of file diff --git a/Program/V1/Models/Log.cs b/Program/V1/Models/Log.cs index ca2b213..d342fb9 100644 --- a/Program/V1/Models/Log.cs +++ b/Program/V1/Models/Log.cs @@ -16,4 +16,16 @@ public class LogPush public DateTime create_date {get; set;} 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; } } \ No newline at end of file -- 2.45.1 From 6963c5eadbd5d3d5889a2052838d2302564d6fc5 Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Tue, 11 Mar 2025 13:40:37 +0900 Subject: [PATCH 10/12] =?UTF-8?q?[=E2=9C=A8]=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=83=88=ED=87=B4=20API=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program/V1/Controllers/UserController.cs | 129 ++++++++++++----------- 1 file changed, 68 insertions(+), 61 deletions(-) diff --git a/Program/V1/Controllers/UserController.cs b/Program/V1/Controllers/UserController.cs index 4bb3a0a..23e30c9 100644 --- a/Program/V1/Controllers/UserController.cs +++ b/Program/V1/Controllers/UserController.cs @@ -31,7 +31,8 @@ public class UserController : ControllerBase private readonly JwtTokenService _jwtTokenService; private readonly IRepositoryService _repositoryService; - public UserController(AppDbContext dbContext, ILogger logger, JwtTokenService jwtTokenService, IRepositoryService repositoryService) + public UserController(AppDbContext dbContext, ILogger logger, JwtTokenService jwtTokenService, + IRepositoryService repositoryService) { _dbContext = dbContext; _logger = logger; @@ -43,58 +44,61 @@ public class UserController : ControllerBase [CustomOperation("회원 정보 조회", "회원 정보 조회 (자기자신)", "사용자")] public async Task GetUserData(string token, string refresh) { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError()); - if(!ModelState.IsValid) 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"); - + 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(); + .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) { _logger.LogInformation($"[{summary}] : {tokenEx}"); - return Ok(APIResponse.Send("001", $"[{summary}], 토큰에 문제가 있음",Empty)); + return Ok(APIResponse.Send("001", $"[{summary}], 토큰에 문제가 있음", Empty)); } catch (RefreshRevokeException refreshEx) { _logger.LogInformation($"[{summary}] : {refreshEx}"); - return Ok(APIResponse.Send("001", $"[{summary}], 폐기된 리프레시 토큰",Empty)); + return Ok(APIResponse.Send("001", $"[{summary}], 폐기된 리프레시 토큰", Empty)); } catch (Exception ex) { return StatusCode(500, APIResponse.UnknownError(ex.Message)); } } + [HttpGet("academy")] [CustomOperation("학원 리스트 확인", "사용자가 등록된 학원 리스트 확인", "사용자")] public async Task ReadAcademyInfo(string token, string refresh) { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError()); - if(!ModelState.IsValid) 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), "ReadAcademyInfo"); + 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 @@ -104,19 +108,19 @@ public class UserController : ControllerBase bid = a.bid, name = a.business_name }).ToListAsync(); - - - return Ok(APIResponse.Send("000",$"[{summary}], 정상.",academies)); + + + return Ok(APIResponse.Send("000", $"[{summary}], 정상.", academies)); } catch (TokenException tokenEx) { _logger.LogInformation($"[{summary}] : {tokenEx}"); - return Ok(APIResponse.Send("001", $"[{summary}], 토큰에 문제가 있음",Empty)); + return Ok(APIResponse.Send("001", $"[{summary}], 토큰에 문제가 있음", Empty)); } catch (RefreshRevokeException refreshEx) { _logger.LogInformation($"[{summary}] : {refreshEx}"); - return Ok(APIResponse.Send("001", $"[{summary}], 폐기된 리프레시 토큰",Empty)); + return Ok(APIResponse.Send("001", $"[{summary}], 폐기된 리프레시 토큰", Empty)); } catch (Exception ex) { @@ -124,37 +128,38 @@ public class UserController : ControllerBase return StatusCode(500, APIResponse.UnknownError(ex.Message)); } } - + [HttpGet("login")] [CustomOperation("SNS 로그인", "로그인 후 회원이 있는지 확인", "사용자")] public async Task Login(string acctype, string sns_id) { // API 동작 파라미터 입력 값 확인 - if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(sns_id)) return BadRequest(APIResponse.InvalidInputError()); - if(!ModelState.IsValid) 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"); + summary = _repositoryService.ReadSummary(typeof(UserController), "Login"); var login = await _dbContext.Login .FirstOrDefaultAsync(l => l.sns_type == acctype && l.sns_id == sns_id); - + if (login != null) { // 로그인 정보가 존재 하는 상황 var user = await _dbContext.User .FirstOrDefaultAsync(u => u.uid == login.uid); - + // 회원 정보 없음 - if (user == null) return Ok(APIResponse.Send("002", $"[{summary}], 회원 정보 오류",Empty)); - + 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); @@ -170,7 +175,7 @@ public class UserController : ControllerBase log = $"[{summary}] : 정상" }; await _repositoryService.SaveData(logUser); - return Ok(APIResponse.Send("000",$"[{summary}], 정상", + return Ok(APIResponse.Send("000", $"[{summary}], 정상", new { token = accessToken, refresh = refreshToken.refresh_token })); } else @@ -183,13 +188,13 @@ public class UserController : ControllerBase log = $"[{summary}] : 실패" }; await _repositoryService.SaveData(logUser); - + return Ok(APIResponse.InternalSeverError($"[{summary}], 로그인 저장 실패")); } - + } - - return Ok(APIResponse.Send("001", $"[{summary}], 로그인 정보 없음",Empty)); + + return Ok(APIResponse.Send("001", $"[{summary}], 로그인 정보 없음", Empty)); } catch (Exception ex) { @@ -197,20 +202,20 @@ public class UserController : ControllerBase return StatusCode(500, APIResponse.UnknownError(ex.Message)); } } - + [HttpPost("register")] [CustomOperation("회원 가입", "사용자 회원 가입", "사용자")] public async Task UserRegister([FromBody] UserAll request) { - if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); + if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string summary = String.Empty; try { - summary = _repositoryService.ReadSummary(typeof(PushController), "UserRegister"); + summary = _repositoryService.ReadSummary(typeof(UserController), "UserRegister"); var localPartEmail = request.email.Substring(0, request.email.IndexOf('@')); var uid = $"AM{localPartEmail}{DateTime.Now:yyyyMMdd}"; - + var user = new User { uid = uid, @@ -248,7 +253,7 @@ public class UserController : ControllerBase phone = request.phone, address = request.address }; - + var logUser = new LogUser { uid = login.uid, @@ -263,18 +268,18 @@ public class UserController : ControllerBase var saveContact = await _repositoryService.SaveData(contact); if (saveUser && saveLogin && savePermission && saveContact) { - + var token = _jwtTokenService.GenerateJwtToken(uid); var refreshToken = _jwtTokenService.GenerateRefreshToken(uid); if (await _repositoryService.SaveData(refreshToken)) { logUser.log = $"[{summary}] : 정상"; - + if (await _repositoryService.SaveData(logUser)) _logger.LogError($"[{summary}] : 로그 저장 성공"); - - return Ok(APIResponse.Send("000",$"[{summary}], 정상",new + + return Ok(APIResponse.Send("000", $"[{summary}], 정상", new { accessToken = token, refreshToken = refreshToken.refresh_token @@ -285,10 +290,10 @@ public class UserController : ControllerBase _logger.LogError($"[{summary}] : 토큰 저장 실패"); } } - + logUser.log = $"[{summary}] : 동작 실패"; await _repositoryService.SaveData(logUser); - + return Ok(APIResponse.InternalSeverError()); } catch (Exception ex) @@ -303,25 +308,27 @@ public class UserController : ControllerBase [CustomOperation("로그아웃", "사용자 로그아웃", "사용자")] public async Task 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 { - summary = _repositoryService.ReadSummary(typeof(PushController), "UserRegister"); - + summary = _repositoryService.ReadSummary(typeof(UserController), "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); return Ok(APIResponse.Send("000", $"[{summary}], 로그아웃 정상", Empty)); } + // 리프레시 토큰이 없다?? 그럼 이거 무조건 문제지 (이유를 알 수 없는) return Ok(APIResponse.UnknownError()); } @@ -341,7 +348,7 @@ public class UserController : ControllerBase // [HttpGet("set")] - + } /* -- 2.45.1 From 2321980ee891f8db9e0c9afde7e6c93c6657c8fa Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Tue, 11 Mar 2025 13:40:50 +0900 Subject: [PATCH 11/12] =?UTF-8?q?[=E2=9C=A8]=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=83=88=ED=87=B4=20API=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program/V1/Controllers/UserController.cs | 102 ++++++++++++++++++++++- 1 file changed, 100 insertions(+), 2 deletions(-) diff --git a/Program/V1/Controllers/UserController.cs b/Program/V1/Controllers/UserController.cs index 23e30c9..3cafb18 100644 --- a/Program/V1/Controllers/UserController.cs +++ b/Program/V1/Controllers/UserController.cs @@ -345,8 +345,106 @@ public class UserController : ControllerBase return StatusCode(500, APIResponse.UnknownError($"[{summary}], {ex.Message}")); } } - - // [HttpGet("set")] + + + [HttpGet("cancel")] + [CustomOperation("회원 탈퇴", "사용자 탈퇴", "사용자")] + public async Task 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)) + logUser.log = $"[{summary}] : 정상"; + else + { + logUser.log = $"[{summary}] : 실패"; + returnMsg = $"[{summary}], 실패"; + returnCode = "001"; + } + + if (!(await _repositoryService.SaveData(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 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}")); + } + } } -- 2.45.1 From 3e3a6442037bbfd809829238ec7157997efec2ff Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Tue, 11 Mar 2025 13:41:02 +0900 Subject: [PATCH 12/12] =?UTF-8?q?[=F0=9F=93=9D]=2025.03.11=20TO-DO=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Diary/25.03.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Diary/25.03.md b/Diary/25.03.md index 6a47330..d961a35 100644 --- a/Diary/25.03.md +++ b/Diary/25.03.md @@ -44,15 +44,16 @@ --- ## 11일(화) ### 1. USER API 점검 및 수정 -1. [ ] 회원 정보 조회 [./user] -2. [ ] 회원 가입 [./user/register] -3. [ ] 로그인 [./user/login] -4. [ ] 로그아웃 [./user/logout] -5. [ ] 학원 조회 [./user/academy] +1. [X] 회원 정보 조회 [./user] +2. [X] 회원 가입 [./user/register] +3. [X] 로그인 [./user/login] +4. [X] 로그아웃 [./user/logout] +5. [X] 학원 조회 [./user/academy] ### 2. USER API 로그 기록 만들기 -1. [ ] 필요한 위치에 등록하기 +1. [X] 필요한 위치에 등록하기 ### 3. USER API 만들기 -1. [ ] 회원 탈퇴 [./user/cancel] -2. [ ] 회원 정보 변경 [./user/set] +1. [X] 회원 탈퇴 [./user/cancel] +2. [보류] 회원 정보 변경 [./user/set] + - 근데 회원 정보를 변경하는게 뭐뭐를 변경해야 하는지 아직 정해진게 없어서 이건 일단 보류 -- 2.45.1