feat: add public club pages
PR Checks / test-and-build (pull_request) Successful in 12m47s

Add publication settings for clubs and sessions, read-only public club/session pages, dashboard controls, privacy-focused public queries, docs, and tests.

Bump version to 3.3.0
This commit is contained in:
2026-05-28 12:23:47 +03:00
parent fac5d75c7e
commit 3418d1a46c
18 changed files with 1239 additions and 24 deletions
@@ -786,6 +786,9 @@ public sealed class AuthorizedSessionServiceTests
public bool CreateBatchFromTemplateCalled { get; private set; }
public bool AddCoGmCalled { get; private set; }
public bool RemoveCoGmCalled { get; private set; }
public bool UpdatePublicGroupSettingsCalled { get; private set; }
public bool SetSessionPublicCalled { get; private set; }
public bool SetBatchPublicCalled { get; private set; }
public Guid? LastUpdatedSessionId { get; private set; }
public Guid? LastUpdatedGroupId { get; private set; }
public string? LastUpdatedTitle { get; private set; }
@@ -821,6 +824,15 @@ public sealed class AuthorizedSessionServiceTests
public string? LastAddedCoGmUsername { get; private set; }
public Guid? LastRemovedCoGmGroupId { get; private set; }
public long? LastRemovedCoGmTelegramId { get; private set; }
public Guid? LastUpdatedPublicGroupId { get; private set; }
public string? LastUpdatedPublicSlug { get; private set; }
public bool? LastUpdatedPublicScheduleEnabled { get; private set; }
public Guid? LastPublicSessionId { get; private set; }
public Guid? LastPublicSessionGroupId { get; private set; }
public bool? LastSessionPublicValue { get; private set; }
public Guid? LastPublicBatchId { get; private set; }
public Guid? LastPublicBatchGroupId { get; private set; }
public bool? LastBatchPublicValue { get; private set; }
public bool RemovePlayerCalled { get; private set; }
public Guid? LastRemovedPlayerSessionId { get; private set; }
public Guid? LastRemovedPlayerGroupId { get; private set; }
@@ -842,6 +854,67 @@ public sealed class AuthorizedSessionServiceTests
return Task.FromResult(group);
}
public Task<WebPublicGroupSettings?> GetPublicGroupSettingsAsync(Guid groupId)
{
if (!groupsById.TryGetValue(groupId, out var group))
{
return Task.FromResult<WebPublicGroupSettings?>(null);
}
var publicSessionCount = sessionsById.Values.Count(session => session.GroupId == groupId && session.IsPublic);
return Task.FromResult<WebPublicGroupSettings?>(new(
groupId,
group.Name,
"alpha",
false,
publicSessionCount));
}
public Task UpdatePublicGroupSettingsAsync(Guid groupId, string? publicSlug, bool publicScheduleEnabled)
{
UpdatePublicGroupSettingsCalled = true;
LastUpdatedPublicGroupId = groupId;
LastUpdatedPublicSlug = publicSlug;
LastUpdatedPublicScheduleEnabled = publicScheduleEnabled;
return Task.CompletedTask;
}
public Task SetSessionPublicAsync(Guid sessionId, Guid groupId, bool isPublic)
{
SetSessionPublicCalled = true;
LastPublicSessionId = sessionId;
LastPublicSessionGroupId = groupId;
LastSessionPublicValue = isPublic;
if (sessionsById.TryGetValue(sessionId, out var session))
{
sessionsById[sessionId] = session with { IsPublic = isPublic };
}
return Task.CompletedTask;
}
public Task SetBatchPublicAsync(Guid batchId, Guid groupId, bool isPublic)
{
SetBatchPublicCalled = true;
LastPublicBatchId = batchId;
LastPublicBatchGroupId = groupId;
LastBatchPublicValue = isPublic;
foreach (var session in sessionsById.Values.Where(session => session.BatchId == batchId && session.GroupId == groupId).ToList())
{
sessionsById[session.Id] = session with { IsPublic = isPublic };
}
return Task.CompletedTask;
}
public Task<WebPublicClub?> GetPublicClubBySlugAsync(string slug) =>
Task.FromResult<WebPublicClub?>(null);
public Task<WebPublicSession?> GetPublicSessionAsync(Guid sessionId) =>
Task.FromResult<WebPublicSession?>(null);
public Task<bool> IsGroupManagerAsync(Guid groupId, long telegramId) =>
Task.FromResult(IsManager(groupId, telegramId));