+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/src/Infrastructure/Reporting/ReportTemplateStore.cs b/src/Infrastructure/Reporting/ReportTemplateStore.cs
index 3b8bcce..7d5fa51 100644
--- a/src/Infrastructure/Reporting/ReportTemplateStore.cs
+++ b/src/Infrastructure/Reporting/ReportTemplateStore.cs
@@ -1,6 +1,7 @@
using System.Data;
using System.Data.Common;
using System.Text.Json;
+using Hc900Crawler.Core.Application.DTOs;
using Hc900Crawler.Core.Application.Interfaces;
using Hc900Crawler.Infrastructure.Database;
using Microsoft.EntityFrameworkCore;
@@ -53,6 +54,41 @@ VALUES (@t, @pk, @pd, @src, @st, @cells::jsonb, @blob)";
await cmd.ExecuteNonQueryAsync(ct);
}
+ public async Task
> ListAsync(CancellationToken ct = default)
+ {
+ var conn = await OpenAsync(ct);
+ await using var cmd = conn.CreateCommand();
+ cmd.CommandText = @"
+SELECT t.id, t.name, t.owner, t.created_at,
+ count(r.id) AS run_count, max(r.generated_at) AS last_run
+FROM hc900.report_template t
+LEFT JOIN hc900.report_run r ON r.template_id = t.id
+GROUP BY t.id, t.name, t.owner, t.created_at
+ORDER BY t.created_at DESC";
+ var list = new List();
+ await using var rd = await cmd.ExecuteReaderAsync(ct);
+ while (await rd.ReadAsync(ct))
+ list.Add(new ReportTemplateInfo
+ {
+ Id = rd.GetInt32(0),
+ Name = rd.GetString(1),
+ Owner = rd.IsDBNull(2) ? null : rd.GetString(2),
+ CreatedAt = rd.GetFieldValue(3),
+ RunCount = Convert.ToInt32(rd.GetValue(4)),
+ LastRunAt = rd.IsDBNull(5) ? null : rd.GetFieldValue(5),
+ });
+ return list;
+ }
+
+ public async Task DeleteAsync(int templateId, CancellationToken ct = default)
+ {
+ var conn = await OpenAsync(ct);
+ await using var cmd = conn.CreateCommand();
+ cmd.CommandText = "DELETE FROM hc900.report_template WHERE id=@id"; // report_run은 FK ON DELETE CASCADE
+ AddP(cmd, "@id", templateId);
+ return await cmd.ExecuteNonQueryAsync(ct) > 0;
+ }
+
private async Task OpenAsync(CancellationToken ct)
{
var conn = _ctx.Database.GetDbConnection();