SPMS_API/SPMS.Domain/Interfaces/IPushSendLogRepository.cs
SEAN 3d8c57f690 improvement: 이력 엑셀 내보내기 API 추가 (#191)
- POST /v1/in/stats/history/export 엔드포인트 추가
- history/list와 동일 필터(keyword/status/date) 기준 엑셀 내보내기
- PushSendLogRepository에서 GroupBy 쿼리를 private helper로 리팩토링
- ClosedXML로 엑셀 생성 (메시지코드/제목/서비스명/발송일시/대상수/성공/실패/오픈율/상태)

Closes #191
2026-02-25 16:39:56 +09:00

78 lines
3.1 KiB
C#

using SPMS.Domain.Entities;
using SPMS.Domain.Enums;
namespace SPMS.Domain.Interfaces;
public interface IPushSendLogRepository : IRepository<PushSendLog>
{
Task<(IReadOnlyList<PushSendLog> Items, int TotalCount)> GetPagedWithMessageAsync(
long serviceId, int page, int size,
long? messageId = null, long? deviceId = null,
PushResult? status = null,
DateTime? startDate = null, DateTime? endDate = null);
Task<List<HourlyStatRaw>> GetHourlyStatsAsync(long? serviceId, DateTime startDate, DateTime endDate);
Task<MessageStatRaw?> GetMessageStatsAsync(long serviceId, long messageId, DateTime? startDate, DateTime? endDate);
Task<List<MessageDailyStatRaw>> GetMessageDailyStatsAsync(long serviceId, long messageId, DateTime? startDate, DateTime? endDate);
Task<(IReadOnlyList<PushSendLog> Items, int TotalCount)> GetDetailLogPagedAsync(
long serviceId, long messageId, int page, int size,
PushResult? status = null, Platform? platform = null);
Task<IReadOnlyList<PushSendLog>> GetExportLogsAsync(
long serviceId, DateTime startDate, DateTime endDate,
long? messageId = null, long? deviceId = null,
PushResult? status = null, int maxCount = 100000);
Task<List<FailureStatRaw>> GetFailureStatsAsync(long? serviceId, DateTime startDate, DateTime endDate, int limit);
Task<List<FailureStatRaw>> GetFailureStatsByMessageAsync(long serviceId, long messageId, int limit);
Task<(IReadOnlyList<MessageHistorySummary> Items, int TotalCount)> GetMessageHistoryPagedAsync(
long? serviceId, int page, int size,
string? keyword = null, string? status = null,
DateTime? startDate = null, DateTime? endDate = null);
Task<IReadOnlyList<MessageHistorySummary>> GetMessageHistoryAllAsync(
long? serviceId,
string? keyword = null, string? status = null,
DateTime? startDate = null, DateTime? endDate = null,
int maxCount = 100000);
}
public class HourlyStatRaw
{
public int Hour { get; set; }
public int SendCount { get; set; }
public int SuccessCount { get; set; }
public int FailCount { get; set; }
}
public class MessageStatRaw
{
public int TotalSend { get; set; }
public int TotalSuccess { get; set; }
public int TotalFail { get; set; }
public DateTime? FirstSentAt { get; set; }
public DateTime? LastSentAt { get; set; }
}
public class MessageDailyStatRaw
{
public DateOnly StatDate { get; set; }
public int SendCount { get; set; }
public int SuccessCount { get; set; }
}
public class FailureStatRaw
{
public string FailReason { get; set; } = string.Empty;
public int Count { get; set; }
}
public class MessageHistorySummary
{
public long MessageId { get; set; }
public string MessageCode { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string ServiceName { get; set; } = string.Empty;
public DateTime FirstSentAt { get; set; }
public int TotalSendCount { get; set; }
public int SuccessCount { get; set; }
public int FailCount { get; set; }
}