using NeonSprawl.Server.Game.Items; using NeonSprawl.Server.Game.PositionState; namespace NeonSprawl.Server.Game.Quests; /// Maps POST /game/players/{{id}}/quests/{{questId}}/accept (NEO-120). public static class QuestAcceptApi { public static WebApplication MapQuestAcceptApi(this WebApplication app) { app.MapPost( "/game/players/{id}/quests/{questId}/accept", (string id, string questId, QuestAcceptRequest? body, IPositionStateStore positions, IQuestDefinitionRegistry questRegistry, IPlayerQuestStateStore progressStore, IPlayerInventoryStore inventoryStore, IItemDefinitionRegistry itemRegistry, TimeProvider timeProvider) => { if (body is not null && body.SchemaVersion != 0 && body.SchemaVersion != QuestAcceptRequest.CurrentSchemaVersion) { return Results.BadRequest(); } var trimmedId = id.Trim(); if (trimmedId.Length == 0 || !positions.TryGetPosition(trimmedId, out _)) { return Results.NotFound(); } var result = QuestStateOperations.TryAccept( trimmedId, questId, questRegistry, progressStore, inventoryStore, itemRegistry, timeProvider); return Results.Json(MapResponse(result)); }); return app; } internal static QuestAcceptResponse MapResponse(QuestStateOperationResult result) { QuestProgressRowJson? quest = null; if (result.Snapshot is { } snapshot) { quest = QuestProgressApi.MapQuestProgressRow(snapshot); } return new QuestAcceptResponse { Accepted = result.Success, ReasonCode = result.ReasonCode, Quest = quest, }; } }