示例#1
0
        /// <inheritdoc/>
        public async Task UpdateOrganisationAsync(
            IWho who,
            AuditEvent auditEvent,
            IOrganisation organisation)
        {
            this.logger.ReportEntry(
                who,
                new { Organisation = organisation });

            try
            {
                IAuditHeaderWithAuditDetails auditHeader = this.data.BeginTransaction(auditEvent, who);

                await this.data
                .UpdateOrganisationAsync(
                    who : who,
                    auditHeader : auditHeader,
                    organisation : organisation)
                .ConfigureAwait(false);

                await this.data.CommitTransactionAsync(auditHeader)
                .ConfigureAwait(false);
            }
            catch (Exception)
            {
                this.data.RollbackTransaction();
                throw;
            }

            this.logger.ReportExit(who);
        }
示例#2
0
        /// <inheritdoc/>
        public async Task UpdateAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader,
            ICompetition competition)
        {
            this.logger.LogTrace(
                "ENTRY {Method}(who, host) {@Who} {@Competition}",
                nameof(this.UpdateAsync),
                who,
                competition);

            CompetitionDto dto      = CompetitionDto.ToDto(competition);
            CompetitionDto original = await this.context.FindAsync <CompetitionDto>(competition.Id)
                                      .ConfigureAwait(false);

            Audit.AuditUpdate(auditHeader, dto.Id, original, dto);

            this.context.Entry(original).CurrentValues.SetValues(dto);
            await this.context.SaveChangesAsync().ConfigureAwait(false);

            this.logger.LogTrace(
                "EXIT {Method}(who) {@Who}",
                nameof(this.UpdateAsync),
                who);
        }
示例#3
0
        /// <inheritdoc/>
        public async Task UpdateMeetingAsync(
            IWho who,
            AuditEvent auditEvent,
            IMeeting meeting)
        {
            this.logger.ReportEntry(
                who,
                new { Meeting = meeting });

            try
            {
                IAuditHeaderWithAuditDetails auditHeader = this.data.BeginTransaction(auditEvent, who);

                await this.data
                .UpdateMeetingAsync(
                    who : who,
                    auditHeader : auditHeader,
                    meeting : meeting)
                .ConfigureAwait(false);

                await this.data.CommitTransactionAsync(auditHeader)
                .ConfigureAwait(false);
            }
            catch (Exception)
            {
                this.data.RollbackTransaction();
                throw;
            }

            this.logger.ReportExit(who);
        }
示例#4
0
        /// <inheritdoc/>
        public async Task CreateAgendaItemRecursivelyAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader,
            IAgendaItem agendaItem)
        {
            AgendaItemDto dto = AgendaItemDto.ToDto(agendaItem);

            this.context.AgendaItems.Add(dto);
            Audit.AuditCreate(auditHeader, dto, dto.Id);

            foreach (IAgendaItem child in agendaItem.ChildAgendaItems)
            {
                await this.CreateAgendaItemRecursivelyAsync(
                    who,
                    auditHeader,
                    child);
            }

            if (agendaItem.ParentId == null)
            {
                this.logger.Debug(
                    who,
                    "Saving changes",
                    new { AgendaItemId = agendaItem });
                await this.context.SaveChangesAsync();
            }

            this.logger.ReportExit(who);
        }
