mirror of
https://github.com/bitwarden/server
synced 2026-01-04 17:43:53 +00:00
Resolve review feedback
This commit is contained in:
@@ -62,7 +62,11 @@ BEGIN
|
||||
SET NOCOUNT ON
|
||||
|
||||
SELECT
|
||||
*
|
||||
[Id],
|
||||
[PlayId],
|
||||
[UserId],
|
||||
[OrganizationId],
|
||||
[CreationDate]
|
||||
FROM
|
||||
[dbo].[PlayData]
|
||||
WHERE
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
namespace Bit.Seeder;
|
||||
|
||||
/// <summary>
|
||||
/// Helper for mangling IDs
|
||||
/// Helper for generating unique identifier suffixes to prevent collisions in test data.
|
||||
/// "Mangling" adds a random suffix to test data identifiers (usernames, emails, org names, etc.)
|
||||
/// to ensure uniqueness across multiple test runs and parallel test executions.
|
||||
/// </summary>
|
||||
public class MangleId
|
||||
{
|
||||
|
||||
@@ -1,8 +1,17 @@
|
||||
namespace Bit.Seeder;
|
||||
|
||||
/// <summary>
|
||||
/// Helper for exposing a <see cref="IScene" /> interface with a SeedAsync method.
|
||||
/// </summary>
|
||||
public class SceneResult(Dictionary<string, string?> mangleMap)
|
||||
: SceneResult<object?>(result: null, mangleMap: mangleMap);
|
||||
|
||||
/// <summary>
|
||||
/// Generic result from executing a Scene.
|
||||
/// Contains custom scene-specific data and a mangle map that maps magic strings from the
|
||||
/// request to their mangled (collision-free) values inserted into the database.
|
||||
/// </summary>
|
||||
/// <typeparam name="TResult">The type of custom result data returned by the scene.</typeparam>
|
||||
public class SceneResult<TResult>(TResult result, Dictionary<string, string?> mangleMap)
|
||||
{
|
||||
public TResult Result { get; init; } = result;
|
||||
|
||||
@@ -23,44 +23,7 @@ public class QueryService(
|
||||
|
||||
var requestType = query.GetRequestType();
|
||||
|
||||
// Deserialize the arguments into the request model
|
||||
object? requestModel;
|
||||
if (arguments == null)
|
||||
{
|
||||
// Try to create an instance with default values
|
||||
try
|
||||
{
|
||||
requestModel = Activator.CreateInstance(requestType);
|
||||
if (requestModel == null)
|
||||
{
|
||||
throw new QueryExecutionException(
|
||||
$"Arguments are required for query '{queryName}'");
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw new QueryExecutionException(
|
||||
$"Arguments are required for query '{queryName}'");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
requestModel = JsonSerializer.Deserialize(arguments.Value.GetRawText(), requestType, _jsonOptions);
|
||||
if (requestModel == null)
|
||||
{
|
||||
throw new QueryExecutionException(
|
||||
$"Failed to deserialize request model for query '{queryName}'");
|
||||
}
|
||||
}
|
||||
catch (JsonException ex)
|
||||
{
|
||||
throw new QueryExecutionException(
|
||||
$"Failed to deserialize request model for query '{queryName}': {ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
var requestModel = DeserializeRequestModel(queryName, requestType, arguments);
|
||||
var result = query.Execute(requestModel);
|
||||
|
||||
logger.LogInformation("Successfully executed query: {QueryName}", queryName);
|
||||
@@ -74,4 +37,47 @@ public class QueryService(
|
||||
ex.InnerException ?? ex);
|
||||
}
|
||||
}
|
||||
|
||||
private object DeserializeRequestModel(string queryName, Type requestType, JsonElement? arguments)
|
||||
{
|
||||
if (arguments == null)
|
||||
{
|
||||
return CreateDefaultRequestModel(queryName, requestType);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var requestModel = JsonSerializer.Deserialize(arguments.Value.GetRawText(), requestType, _jsonOptions);
|
||||
if (requestModel == null)
|
||||
{
|
||||
throw new QueryExecutionException(
|
||||
$"Failed to deserialize request model for query '{queryName}'");
|
||||
}
|
||||
return requestModel;
|
||||
}
|
||||
catch (JsonException ex)
|
||||
{
|
||||
throw new QueryExecutionException(
|
||||
$"Failed to deserialize request model for query '{queryName}': {ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private object CreateDefaultRequestModel(string queryName, Type requestType)
|
||||
{
|
||||
try
|
||||
{
|
||||
var requestModel = Activator.CreateInstance(requestType);
|
||||
if (requestModel == null)
|
||||
{
|
||||
throw new QueryExecutionException(
|
||||
$"Arguments are required for query '{queryName}'");
|
||||
}
|
||||
return requestModel;
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw new QueryExecutionException(
|
||||
$"Arguments are required for query '{queryName}'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +54,12 @@ public class Startup
|
||||
IHostApplicationLifetime appLifetime,
|
||||
GlobalSettings globalSettings)
|
||||
{
|
||||
if (env.IsProduction())
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"SeederApi cannot be run in production environments. This service is intended for test data generation only.");
|
||||
}
|
||||
|
||||
if (globalSettings.TestPlayIdTrackingEnabled)
|
||||
{
|
||||
app.UseMiddleware<PlayIdMiddleware>();
|
||||
|
||||
Reference in New Issue
Block a user