Add player count fields with validation and labeled UX

This commit is contained in:
2026-01-29 01:53:24 +01:00
parent f713756ece
commit af84fc50d4
10 changed files with 415 additions and 32 deletions

View File

@@ -29,13 +29,15 @@ public static class SuggestEndpoints
s.ScreenshotUrl,
s.YoutubeUrl,
s.GameUrl,
s.CreatedAt
s.CreatedAt,
s.MinPlayers,
s.MaxPlayers
})
.ToListAsync();
var ordered = mine
.OrderBy(s => s.CreatedAt)
.Select(s => new SuggestionDto(s.Id, s.Name, s.Genre, s.Description, s.ScreenshotUrl, s.YoutubeUrl, s.GameUrl));
.Select(s => new SuggestionDto(s.Id, s.Name, s.Genre, s.Description, s.ScreenshotUrl, s.YoutubeUrl, s.GameUrl, s.MinPlayers, s.MaxPlayers));
return Results.Ok(ordered);
});
@@ -60,6 +62,9 @@ public static class SuggestEndpoints
return Results.BadRequest(new { error = "Screenshot URL could not be validated as an image." });
}
if (!ValidatePlayers(request.MinPlayers, request.MaxPlayers, out var playersError))
return Results.BadRequest(new { error = playersError });
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null) return Results.Unauthorized();
@@ -82,7 +87,9 @@ public static class SuggestEndpoints
Description = EndpointHelpers.TrimTo(request.Description, 500),
ScreenshotUrl = EndpointHelpers.TrimTo(request.ScreenshotUrl, 2048),
YoutubeUrl = EndpointHelpers.TrimTo(request.YoutubeUrl, 2048),
GameUrl = EndpointHelpers.TrimTo(request.GameUrl, 2048)
GameUrl = EndpointHelpers.TrimTo(request.GameUrl, 2048),
MinPlayers = request.MinPlayers,
MaxPlayers = request.MaxPlayers
};
db.Suggestions.Add(suggestion);
@@ -136,6 +143,9 @@ public static class SuggestEndpoints
return Results.BadRequest(new { error = "Screenshot URL could not be validated as an image." });
}
if (!ValidatePlayers(request.MinPlayers, request.MaxPlayers, out var playersError))
return Results.BadRequest(new { error = playersError });
var suggestion = await db.Suggestions.FirstOrDefaultAsync(s => s.Id == id);
if (suggestion == null) return Results.NotFound(new { error = "Suggestion not found." });
@@ -151,6 +161,8 @@ public static class SuggestEndpoints
suggestion.ScreenshotUrl = EndpointHelpers.TrimTo(request.ScreenshotUrl, 2048);
suggestion.YoutubeUrl = EndpointHelpers.TrimTo(request.YoutubeUrl, 2048);
suggestion.GameUrl = EndpointHelpers.TrimTo(request.GameUrl, 2048);
suggestion.MinPlayers = request.MinPlayers;
suggestion.MaxPlayers = request.MaxPlayers;
await db.SaveChangesAsync();
@@ -162,7 +174,9 @@ public static class SuggestEndpoints
suggestion.Description,
suggestion.ScreenshotUrl,
suggestion.YoutubeUrl,
suggestion.GameUrl
suggestion.GameUrl,
suggestion.MinPlayers,
suggestion.MaxPlayers
});
});
@@ -186,6 +200,8 @@ public static class SuggestEndpoints
s.ScreenshotUrl,
s.YoutubeUrl,
s.GameUrl,
s.MinPlayers,
s.MaxPlayers,
Author = s.Player!.DisplayName,
s.CreatedAt
})
@@ -202,10 +218,44 @@ public static class SuggestEndpoints
s.ScreenshotUrl,
s.YoutubeUrl,
s.GameUrl,
s.MinPlayers,
s.MaxPlayers,
s.Author
});
return Results.Ok(ordered);
});
}
private static bool ValidatePlayers(int? minPlayers, int? maxPlayers, out string? error)
{
error = null;
if (minPlayers is null && maxPlayers is null) return true;
if (minPlayers is not null && (minPlayers < 1 || minPlayers > 32))
{
error = "Min players must be between 1 and 32.";
return false;
}
if (maxPlayers is not null && (maxPlayers < 1 || maxPlayers > 32))
{
error = "Max players must be between 1 and 32.";
return false;
}
if (minPlayers is null || maxPlayers is null)
{
error = "Provide both min and max players.";
return false;
}
if (minPlayers > maxPlayers)
{
error = "Min players cannot exceed max players.";
return false;
}
return true;
}
}