[♻️] 전체적인 구조 리팩토링 진행중 4 (PushController part) - 푸시까지 수정 완료

This commit is contained in:
김선규 2025-04-08 17:17:12 +09:00
parent c1ee151a9c
commit 04f94ca835
7 changed files with 73 additions and 48 deletions

View File

@ -130,7 +130,7 @@ builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddScoped<IAppService, AppService>();
builder.Services.AddScoped<IAppRepository, AppRepository>();
builder.Services.AddScoped<IPushService, PushService>();
// builder.Services.AddScoped<IPushService, PushService>();
builder.Services.AddScoped<IPushRepository, PushRepository>();
// builder.Services.AddScoped<UserService>(); //
// builder.Services.AddScoped<UserController>();

View File

@ -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));
}
*/
}

View File

@ -11,6 +11,8 @@ public interface IPushRepository
Task<int> CountBadge(string uid);
Task<string?> FindPushToken(string uid);
Task<PushCabinet?> FindPushCabinet(int id);
Task<List<PushCabinet>> FindPushCabinet(string uid, int size);
Task<List<PushCabinet>> FindPushCabinet(int id, int size);
}

View File

@ -58,4 +58,28 @@ public class PushRepository: IPushRepository
{
return await _context.PushCabinet.FirstOrDefaultAsync(c => c.id == id);
}
public async Task<List<PushCabinet>> 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<List<PushCabinet>> 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<PushCabinet>();
return await _context.PushCabinet
.Where(c => c.send_date > sort)
.OrderBy(c => c.send_date)
.Take(size)
.ToListAsync();
}
}

View File

@ -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<IPushService>();
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
}
}
}
}

View File

@ -14,5 +14,6 @@ public interface IPushService
Task<APIResponseStatus<object>> DeletePush(string summary, string token, string bid, string pid);
Task<APIResponseStatus<object>> DeleteListPush(string summary, string token, int id);
Task<APIResponseStatus<object>> SearchToUserPush(string summary, string token, int size, PushCabinet? request);
}

View File

@ -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<object>("000", $"[{summary}], 정상", string.Empty);
if (request == null)
{
var data = await _pushRepository.FindPushCabinet(uid, size);
return APIResponse.Send<object>("000", $"[{summary}], 정상", data);
}
else
{
var data = await _pushRepository.FindPushCabinet(request.id, size);
return APIResponse.Send<object>("000", $"[{summary}], 정상", data);
}
}
}