private async Task <Guid> CreateOutlookMeeting(
            CreateInvitationCommand request,
            IReadOnlyCollection <BuilderParticipant> meetingParticipants,
            Invitation invitation)
        {
            foreach (var meetingParticipant in meetingParticipants)
            {
                _logger.LogInformation($"Adding {meetingParticipant.Person.AzureUniqueId} - {meetingParticipant.Person.Mail} to invitation {invitation.Id}");
            }

            var organizer = await _personRepository.GetByOidAsync(_currentUserProvider.GetCurrentUserOid());

            var meeting = await _meetingClient.CreateMeetingAsync(meetingBuilder =>
            {
                var baseUrl = InvitationHelper.GetBaseUrl(_meetingOptions.CurrentValue.PcsBaseUrl, _plantProvider.Plant);

                meetingBuilder
                .StandaloneMeeting(InvitationHelper.GenerateMeetingTitle(invitation), request.Location)
                .StartsOn(request.StartTime, request.EndTime)
                .WithTimeZone("UTC")
                .WithParticipants(meetingParticipants)
                .WithClassification(MeetingClassification.Open)
                .EnableOutlookIntegration()
                .WithInviteBodyHtml(InvitationHelper.GenerateMeetingDescription(invitation, baseUrl, organizer));
            });

            return(meeting.Id);
        }
        public async Task <Result <int> > Handle(CreateInvitationCommand request, CancellationToken cancellationToken)
        {
            var transaction = await _unitOfWork.BeginTransaction(cancellationToken);

            var meetingParticipants = new List <BuilderParticipant>();
            var mcPkgs   = new List <McPkg>();
            var commPkgs = new List <CommPkg>();

            if (request.CommPkgScope.Count > 0)
            {
                commPkgs = await GetCommPkgsToAddAsync(request.CommPkgScope, request.ProjectName);
            }

            if (request.McPkgScope.Count > 0)
            {
                mcPkgs = await GetMcPkgsToAddAsync(request.McPkgScope, request.ProjectName);
            }

            var invitation = new Invitation(
                _plantProvider.Plant,
                request.ProjectName,
                request.Title,
                request.Description,
                request.Type,
                request.StartTime,
                request.EndTime,
                request.Location,
                mcPkgs,
                commPkgs);

            _invitationRepository.Add(invitation);

            meetingParticipants = await AddParticipantsAsync(invitation, meetingParticipants, request.Participants.ToList());

            await _unitOfWork.SaveChangesAsync(cancellationToken);

            try
            {
                invitation.MeetingId = await CreateOutlookMeeting(request, meetingParticipants, invitation);

                await _unitOfWork.SaveChangesAsync(cancellationToken);

                _unitOfWork.Commit();
                return(new SuccessResult <int>(invitation.Id));
            }
            catch (Exception e)
            {
                await transaction.RollbackAsync(cancellationToken);

                throw new Exception($"Error: User with oid {_currentUserProvider.GetCurrentUserOid()} could not create outlook meeting for invitation {invitation.Id}.", e);
            }
        }