Files
RpgRoller/RpgRoller/Services/GameContextResolver.cs
2026-04-05 01:32:52 +02:00

46 lines
1.9 KiB
C#

using RpgRoller.Domain;
namespace RpgRoller.Services;
public static class GameContextResolver
{
public static UserAccount? ResolveUserLocked(GameStateStore stateStore, string sessionToken)
{
if (string.IsNullOrWhiteSpace(sessionToken))
return null;
if (!stateStore.SessionsByToken.TryGetValue(sessionToken, out var session))
return null;
return stateStore.UsersById.GetValueOrDefault(session.UserId);
}
public static ServiceResult<(UserAccount User, Campaign Campaign)> ResolveCampaignContextLocked(GameStateStore stateStore, string sessionToken, Guid campaignId)
{
var user = ResolveUserLocked(stateStore, sessionToken);
if (user is null)
return ServiceResult<(UserAccount User, Campaign Campaign)>.Failure("unauthorized", "You must be logged in.");
if (!stateStore.CampaignsById.TryGetValue(campaignId, out var campaign))
return ServiceResult<(UserAccount User, Campaign Campaign)>.Failure("campaign_not_found", "Campaign was not found.");
if (!GameAuthorization.CanViewCampaign(stateStore, user.Id, campaign.Id))
return ServiceResult<(UserAccount User, Campaign Campaign)>.Failure("forbidden", "You are not a participant in this campaign.");
return ServiceResult<(UserAccount User, Campaign Campaign)>.Success((user, campaign));
}
public static bool TryResolveCharacterCampaignLocked(GameStateStore stateStore, Character character, out Campaign campaign, out ServiceError? error)
{
campaign = default!;
if (!character.CampaignId.HasValue || !stateStore.CampaignsById.TryGetValue(character.CampaignId.Value, out var resolvedCampaign) || resolvedCampaign is null)
{
error = new("character_not_in_campaign", "Character is not linked to a campaign.");
return false;
}
campaign = resolvedCampaign;
error = null;
return true;
}
}