private bool WriteAttempt(TekReleaseWorkflowStateEntity item)
        {
            if (++_AttemptCount > AttemptCountMax)
            {
                _Logger.WriteMaximumCreateAttemptsReached();
                throw new InvalidOperationException("Maximum create attempts reached.");
            }

            if (_AttemptCount > 1)
            {
                _Logger.WriteDuplicatesFound(_AttemptCount);
            }


            item.LabConfirmationId = _LabConfirmationIdService.Next();
            item.BucketId          = _NumberGenerator.NextByteArray(_WorkflowConfig.BucketIdLength);
            item.ConfirmationKey   = _NumberGenerator.NextByteArray(_WorkflowConfig.ConfirmationKeyLength);

            try
            {
                _WorkflowDbContext.SaveAndCommit();
                _Logger.WriteCommitted();
                return(true);
            }
            catch (DbUpdateException ex)
            {
                _WorkflowDbContext.Remove(item);
                if (CanRetry(ex))
                {
                    return(false);
                }

                throw;
            }
        }
        private async Task <bool> WriteAttempt(TekReleaseWorkflowStateEntity workflowStateEntity)
        {
            if (++_attemptCount > AttemptCountMax)
            {
                throw new InvalidOperationException("Maximum attempts reached.");
            }

            if (_attemptCount > 1)
            {
                _logger.WriteDuplicatePollTokenFound(_attemptCount);
            }

            try
            {
                await _workflowDb.SaveChangesAsync();

                _logger.WritePollTokenCommit();
                return(true);
            }
            catch (DbUpdateException ex)
            {
                if (CanRetry(ex))
                {
                    return(false);
                }

                throw;
            }
        }
        public async Task <TekReleaseWorkflowStateEntity> Execute()
        {
            var entity = new TekReleaseWorkflowStateEntity
            {
                Created    = _DateTimeProvider.Snapshot.Date,
                ValidUntil = _WorkflowTime.Expiry(_DateTimeProvider.Snapshot)
            };
            await _WorkflowDbContext.KeyReleaseWorkflowStates.AddAsync(entity);

            _Logger.WriteWritingStart();

            var success = WriteAttempt(entity);

            while (!success)
            {
                entity = new TekReleaseWorkflowStateEntity
                {
                    Created    = _DateTimeProvider.Snapshot.Date,
                    ValidUntil = _WorkflowTime.Expiry(_DateTimeProvider.Snapshot)
                };
                await _WorkflowDbContext.KeyReleaseWorkflowStates.AddAsync(entity);

                success = WriteAttempt(entity);
            }

            return(entity);
        }
        private bool WriteAttempt(TekReleaseWorkflowStateEntity wf)
        {
            if (++_attemptCount > AttemptCountMax)
            {
                throw new InvalidOperationException("Maximum attempts reached.");
            }

            if (_attemptCount > 1)
            {
                _logger.WriteDuplicatePollTokenFound(_attemptCount);
            }

            wf.PollToken = _pollTokenService.Next();

            try
            {
                _workflowDb.SaveAndCommit();
                _logger.WritePollTokenCommit();
                return(true);
            }
            catch (DbUpdateException ex)
            {
                if (CanRetry(ex))
                {
                    return(false);
                }

                throw;
            }
        }
        private async Task <bool> PublishTek(TekReleaseWorkflowStateEntity workflowStateEntity)
        {
            _logger.WriteWritingPublishTek();

            var success = await WriteAttempt(workflowStateEntity);

            while (!success)
            {
                success = await WriteAttempt(workflowStateEntity);
            }

            return(success);
        }
        public string Execute(TekReleaseWorkflowStateEntity wf)
        {
            _logger.WriteWritingNewPollToken();

            var success = WriteAttempt(wf);

            while (!success)
            {
                success = WriteAttempt(wf);
            }

            return(wf.PollToken);
        }
        public FilterResult <Tek> Filter(Tek[] newKeys, TekReleaseWorkflowStateEntity workflow)
        {
            _Workflow = workflow;
            _WorkflowHasKeyOnCreationDate = _Workflow.Teks.Any(x => x.RollingStartNumber.FromRollingStartNumber().Date == _Workflow.Created.Date);

            _LastPublishedRsn = workflow.Teks
                                .Where(x => x.PublishingState == PublishingState.Published)
                                .OrderByDescending(x => x.RollingStartNumber)
                                .FirstOrDefault()?.RollingStartNumber;


            _Valid = new List <Tek>(newKeys.Length);

            var messages = newKeys.SelectMany(x => ValidateSingleTek(x).Select(y => $"{y} - RSN:{x.RollingStartNumber} KeyData:{Convert.ToBase64String(x.KeyData)}")).ToArray();

            return(new FilterResult <Tek>(_Valid.ToArray(), messages));
        }
