Skip to content

Commit

Permalink
--wip-- [skip ci]
Browse files Browse the repository at this point in the history
  • Loading branch information
oskogstad committed Jul 26, 2024
1 parent 531b0dc commit e96278d
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ public CreateDialogCommandValidator(
.IsIn(x => x.Activities,
dependentKeySelector: activity => activity.RelatedActivityId,
principalKeySelector: activity => activity.Id)
.WithMessage((_, x) => $"Invalid '{nameof(DialogActivity.RelatedActivityId)}', item '{x.RelatedActivityId}' in 'Activities' does not exist.")
.SetValidator(activityValidator);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ public async Task<UpdateDialogResult> Handle(UpdateDialogCommand request, Cancel
var resourceIds = await _userResourceRegistry.GetCurrentUserResourceIds(cancellationToken);

var dialog = await _db.Dialogs
.Include(x => x.Activities)
.Include(x => x.Content)
.ThenInclude(x => x.Value.Localizations)
.Include(x => x.SearchTags)
Expand Down Expand Up @@ -106,7 +107,8 @@ public async Task<UpdateDialogResult> Handle(UpdateDialogCommand request, Cancel
// Update primitive properties
_mapper.Map(request.Dto, dialog);
ValidateTimeFields(dialog);
await AppendActivity(dialog, request.Dto, cancellationToken);
AppendActivity(dialog, request.Dto);
VerifyActivityRelations(dialog);

dialog.SearchTags
.Merge(request.Dto.SearchTags,
Expand Down Expand Up @@ -196,22 +198,52 @@ private void ValidateTimeFields(DialogEntity dialog)
}
}

private async Task AppendActivity(DialogEntity dialog, UpdateDialogDto dto, CancellationToken cancellationToken)
private void AppendActivity(DialogEntity dialog, UpdateDialogDto dto)
{
var newDialogActivities = _mapper.Map<List<DialogActivity>>(dto.Activities);
var newActivities = _mapper.Map<List<DialogActivity>>(dto.Activities);

var existingIds = await _db.GetExistingIds(newDialogActivities, cancellationToken);
var existingIds = dialog.Activities.Select(x => x.Id).ToList();

existingIds = existingIds.Intersect(newActivities.Select(x => x.Id)).ToList();
if (existingIds.Count != 0)
{
_domainContext.AddError(
nameof(UpdateDialogDto.Activities),
$"Entity '{nameof(DialogActivity)}' with the following key(s) already exists: ({string.Join(", ", existingIds)}).");
return;
}

dialog.Activities.AddRange(newDialogActivities);
dialog.Activities.AddRange(newActivities);

// Tell ef explicitly to add activities as new to the database.
_db.DialogActivities.AddRange(newDialogActivities);
_db.DialogActivities.AddRange(newActivities);
}

private void VerifyActivityRelations(DialogEntity dialog)
{
var relatedActivityIds = dialog.Activities
.Where(x => x.RelatedActivityId is not null)
.Select(x => x.RelatedActivityId)
.ToList();

if (relatedActivityIds.Count == 0)
{
return;
}

var activityIds = dialog.Activities.Select(x => x.Id).ToList();

var invalidRelatedActivityIds = relatedActivityIds
.Where(id => !activityIds.Contains(id!.Value))
.ToList();

if (invalidRelatedActivityIds.Count != 0)
{
_domainContext.AddError(
nameof(UpdateDialogDto.Activities),
$"Invalid '{nameof(DialogActivity.RelatedActivityId)}, entity '{nameof(DialogActivity)}'" +
$" with the following key(s) does not exist: ({string.Join(", ", invalidRelatedActivityIds)}) in '{nameof(dialog.Activities)}'");
}
}

private IEnumerable<DialogApiAction> CreateApiActions(IEnumerable<UpdateDialogDialogApiActionDto> creatables)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,6 @@ public UpdateDialogDtoValidator(
RuleFor(x => x.Activities)
.UniqueBy(x => x.Id);
RuleForEach(x => x.Activities)
.IsIn(x => x.Activities,
dependentKeySelector: activity => activity.RelatedActivityId,
principalKeySelector: activity => activity.Id)
.SetValidator(activityValidator);
}
}
Expand Down

0 comments on commit e96278d

Please sign in to comment.