From 04f94ca835fe0f4752aef3379ca03837805c6d04 Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Tue, 8 Apr 2025 17:17:12 +0900 Subject: [PATCH] =?UTF-8?q?[=E2=99=BB=EF=B8=8F]=20=EC=A0=84=EC=B2=B4?= =?UTF-8?q?=EC=A0=81=EC=9D=B8=20=EA=B5=AC=EC=A1=B0=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EC=A7=84=ED=96=89=EC=A4=91=204=20(PushCon?= =?UTF-8?q?troller=20part)=20-=20=ED=91=B8=EC=8B=9C=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program.cs | 2 +- Program/Controllers/V1/PushController.cs | 38 ------------------- .../V1/Interfaces/IPushRepository.cs | 2 + Program/Repositories/V1/PushRepository.cs | 24 ++++++++++++ Program/Services/V1/InMemoryPushQueue.cs | 19 ++++++++-- .../Services/V1/Interfaces/IPushService.cs | 1 + Program/Services/V1/PushService.cs | 35 ++++++++++++++--- 7 files changed, 73 insertions(+), 48 deletions(-) diff --git a/Program.cs b/Program.cs index 8fb8c6a..7221288 100644 --- a/Program.cs +++ b/Program.cs @@ -130,7 +130,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); -builder.Services.AddScoped(); +// builder.Services.AddScoped(); builder.Services.AddScoped(); // builder.Services.AddScoped(); // // builder.Services.AddScoped(); diff --git a/Program/Controllers/V1/PushController.cs b/Program/Controllers/V1/PushController.cs index 60a5435..d8581c8 100644 --- a/Program/Controllers/V1/PushController.cs +++ b/Program/Controllers/V1/PushController.cs @@ -121,44 +121,6 @@ namespace Back.Program.Controllers.V1 var result = await _pushService.SearchToUserPush(summary, token, size, request); return Ok(result); - /* - try - { - if (token == "System") uid = "System"; - else { - var validateToken = await _jwtTokenService.ValidateToken(token); - if (validateToken == null) return Ok(APIResponse.AccessExpireError()); - uid = validateToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; - } - - 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)); - } - */ } diff --git a/Program/Repositories/V1/Interfaces/IPushRepository.cs b/Program/Repositories/V1/Interfaces/IPushRepository.cs index f0ed436..5672ab4 100644 --- a/Program/Repositories/V1/Interfaces/IPushRepository.cs +++ b/Program/Repositories/V1/Interfaces/IPushRepository.cs @@ -11,6 +11,8 @@ public interface IPushRepository Task CountBadge(string uid); Task FindPushToken(string uid); Task FindPushCabinet(int id); + Task> FindPushCabinet(string uid, int size); + Task> FindPushCabinet(int id, int size); } \ No newline at end of file diff --git a/Program/Repositories/V1/PushRepository.cs b/Program/Repositories/V1/PushRepository.cs index ac1ab50..acc7944 100644 --- a/Program/Repositories/V1/PushRepository.cs +++ b/Program/Repositories/V1/PushRepository.cs @@ -58,4 +58,28 @@ public class PushRepository: IPushRepository { return await _context.PushCabinet.FirstOrDefaultAsync(c => c.id == id); } + + public async Task> FindPushCabinet(string uid, int size) + { + return await _context.PushCabinet.Where(c => c.uid == uid) + .OrderBy(c => c.send_date) + .Take(size) + .ToListAsync(); + } + + public async Task> FindPushCabinet(int id, int size) + { + var sort = await _context.PushCabinet + .Where(p=> p.id == id) + .Select(p => p.send_date) + .FirstOrDefaultAsync(); + + if (sort == default) return new List(); + + return await _context.PushCabinet + .Where(c => c.send_date > sort) + .OrderBy(c => c.send_date) + .Take(size) + .ToListAsync(); + } } \ No newline at end of file diff --git a/Program/Services/V1/InMemoryPushQueue.cs b/Program/Services/V1/InMemoryPushQueue.cs index 6621244..dffd869 100644 --- a/Program/Services/V1/InMemoryPushQueue.cs +++ b/Program/Services/V1/InMemoryPushQueue.cs @@ -31,19 +31,29 @@ namespace Back.Program.Services.V1 } } - public class PushBackgroundService(IPushQueue queue, IPushService pushService) : BackgroundService + public class PushBackgroundService : BackgroundService { - private readonly IPushQueue _queue = queue; - private readonly IPushService _pushService = pushService; + private readonly IPushQueue _queue; + private readonly IServiceScopeFactory _scopeFactory; + + public PushBackgroundService(IPushQueue queue, IServiceScopeFactory scopeFactory) + { + _queue = queue; + _scopeFactory = scopeFactory; + } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var pushData = await _queue.DequeueAsync(stoppingToken); + + using var scope = _scopeFactory.CreateScope(); + var pushService = scope.ServiceProvider.GetRequiredService(); + try { - await _pushService.SendPushNotificationAsync(pushData.pushToken, pushData.payload); + await pushService.SendPushNotificationAsync(pushData.pushToken, pushData.payload); } catch (Exception ex) { @@ -52,4 +62,5 @@ namespace Back.Program.Services.V1 } } } + } \ No newline at end of file diff --git a/Program/Services/V1/Interfaces/IPushService.cs b/Program/Services/V1/Interfaces/IPushService.cs index 5028504..4c081b2 100644 --- a/Program/Services/V1/Interfaces/IPushService.cs +++ b/Program/Services/V1/Interfaces/IPushService.cs @@ -14,5 +14,6 @@ public interface IPushService Task> DeletePush(string summary, string token, string bid, string pid); Task> DeleteListPush(string summary, string token, int id); Task> SearchToUserPush(string summary, string token, int size, PushCabinet? request); + } diff --git a/Program/Services/V1/PushService.cs b/Program/Services/V1/PushService.cs index 1ea5bd2..ed7e257 100644 --- a/Program/Services/V1/PushService.cs +++ b/Program/Services/V1/PushService.cs @@ -64,11 +64,27 @@ namespace Back.Program.Services.V1 await policy.ExecuteAsync(async () => { - var response = await _httpClient.SendAsync(request); - if (!response.IsSuccessStatusCode) + // var response = await _httpClient.SendAsync(request); + try { - var errorContent = await response.Content.ReadAsStringAsync(); - throw new ServiceConnectionFailedException($"[푸시] : APNS 통신 실패 - {errorContent}"); + var response = await _httpClient.SendAsync(request); + var result = await response.Content.ReadAsStringAsync(); + // Console.WriteLine($"[APNs 응답] StatusCode: {response.StatusCode}"); + // Console.WriteLine($"[APNs 응답 본문]: {result}"); + + if (!response.IsSuccessStatusCode) + { + var errorContent = await response.Content.ReadAsStringAsync(); + throw new ServiceConnectionFailedException($"[푸시] : APNS 통신 실패 - {errorContent}"); + + } + } + catch (Exception ex) + { + Console.WriteLine($"[푸시 전송 예외 발생] {ex.GetType().Name}: {ex.Message}"); + if (ex.InnerException != null) + Console.WriteLine( + $"[InnerException] {ex.InnerException.GetType().Name}: {ex.InnerException.Message}"); } }); } @@ -311,7 +327,16 @@ namespace Back.Program.Services.V1 uid = validToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; } - return APIResponse.Send("000", $"[{summary}], 정상", string.Empty); + if (request == null) + { + var data = await _pushRepository.FindPushCabinet(uid, size); + return APIResponse.Send("000", $"[{summary}], 정상", data); + } + else + { + var data = await _pushRepository.FindPushCabinet(request.id, size); + return APIResponse.Send("000", $"[{summary}], 정상", data); + } } }