-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAdminAnnouncementReader.cs
More file actions
80 lines (67 loc) · 3.16 KB
/
Copy pathAdminAnnouncementReader.cs
File metadata and controls
80 lines (67 loc) · 3.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using Admin.PublicContracts.Queries;
using BuildingBlocks.Infrastructure.Persistence;
using Npgsql;
namespace Admin.Infrastructure.Inbox;
internal sealed class AdminAnnouncementReader : IAdminAnnouncementQueryService
{
private readonly NpgsqlDataSource _dataSource;
public AdminAnnouncementReader(IPostgresDataSourceResolver dataSourceResolver)
{
ArgumentNullException.ThrowIfNull(dataSourceResolver);
_dataSource = dataSourceResolver.GetRequiredDataSource(AdminPersistenceDefaults.ConnectionStringName);
}
public async ValueTask<AdminAnnouncementReadModel?> GetAsync(Guid announcementId, CancellationToken cancellationToken)
{
var sql = $"""
SELECT announcement_id, title, body, published_utc, published_by_actor_id, source_module_key, source_reference
FROM {AdminPersistenceDefaults.SchemaName}.{AdminPersistenceDefaults.AnnouncementsTableName}
WHERE announcement_id = @announcementId;
""";
await using var connection = await _dataSource.OpenConnectionAsync(cancellationToken);
await using var command = new NpgsqlCommand(sql, connection);
command.Parameters.AddWithValue("announcementId", announcementId);
await using var reader = await command.ExecuteReaderAsync(cancellationToken);
if (!await reader.ReadAsync(cancellationToken))
{
return null;
}
return new AdminAnnouncementReadModel(
reader.GetGuid(0),
reader.GetString(1),
reader.GetString(2),
reader.GetFieldValue<DateTimeOffset>(3),
reader.GetString(4))
{
SourceModuleKey = reader.GetString(5),
SourceReference = reader.IsDBNull(6) ? null : reader.GetString(6)
};
}
public async ValueTask<IReadOnlyCollection<AdminAnnouncementReadModel>> ListAsync(int limit, CancellationToken cancellationToken)
{
var sql = $"""
SELECT announcement_id, title, body, published_utc, published_by_actor_id, source_module_key, source_reference
FROM {AdminPersistenceDefaults.SchemaName}.{AdminPersistenceDefaults.AnnouncementsTableName}
ORDER BY published_utc DESC, announcement_id DESC
LIMIT @limit;
""";
var announcements = new List<AdminAnnouncementReadModel>();
await using var connection = await _dataSource.OpenConnectionAsync(cancellationToken);
await using var command = new NpgsqlCommand(sql, connection);
command.Parameters.AddWithValue("limit", limit);
await using var reader = await command.ExecuteReaderAsync(cancellationToken);
while (await reader.ReadAsync(cancellationToken))
{
announcements.Add(new AdminAnnouncementReadModel(
reader.GetGuid(0),
reader.GetString(1),
reader.GetString(2),
reader.GetFieldValue<DateTimeOffset>(3),
reader.GetString(4))
{
SourceModuleKey = reader.GetString(5),
SourceReference = reader.IsDBNull(6) ? null : reader.GetString(6)
});
}
return announcements;
}
}