示例#5
0
        /// <inheritdoc/>
        public async Task CreateCommitteeAsync(
            IWho who,
            AuditEvent auditEvent,
            ICommittee committee)
        {
            this.logger.ReportEntry(
                who,
                new { Committee = committee });

            try
            {
                IAuditHeaderWithAuditDetails auditHeader = this.data.BeginTransaction(auditEvent, who);

                await this.data.CreateCommitteeAsync(
                    who : who,
                    auditHeader : auditHeader,
                    committee : committee)
                .ConfigureAwait(false);

                await this.data.CommitTransactionAsync(auditHeader)
                .ConfigureAwait(false);
            }
            catch (Exception)
            {
                this.data.RollbackTransaction();
                throw;
            }

            this.logger.ReportExit(who);
        }
        public void Test_Passing_Valid_Values()
        {
            // ARRANGE
            AuditHeaderDto auditHeaderDto = Create.AuditHeader();
            AuditDetailDto auditDetailDto = Create.AuditDetail(auditHeaderDto);

            auditHeaderDto.SetPrivatePropertyValue(
                propName: nameof(AuditHeaderDto.AuditDetails),
                value: new List <AuditDetailDto>
            {
                auditDetailDto
            });

            // ACT
            IAuditHeaderWithAuditDetails auditHeader = auditHeaderDto.ToDomainWithAuditDetails();

            // ASSERT
            Assert.IsNotNull(auditHeader);
            Assert.AreEqual(auditHeader.Id, auditHeader.Id);
            Assert.AreEqual(auditHeader.AuditEvent, auditHeader.AuditEvent);
            Assert.AreEqual(auditHeader.TimeStamp, auditHeader.TimeStamp);
            Assert.AreEqual(auditHeader.Username, auditHeader.Username);
            Assert.AreEqual(auditHeader.CorrelationId, auditHeader.CorrelationId);
            Assert.IsNotNull(auditHeader.AuditDetails);
            Assert.AreEqual(1, auditHeader.AuditDetails.Count);
        }
示例#7
0
        public async Task Test_Commit_Writes_Record()
        {
            // ARRANGE
            Mock <ILogger <VirtualBridgeData> > loggerMock =
                MockFactory.CreateLoggerMock <VirtualBridgeData>();
            Mock <ILogger <AuditHeaderRepository> > auditHeaderRepositoryLoggerMock =
                MockFactory.CreateLoggerMock <AuditHeaderRepository>();
            DbContextOptions <DataContext> dbOptions =
                TestUtils.DbContextOptionsInMemory <TestBeginCommit>(
                    nameof(this.Test_Commit_Writes_Record));

            await using DataContext dataContext = new DataContext(dbOptions);
            AuditHeaderRepository auditHeaderRepository = new AuditHeaderRepository(
                logger: auditHeaderRepositoryLoggerMock.Object,
                dataContext: dataContext);
            Mock <IOrganisationRepository> organisationRepositoryMock
                = MockFactory.CreateRepositoryMock <IOrganisationRepository>();

            VirtualBridgeData data = new VirtualBridgeData(
                logger: loggerMock.Object,
                dataContext: dataContext,
                auditHeaderRepository: auditHeaderRepository,
                organisationRepository: organisationRepositoryMock.Object);

            IWho who = Create.Who();

            // ACT
            IAuditHeaderWithAuditDetails auditHeader = await data.BeginTransactionAsync(
                who : who,
                auditEvent : EAuditEvent.OrganisationMaintenance)
                                                       .ConfigureAwait(false);

            auditHeader.AuditDetails.Add(
                AuditDetail.CreateForCreate(
                    auditHeader: auditHeader,
                    tableName: "Organisation",
                    columnName: "Name",
                    recordId: Guid.NewGuid(),
                    newValue: "NewValue"));

            await data.CommitTransactionAsync(who, auditHeader)
            .ConfigureAwait(false);

            // ASSERT
            int auditHeadersCount = await dataContext.AuditHeaders.CountAsync()
                                    .ConfigureAwait(false);

            int auditDetailsCount = await dataContext.AuditDetails.CountAsync()
                                    .ConfigureAwait(false);

            Assert.AreEqual(1, auditHeadersCount);
            Assert.AreEqual(1, auditDetailsCount);
        }
