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)); }
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); } }
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; }