Skip to content

Commit

Permalink
feat: Add event for transmission created (#1893)
Browse files Browse the repository at this point in the history
<!--- Provide a general summary of your changes in the Title above -->

## Description

<!--- Describe your changes in detail -->

## Related Issue(s)

- #1892 

## Verification

- [ ] **Your** code builds clean without any errors or warnings
- [ ] Manual testing done (required)
- [ ] Relevant automated test added (if you find this hard, leave it and
we'll help out)

## Documentation

- [ ] Documentation is updated (either in `docs`-directory, Altinnpedia
or a separate linked PR in
[altinn-studio-docs.](https://github.com/Altinn/altinn-studio-docs), if
applicable)
  • Loading branch information
oskogstad authored Feb 17, 2025
1 parent f2f817b commit ae0f7dc
Show file tree
Hide file tree
Showing 7 changed files with 131 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
namespace Digdir.Domain.Dialogporten.Application.Features.V1.Common.Events.AltinnForwarders;

internal sealed class DialogEventToAltinnForwarder : DomainEventToAltinnForwarderBase,
INotificationHandler<DialogTransmissionCreatedDomainEvent>,
INotificationHandler<DialogCreatedDomainEvent>,
INotificationHandler<DialogUpdatedDomainEvent>,
INotificationHandler<DialogDeletedDomainEvent>,
Expand Down Expand Up @@ -130,7 +131,29 @@ public async Task Handle(DialogRestoredDomainEvent domainEvent, CancellationToke
};

await CloudEventBus.Publish(cloudEvent, cancellationToken);
}

[EndpointName("DialogEventToAltinnForwarder_DialogTransmissionCreatedDomainEvent")]
public async Task Handle(DialogTransmissionCreatedDomainEvent domainEvent, CancellationToken cancellationToken)
{
if (domainEvent.ShouldNotBeSentToAltinnEvents())
{
return;
}

var cloudEvent = new CloudEvent
{
Id = domainEvent.EventId,
Type = CloudEventTypes.Get(nameof(DialogTransmissionCreatedDomainEvent)),
Time = domainEvent.OccurredAt,
Resource = domainEvent.ServiceResource,
ResourceInstance = domainEvent.DialogId.ToString(),
Subject = domainEvent.Party,
Source = $"{SourceBaseUrl()}{domainEvent.DialogId}/transmissions/{domainEvent.TransmissionId}",
Data = GetCloudEventData(domainEvent)
};

await CloudEventBus.Publish(cloudEvent, cancellationToken);
}

private static Dictionary<string, object>? GetCloudEventData(IProcessEvent domainEvent)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ internal static class CloudEventTypes
nameof(DialogUpdatedDomainEvent) => "dialogporten.dialog.updated.v1",
nameof(DialogDeletedDomainEvent) => "dialogporten.dialog.deleted.v1",
nameof(DialogSeenDomainEvent) => "dialogporten.dialog.seen.v1",
nameof(DialogTransmissionCreatedDomainEvent) => "dialogporten.dialog.transmission.created.v1",

// Dialog activity
nameof(DialogActivityType.Values.DialogCreated) => "dialogporten.dialog.activity.created.v1",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
using Digdir.Domain.Dialogporten.Domain.Actors;
using Digdir.Domain.Dialogporten.Domain.Attachments;
using Digdir.Domain.Dialogporten.Domain.Common.EventPublisher;
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Activities;
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Transmissions.Contents;
using Digdir.Domain.Dialogporten.Domain.Dialogs.Events;
using Digdir.Library.Entity.Abstractions.Features.Aggregate;
using Digdir.Library.Entity.Abstractions.Features.Immutable;

namespace Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Transmissions;

public sealed class DialogTransmission : IImmutableEntity
public sealed class DialogTransmission :
IImmutableEntity,
IAggregateCreatedHandler,
IEventPublisher
{
public Guid Id { get; set; }
public DateTimeOffset CreatedAt { get; set; }
Expand Down Expand Up @@ -37,6 +42,23 @@ public sealed class DialogTransmission : IImmutableEntity

public DialogTransmissionType.Values TypeId { get; set; }
public DialogTransmissionType Type { get; set; } = null!;

public void OnCreate(AggregateNode self, DateTimeOffset utcNow)
=> _domainEvents.Add(new DialogTransmissionCreatedDomainEvent(
DialogId,
Id,
Dialog.ServiceResource,
Dialog.Party,
Dialog.Process,
Dialog.PrecedingProcess));

private readonly List<IDomainEvent> _domainEvents = [];
public IEnumerable<IDomainEvent> PopDomainEvents()
{
var events = _domainEvents.ToList();
_domainEvents.Clear();
return events;
}
}

public sealed class DialogTransmissionSenderActor : Actor, IImmutableEntity
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using Digdir.Domain.Dialogporten.Domain.Common.DomainEvents;

namespace Digdir.Domain.Dialogporten.Domain.Dialogs.Events;

public sealed record DialogTransmissionCreatedDomainEvent(
Guid DialogId,
Guid TransmissionId,
string ServiceResource,
string Party,
string? Process,
string? PrecedingProcess) : DomainEvent, IProcessEvent;
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
using FluentAssertions;
using Digdir.Domain.Dialogporten.Application.Features.V1.ServiceOwner.Dialogs.Commands.Delete;
using Digdir.Domain.Dialogporten.Application.Features.V1.ServiceOwner.Dialogs.Commands.Restore;
using Digdir.Domain.Dialogporten.Domain.Actors;
using Digdir.Domain.Dialogporten.Domain.Attachments;
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Transmissions;
using Digdir.Domain.Dialogporten.Domain.Dialogs.Events.Activities;
using Digdir.Library.Entity.Abstractions.Features.Identifiable;
using MassTransit.Internals;
Expand Down Expand Up @@ -69,13 +71,20 @@ public async Task Creates_CloudEvents_When_Dialog_Created()

// Act
await Application.Send(createDialogCommand);

await harness.Consumed
.SelectAsync<DialogCreatedDomainEvent>(x => x.Context.Message.DialogId == dto.Id)
.FirstOrDefault();

await harness.Consumed
.SelectAsync<DialogActivityCreatedDomainEvent>(x => x.Context.Message.DialogId == dto.Id)
.Take(activities.Count)
.ToListAsync();

await harness.Consumed
.SelectAsync<DialogTransmissionCreatedDomainEvent>(x => x.Context.Message.DialogId == dto.Id)
.FirstOrDefault();

var cloudEvents = Application.PopPublishedCloudEvents();

// Assert
Expand All @@ -90,10 +99,13 @@ await harness.Consumed
cloudEvents.Should().ContainSingle(cloudEvent =>
cloudEvent.Type == CloudEventTypes.Get(activityType.ToString())));

cloudEvents.Count(cloudEvent => cloudEvent.Type == CloudEventTypes.Get(nameof(DialogTransmissionCreatedDomainEvent)))
.Should().Be(dto.Transmissions.Count);

cloudEvents.Count
.Should()
// +1 for the dialog created event
.Be(dto.Activities.Count + 1);
.Be(dto.Activities.Count + dto.Transmissions.Count + 1);
}