示例#8
0
        /// <inheritdoc />
        public Task CreateAsync(
            IWho who,
            EAuditEvent auditEvent,
            IOrganisation organisation)
        {
            if (who == null)
            {
                throw new ArgumentNullException(nameof(who));
            }

            if (organisation == null)
            {
                throw new ArgumentNullException(nameof(organisation));
            }

            return(CreateOrganisationInternalAsync());

            async Task CreateOrganisationInternalAsync()
            {
                this.logger.LogTrace(
                    "ENTRY {Method}(who, organisation) {@Who} {@Organisation}",
                    nameof(this.CreateAsync),
                    who,
                    organisation);

                try
                {
                    IAuditHeaderWithAuditDetails auditHeader = await this.data.BeginTransactionAsync(
                        who, auditEvent)
                                                               .ConfigureAwait(false);

                    await this.data.Organisation.CreateAsync(
                        who : who,
                        auditHeader : auditHeader,
                        organisation : organisation)
                    .ConfigureAwait(false);

                    await this.data.CommitTransactionAsync(who, auditHeader)
                    .ConfigureAwait(false);
                }
                catch (Exception)
                {
                    this.data.RollbackTransaction(who);
                    throw;
                }

                this.logger.LogTrace(
                    "EXIT {Method}(who) {@Who}",
                    nameof(this.CreateAsync),
                    who);
            }
        }
示例#9
0
        /// <summary>
        /// Converts to DTO with AuditDetails.
        /// </summary>
        /// <param name="auditHeader">Audit Header.</param>
        /// <returns>Audit Header DTO with Audit Details.</returns>
        public static AuditHeaderDto ToDtoWithAuditDetails(
            IAuditHeaderWithAuditDetails auditHeader)
        {
            if (auditHeader == null)
            {
                throw new ArgumentNullException(nameof(auditHeader));
            }

            return(new AuditHeaderDto(
                       id: auditHeader.Id,
                       auditEvent: auditHeader.AuditEvent,
                       timeStamp: auditHeader.TimeStamp,
                       username: auditHeader.Username,
                       correlationId: auditHeader.CorrelationId,
                       auditDetails: auditHeader.AuditDetails.Select(AuditDetailDto.ToDto).ToList()));
        }
示例#10
0
        /// <inheritdoc/>
        public async Task CreateMeetingAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader,
            IMeeting meeting)
        {
            this.logger.ReportEntry(
                who,
                new { Meeting = meeting });

            MeetingDto dto = MeetingDto.ToDto(meeting);

            this.context.Meetings.Add(dto);
            await this.context.SaveChangesAsync().ConfigureAwait(false);

            Audit.AuditCreate(auditHeader, dto, dto.Id);

            this.logger.ReportExit(who);
        }
示例#11
0
        /// <inheritdoc/>
        public async Task CreateCommitteeAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader,
            ICommittee committee)
        {
            this.logger.ReportEntry(
                who,
                new { Committee = committee });

            CommitteeDto dto = CommitteeDto.ToDto(committee);

            this.context.Committees.Add(dto);
            await this.context.SaveChangesAsync().ConfigureAwait(false);

            Audit.AuditCreate(auditHeader, dto, dto.Id);

            this.logger.ReportExit(who);
        }
示例#12
0
        /// <inheritdoc />
        public async Task CreateOrganisationAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader,
            IOrganisation organisation)
        {
            this.logger.ReportEntry(
                who,
                new { Organisation = organisation });

            OrganisationDto dto = OrganisationDto.ToDto(organisation);

            this.context.Organisations.Add(dto);
            await this.context.SaveChangesAsync().ConfigureAwait(false);

            Audit.AuditCreate(auditHeader, dto, dto.Id);

            this.logger.ReportExit(who);
        }
示例#13
0
        /// <inheritdoc/>
        public async Task UpdateCommitteeAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader,
            ICommittee committee)
        {
            this.logger.ReportEntry(
                who,
                new { Committee = committee });

            CommitteeDto dto      = CommitteeDto.ToDto(committee);
            CommitteeDto original = await this.context.FindAsync <CommitteeDto>(committee.Id);

            Audit.AuditUpdate(auditHeader, dto.Id, original, dto);

            this.context.Entry(original).CurrentValues.SetValues(dto);
            await this.context.SaveChangesAsync().ConfigureAwait(false);

            this.logger.ReportExit(who);
        }