Ejemplo n.º 8
0
        private void GenTeks(TekReleaseWorkflowStateEntity workflow)
        {
            var count = _Rng.Next(1, _Args.TekCountPerWorkflow);

            for (var i = 0; i < count; i++)
            {
                var k = new TekEntity
                {
                    Owner              = workflow,
                    PublishingState    = PublishingState.Unpublished,
                    RollingStartNumber = DateTime.UtcNow.Date.ToRollingStartNumber(),
                    RollingPeriod      = _Rng.Next(1, 144),
                    KeyData            = _Rng.NextByteArray(16),
                    PublishAfter       = DateTime.UtcNow,
                    Region             = "NL"
                };
                workflow.Teks.Add(k);
                _WorkflowDb.Set <TekEntity>().Add(k);
            }
        }
Ejemplo n.º 9
0
        public async Task AddExampleContent()
        {
            var r2 = new StandardRandomNumberGenerator();

            await using var tx = await _Provider.Database.BeginTransactionAsync();

            var wfs1 = new TekReleaseWorkflowStateEntity
            {
                LabConfirmationId = _LabConfirmationIdService.Next(),
                BucketId          = r2.NextByteArray(_WorkflowConfig.BucketIdLength),
                ConfirmationKey   = r2.NextByteArray(_WorkflowConfig.ConfirmationKeyLength),
                Created           = new DateTime(2020, 5, 1, 0, 0, 0, DateTimeKind.Utc),
            };

            var key1 = new TekEntity
            {
                Owner              = wfs1,
                PublishingState    = PublishingState.Unpublished,
                RollingPeriod      = 2,
                RollingStartNumber = DateTime.UtcNow.Date.ToRollingStartNumber(),
                KeyData            = r2.NextByteArray(_TekValidatorConfig.KeyDataLength),
                Region             = "NL"
            };


            var key2 = new TekEntity
            {
                Owner              = wfs1,
                PublishingState    = PublishingState.Unpublished,
                RollingPeriod      = 144,
                RollingStartNumber = DateTime.UtcNow.Date.ToRollingStartNumber(),
                KeyData            = r2.NextByteArray(_TekValidatorConfig.KeyDataLength),
                Region             = "NL"
            };

            await _Provider.KeyReleaseWorkflowStates.AddAsync(wfs1);

            await _Provider.TemporaryExposureKeys.AddRangeAsync(key1, key2);

            _Provider.SaveAndCommit();
        }
        private async Task WriteBucket(string pollToken)
        {
            var now = _FakeTimeProvider.Snapshot;

            var e = new TekReleaseWorkflowStateEntity
            {
                BucketId              = new byte[32],
                ValidUntil            = now.AddHours(1),
                Created               = now,
                ConfirmationKey       = new byte[32],
                AuthorisedByCaregiver = now,
                DateOfSymptomsOnset   = now.AddDays(-2),
                TeksTouched           = false,
                PollToken             = pollToken
            };

            _DbContext.KeyReleaseWorkflowStates.Add(e);
            await _DbContext.SaveChangesAsync();

            _BucketPk = e.Id;
        }