public ConferenceLinkPresenter(IConferenceLinkRepo conferenceLinkRepo, IConferenceScheduler scheduler,
                                IOpenConferenceRepository openConferenceRepository)
 {
     _conferenceLinkRepo       = conferenceLinkRepo;
     _scheduler                = scheduler;
     _openConferenceRepository = openConferenceRepository;
 }
        public async Task <ActionResult> DeleteConferenceLink(string conferenceId,
                                                              [FromServices] IConferenceLinkRepo repo)
        {
            var userId         = User.Claims.First(x => x.Type == ClaimTypes.NameIdentifier).Value;
            var conferenceLink =
                (await repo.FindAsync(
                     new ConferenceLinkByParticipant(userId).And(new ConferenceLinkByConference(conferenceId))))
                .FirstOrDefault();

            if (conferenceLink == null)
            {
                return(NotFound(new Error(ErrorType.NotFound.ToString(), "The conference link was not found",
                                          "ConferenceLink_NotFound")));
            }

            try
            {
                await repo.DeleteAsync(conferenceLink);
            }
            catch (MongoConcurrencyDeletedException)
            {
            }

            return(Ok());
        }
        public async Task <ActionResult> PatchConferenceLink(string conferenceId,
                                                             JsonPatchDocument <ChangeConferenceLinkStarDto> patch, [FromServices] IConferenceLinkRepo repo,
                                                             [FromServices] IOptions <ConcurrencyOptions> options)
        {
            var userId = User.Claims.First(x => x.Type == ClaimTypes.NameIdentifier).Value;

            return(await Policy <ActionResult> .Handle <MongoConcurrencyUpdatedException>()
                   .RetryAsync(options.Value.RetryCount).ExecuteAsync(async() =>
            {
                var conferenceLink =
                    (await repo.FindAsync(
                         new ConferenceLinkByParticipant(userId).And(new ConferenceLinkByConference(conferenceId))))
                    .FirstOrDefault();

                if (conferenceLink == null)
                {
                    return NotFound(new Error(ErrorType.NotFound.ToString(), "The conference link was not found",
                                              "ConferenceLink_NotFound"));
                }

                var dto = new ChangeConferenceLinkStarDto {
                    Starred = conferenceLink.Starred
                };
                patch.ApplyTo(dto);

                conferenceLink.Starred = dto.Starred;

                try
                {
                    await repo.CreateOrReplaceAsync(conferenceLink);
                }
                catch (MongoConcurrencyDeletedException)
                {
                    return NotFound(new Error(ErrorType.NotFound.ToString(), "The conference link was not found",
                                              "ConferenceLink_NotFound"));
                }

                return Ok();
            }));
        }