示例#14
0
        /// <inheritdoc/>
        public async Task UpdateMeetingAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader,
            IMeeting meeting)
        {
            this.logger.ReportEntry(
                who,
                new { Meeting = meeting });

            MeetingDto dto      = MeetingDto.ToDto(meeting);
            MeetingDto original = await this.context.FindAsync <MeetingDto>(meeting.Id);

            Audit.AuditUpdate(auditHeader, dto.Id, original, dto);

            this.context.Entry(original).CurrentValues.SetValues(dto);
            await this.context.SaveChangesAsync().ConfigureAwait(false);

            this.logger.ReportExit(who);
        }
示例#15
0
        /// <inheritdoc/>
        public async Task UpdateAgendaItemAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader,
            IAgendaItem agendaItem)
        {
            this.logger.ReportEntry(
                who,
                new { AgendaItem = agendaItem });

            AgendaItemDto dto      = AgendaItemDto.ToDto(agendaItem);
            AgendaItemDto original = await this.context.FindAsync <AgendaItemDto>(agendaItem.Id);

            Audit.AuditUpdate(auditHeader, dto.Id, original, dto);

            this.context.Entry(original).CurrentValues.SetValues(dto);
            await this.context.SaveChangesAsync().ConfigureAwait(false);

            this.logger.ReportExit(who);
        }
示例#16
0
        /// <inheritdoc/>
        public async Task UpdateOrganisationAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader,
            IOrganisation organisation)
        {
            this.logger.ReportEntry(
                who,
                new { Organisation = organisation });

            OrganisationDto dto      = OrganisationDto.ToDto(organisation);
            OrganisationDto original = await this.context.FindAsync <OrganisationDto>(organisation.Id);

            Audit.AuditUpdate(auditHeader, dto.Id, original, dto);

            this.context.Entry(original).CurrentValues.SetValues(dto);
            await this.context.SaveChangesAsync().ConfigureAwait(false);

            this.logger.ReportExit(who);
        }
示例#17
0
        /// <inheritdoc/>
        public async Task <IAgendaItem> CreateSkeletonAgendaAsync(
            IWho who,
            AuditEvent auditEvent,
            Guid meetingId,
            SkeletonAgendaType skeletonAgendaType)
        {
            this.logger.ReportEntry(
                who,
                new
            {
                AuditEvent         = auditEvent,
                MeetingId          = meetingId,
                SkeletonAgendaType = skeletonAgendaType
            });

            SkeletonAgendaFactory factory    = new SkeletonAgendaFactory();
            IAgendaItem           agendaItem = factory.Create(meetingId, skeletonAgendaType);

            try
            {
                IAuditHeaderWithAuditDetails auditHeader = this.data.BeginTransaction(auditEvent, who);

                await this.data.CreateAgendaItemRecursivelyAsync(
                    who,
                    auditHeader,
                    agendaItem).ConfigureAwait(false);

                await this.data.CommitTransactionAsync(auditHeader)
                .ConfigureAwait(false);
            }
            catch (Exception)
            {
                this.data.RollbackTransaction();
                throw;
            }

            this.logger.ReportExit(
                who,
                new { AgendaItem = agendaItem });

            return(agendaItem);
        }