[Fact]
Expand Down Expand Up @@ -138,6 +150,64 @@ await harness.Consumed
cloudEvent.Type == CloudEventTypes.Get(nameof(DialogUpdatedDomainEvent)));
}

[Fact]
public async Task Creates_Update_Event_And_Transmission_Created_Event_When_Transmission_Is_Added()
{
// Arrange
var harness = await Application.ConfigureServicesWithMassTransitTestHarness();
var createDialogCommand = DialogGenerator.GenerateSimpleFakeCreateDialogCommand();

await Application.Send(createDialogCommand);
var dto = createDialogCommand.Dto;

var getDialogResult = await Application.Send(new GetDialogQuery { DialogId = dto.Id!.Value });
getDialogResult.TryPickT0(out var getDialogDto, out _);

var updateDialogDto = Mapper.Map<UpdateDialogDto>(getDialogDto);

updateDialogDto.Transmissions = [new()
{
Type = DialogTransmissionType.Values.Information,
Sender = new() { ActorType = ActorType.Values.ServiceOwner },
Content = new()
{
Title = new() { Value = [new() { LanguageCode = "nb", Value ="Title" }] },
Summary = new() { Value = [new() { LanguageCode = "nb", Value = "Summary" }] }
}
}];

var updateDialogCommand = new UpdateDialogCommand
{
Id = dto.Id!.Value,
Dto = updateDialogDto
};

// Act
await Application.Send(updateDialogCommand);

await harness.Consumed
.SelectAsync<DialogUpdatedDomainEvent>(x => x.Context.Message.DialogId == dto.Id)
.FirstOrDefault();

await harness.Consumed
.SelectAsync<DialogTransmissionCreatedDomainEvent>(x => x.Context.Message.DialogId == dto.Id)
.FirstOrDefault();

var cloudEvents = Application.PopPublishedCloudEvents();

// Assert
cloudEvents.Should().HaveCount(3); // DialogUpdated, TransmissionCreated, DialogCreated
cloudEvents.Should().OnlyContain(cloudEvent => cloudEvent.ResourceInstance == dto.Id!.Value.ToString());
cloudEvents.Should().OnlyContain(cloudEvent => cloudEvent.Resource == dto.ServiceResource);
cloudEvents.Should().OnlyContain(cloudEvent => cloudEvent.Subject == dto.Party);

cloudEvents.Should().ContainSingle(cloudEvent =>
cloudEvent.Type == CloudEventTypes.Get(nameof(DialogUpdatedDomainEvent)));

cloudEvents.Should().ContainSingle(cloudEvent =>
cloudEvent.Type == CloudEventTypes.Get(nameof(DialogTransmissionCreatedDomainEvent)));
}

[Fact]
public async Task Creates_CloudEvent_When_Attachments_Updates()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
DialogEventToAltinnForwarder_DialogDeletedDomainEvent,
DialogEventToAltinnForwarder_DialogRestoredDomainEvent,
DialogEventToAltinnForwarder_DialogSeenDomainEvent,
DialogEventToAltinnForwarder_DialogTransmissionCreatedDomainEvent,
DialogEventToAltinnForwarder_DialogUpdatedDomainEvent
]
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
Digdir.Domain.Dialogporten.Domain.Dialogs.Events.DialogDeletedDomainEvent,
Digdir.Domain.Dialogporten.Domain.Dialogs.Events.DialogRestoredDomainEvent,
Digdir.Domain.Dialogporten.Domain.Dialogs.Events.DialogSeenDomainEvent,
Digdir.Domain.Dialogporten.Domain.Dialogs.Events.DialogTransmissionCreatedDomainEvent,
Digdir.Domain.Dialogporten.Domain.Dialogs.Events.DialogUpdatedDomainEvent
]

0 comments on commit ae0f7dc

Please sign in to comment.