Upgrade dynamic questions to authored parity
This commit is contained in:
@@ -65,9 +65,22 @@ public sealed class DynamicQuestionService
|
||||
GeneratorVersion = DynamicQuestionGenerator.CurrentVersion,
|
||||
ExpiresUtc = DateTime.UtcNow.AddDays(7)
|
||||
};
|
||||
var generated = _generator.Generate(blueprint, claims.Seed, claims.Nonce);
|
||||
var generated = _generator.Generate(blueprint, claims.Seed, claims.Nonce, claims.GeneratorVersion);
|
||||
var familyIds = blueprint.CaseFamilies.Select(value => value.Id).ToHashSet(StringComparer.Ordinal);
|
||||
var recentForObjective = run.RecentCaseFamilyIds
|
||||
.Where(familyIds.Contains)
|
||||
.TakeLast(Math.Max(1, blueprint.CaseFamilies.Count - 1))
|
||||
.ToHashSet(StringComparer.Ordinal);
|
||||
for (var retry = 0; retry < 20 && recentForObjective.Contains(generated.CaseFamilyId); retry++)
|
||||
{
|
||||
claims.Seed = Convert.ToHexString(RandomNumberGenerator.GetBytes(16)).ToLowerInvariant();
|
||||
generated = _generator.Generate(blueprint, claims.Seed, claims.Nonce);
|
||||
}
|
||||
claims.CaseFamilyId = generated.CaseFamilyId;
|
||||
run.SeenObjectiveIds.Add(blueprint.ObjectiveId);
|
||||
run.PreviousObjectiveId = blueprint.ObjectiveId;
|
||||
run.RecentCaseFamilyIds.Add(generated.CaseFamilyId);
|
||||
run.RecentCaseFamilyIds = run.RecentCaseFamilyIds.TakeLast(30).ToList();
|
||||
run.ExpiresUtc = DateTime.UtcNow.AddDays(7);
|
||||
return new DynamicQuestionEnvelope
|
||||
{
|
||||
@@ -92,11 +105,15 @@ public sealed class DynamicQuestionService
|
||||
string generationToken)
|
||||
{
|
||||
var claims = _tokens.ReadGeneration(generationToken, userId);
|
||||
if (claims.GeneratorVersion != DynamicQuestionGenerator.CurrentVersion)
|
||||
if (claims.GeneratorVersion is < 1 or > DynamicQuestionGenerator.CurrentVersion)
|
||||
throw new InvalidOperationException("This generated question version is no longer supported.");
|
||||
var blueprint = await _store.GetAsync(claims.BlueprintExternalId, claims.BlueprintVersion)
|
||||
?? throw new KeyNotFoundException("The question blueprint is no longer available.");
|
||||
return (claims, _generator.Generate(blueprint, claims.Seed, claims.Nonce));
|
||||
var generated = _generator.Generate(blueprint, claims.Seed, claims.Nonce, claims.GeneratorVersion);
|
||||
if (!string.IsNullOrWhiteSpace(claims.CaseFamilyId)
|
||||
&& claims.CaseFamilyId != generated.CaseFamilyId)
|
||||
throw new InvalidOperationException("Generated case family does not match its signed descriptor.");
|
||||
return (claims, generated);
|
||||
}
|
||||
|
||||
private static DynamicRunClaims NewRun(string userId) => new()
|
||||
|
||||
Reference in New Issue
Block a user