示例#18
0
        /// <summary>
        /// Creates the organisation asynchronous.
        /// </summary>
        /// <param name="logger">Logger.</param>
        /// <param name="data">Data Layer.</param>
        /// <param name="who">Who details.</param>
        /// <param name="auditEvent">Audit event.</param>
        /// <param name="organisation">Organisation to create.</param>
        /// <returns>NOTHING.</returns>
        internal static async Task CreateOrganisationAsync(
            ILogger <VirtualBridgeService> logger,
            IVirtualBridgeData data,
            IWho who,
            EAuditEvent auditEvent,
            IOrganisation organisation)
        {
            logger.LogTrace(
                "ENTRY {Method}(who, organisation) {@who} {@organisation}",
                nameof(CreateOrganisationAsync),
                who,
                organisation);

            try
            {
                IAuditHeaderWithAuditDetails auditHeader =
                    await data.BeginTransactionAsync(who, auditEvent)
                    .ConfigureAwait(false);

                await data.Organisation.CreateAsync(
                    who : who,
                    auditHeader : auditHeader,
                    organisation : organisation)
                .ConfigureAwait(false);

                await data.CommitTransactionAsync(who, auditHeader)
                .ConfigureAwait(false);
            }
            catch (Exception)
            {
                data.RollbackTransaction(who);
                throw;
            }

            logger.LogTrace(
                "EXIT {Method}(who) {@who}",
                nameof(CreateOrganisationAsync),
                who);
        }
        /// <inheritdoc />
        public async Task CreateAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader)
        {
            this.logger.LogTrace(
                "ENTRY {Method}(who, auditHeader) {@Who} {@AuditHeader}",
                nameof(this.CreateAsync),
                who,
                auditHeader);

            AuditHeaderDto auditHeaderDto =
                AuditHeaderDto.ToDtoWithAuditDetails(auditHeader);

            this.context.AuditHeaders.Add(auditHeaderDto);
            await this.context.SaveChangesAsync()
            .ConfigureAwait(false);

            this.logger.LogTrace(
                "EXIT {Method}(who) {@Who}",
                nameof(this.CreateAsync),
                who);
        }
示例#20
0
        /// <inheritdoc/>
        public async Task CreateAsync(
            IWho who,
            IAuditHeaderWithAuditDetails auditHeader,
            ICompetition competition)
        {
            this.logger.LogTrace(
                "ENTRY {Method}(who, organisation) {@Who} {@Competition}",
                nameof(this.CreateAsync),
                who,
                competition);

            CompetitionDto dto = CompetitionDto.ToDto(competition);

            this.context.Competitions.Add(dto);
            await this.context.SaveChangesAsync().ConfigureAwait(false);

            Audit.AuditCreate(auditHeader, dto, dto.Id);

            this.logger.LogTrace(
                "EXIT {Method}(who) {@Who}",
                nameof(this.CreateAsync),
                who);
        }
示例#21
0
        public async Task Test_Rollback_Does_Not_Thorw_Exception()
        {
            // ARRANGE
            Mock <ILogger <VirtualBridgeData> > loggerMock =
                MockFactory.CreateLoggerMock <VirtualBridgeData>();
            DbContextOptions <DataContext> dbOptions =
                TestUtils.DbContextOptionsInMemory <TestBeginCommit>(
                    nameof(this.Test_Rollback_Does_Not_Thorw_Exception));

            await using DataContext dataContext = new DataContext(dbOptions);
            Mock <IAuditHeaderRepository> auditHeaderRepositoryMock
                = MockFactory.CreateRepositoryMock <IAuditHeaderRepository>();
            Mock <IOrganisationRepository> organisationRepositoryMock
                = MockFactory.CreateRepositoryMock <IOrganisationRepository>();

            VirtualBridgeData data = new VirtualBridgeData(
                logger: loggerMock.Object,
                dataContext: dataContext,
                auditHeaderRepository: auditHeaderRepositoryMock.Object,
                organisationRepository: organisationRepositoryMock.Object);

            IWho who = Create.Who();

            // ACT
            IAuditHeaderWithAuditDetails auditHeader = await data.BeginTransactionAsync(
                who : who,
                auditEvent : EAuditEvent.OrganisationMaintenance)
                                                       .ConfigureAwait(false);

            data.RollbackTransaction(who);

            await data.CommitTransactionAsync(who, auditHeader)
            .ConfigureAwait(false);

            // ASSERT
            Assert.IsTrue(true);
        }