namespace GmRelay.Web.Services; public sealed class AuthorizedSessionService(ISessionStore sessionStore) { public Task> GetGroupsForGmAsync(long gmId) => sessionStore.GetGroupsForGmAsync(gmId); public async Task?> GetUpcomingSessionsForGmAsync(Guid groupId, long gmId) { if (!await GroupBelongsToGmAsync(groupId, gmId)) { return null; } return await sessionStore.GetUpcomingSessionsAsync(groupId); } public async Task GetSessionForGmAsync(Guid sessionId, long gmId) { var session = await sessionStore.GetSessionAsync(sessionId); if (session is null) { return null; } return await GroupBelongsToGmAsync(session.GroupId, gmId) ? session : null; } public async Task UpdateSessionForGmAsync(Guid sessionId, long gmId, string title, DateTime scheduledAt, string joinLink) { var session = await GetSessionForGmAsync(sessionId, gmId); if (session is null) { throw new SessionAccessDeniedException(sessionId, gmId); } await sessionStore.UpdateSessionAsync(sessionId, session.GroupId, title, scheduledAt, joinLink); } private async Task GroupBelongsToGmAsync(Guid groupId, long gmId) { var group = await sessionStore.GetGroupAsync(groupId); return group?.GmTelegramId == gmId; } }