-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSampleAnnouncementPublishedConsumer.cs
More file actions
122 lines (103 loc) · 4.7 KB
/
Copy pathSampleAnnouncementPublishedConsumer.cs
File metadata and controls
122 lines (103 loc) · 4.7 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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using Admin.Application.Authorization;
using BuildingBlocks.Application.Dispatching;
using Admin.Application.ProcessManagers;
using KnowledgeBase.PublicContracts.Events;
using SampleFeature.PublicContracts.Events;
namespace Admin.Application.Consumers;
public sealed record AdminAnnouncementProjection(
Guid AnnouncementId,
string Title,
string Body,
DateTimeOffset PublishedUtc,
string PublishedByActorId,
string SourceModuleKey,
string? SourceReference);
internal static class AdminAnnouncementSources
{
public const string KnowledgeBase = "knowledge-base";
public const string SampleFeature = "sample-feature";
}
public interface IAdminAnnouncementInbox
{
ValueTask StoreAsync(AdminAnnouncementProjection announcement, CancellationToken cancellationToken);
}
internal sealed class SampleAnnouncementPublishedConsumer : IModuleScopedIntegrationEventHandler<SampleAnnouncementPublishedEventV1>
{
private readonly IAdminAnnouncementProjectionProcessManager _processManager;
public SampleAnnouncementPublishedConsumer(IAdminAnnouncementProjectionProcessManager processManager)
{
_processManager = processManager ?? throw new ArgumentNullException(nameof(processManager));
}
public string ModuleKey => AdminModuleInfo.ModuleKey;
public async Task Handle(SampleAnnouncementPublishedEventV1 integrationEvent, CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(integrationEvent);
await _processManager.HandleAsync(
new AdminAnnouncementProjection(
integrationEvent.AnnouncementId,
integrationEvent.Title,
integrationEvent.Body,
integrationEvent.OccurredAt.ToDateTimeOffset(),
integrationEvent.PublishedByActorId,
AdminAnnouncementSources.SampleFeature,
null),
cancellationToken);
}
}
/// <summary>
/// Legacy V1 consumer kept as a migration bridge until <see cref="KnowledgeEntryPublishedEventV1"/>
/// reaches its retirement date (2027-01-15). New consumption logic lives in
/// <see cref="KnowledgeEntryPublishedV2Consumer"/>. Remove this consumer once all V1
/// events have been drained and the V1 contract is retired.
/// </summary>
internal sealed class KnowledgeEntryPublishedConsumer : IModuleScopedIntegrationEventHandler<KnowledgeEntryPublishedEventV1>
{
private readonly IAdminAnnouncementProjectionProcessManager _processManager;
public KnowledgeEntryPublishedConsumer(IAdminAnnouncementProjectionProcessManager processManager)
{
_processManager = processManager ?? throw new ArgumentNullException(nameof(processManager));
}
public string ModuleKey => AdminModuleInfo.ModuleKey;
public async Task Handle(KnowledgeEntryPublishedEventV1 integrationEvent, CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(integrationEvent);
await _processManager.HandleAsync(
new AdminAnnouncementProjection(
integrationEvent.EntryId,
integrationEvent.Title,
integrationEvent.Body,
integrationEvent.OccurredAt.ToDateTimeOffset(),
integrationEvent.PublishedByActorId,
AdminAnnouncementSources.KnowledgeBase,
integrationEvent.Slug),
cancellationToken);
}
}
/// <summary>
/// V2 consumer for knowledge base entry published events. Handles the active contract
/// version which includes the <c>Category</c> field. The V1 consumer remains as a
/// migration bridge until the V1 contract is retired.
/// </summary>
internal sealed class KnowledgeEntryPublishedV2Consumer : IModuleScopedIntegrationEventHandler<KnowledgeEntryPublishedEventV2>
{
private readonly IAdminAnnouncementProjectionProcessManager _processManager;
public KnowledgeEntryPublishedV2Consumer(IAdminAnnouncementProjectionProcessManager processManager)
{
_processManager = processManager ?? throw new ArgumentNullException(nameof(processManager));
}
public string ModuleKey => AdminModuleInfo.ModuleKey;
public async Task Handle(KnowledgeEntryPublishedEventV2 integrationEvent, CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(integrationEvent);
await _processManager.HandleAsync(
new AdminAnnouncementProjection(
integrationEvent.EntryId,
integrationEvent.Title,
integrationEvent.Body,
integrationEvent.OccurredAt.ToDateTimeOffset(),
integrationEvent.PublishedByActorId,
AdminAnnouncementSources.KnowledgeBase,
integrationEvent.Slug),
cancellationToken);
}
}