Add calendar integrations and collaboration updates
Some checks failed
Backend CI/CD / build_and_deploy (push) Has been cancelled
Frontend CI/CD / build_and_deploy (push) Has been cancelled

This commit is contained in:
2026-05-05 15:25:53 -04:00
parent c49f03ec06
commit b66c10b681
82 changed files with 8420 additions and 2048 deletions

View File

@@ -44,13 +44,15 @@ public class GetOrganizationHandler(
IReadOnlyCollection<OrganizationMemberDto> members = await GetMembersAsync(organizationId, ct);
IReadOnlyCollection<WorkspaceDto> workspaces = await GetWorkspacesAsync(organizationId, ct);
OrganizationUsageDto usage = await GetUsageAsync(organization, ct);
await SendOkAsync(
OrganizationDto.FromOrganization(
organization,
currentUserPermissions,
members,
workspaces),
workspaces,
usage),
ct);
}
@@ -96,6 +98,57 @@ public class GetOrganizationHandler(
.ToArray();
}
private async Task<OrganizationUsageDto> GetUsageAsync(
Organization organization,
CancellationToken ct)
{
Guid[] workspaceIds = await dbContext.Workspaces
.Where(workspace => workspace.OrganizationId == organization.Id)
.Select(workspace => workspace.Id)
.ToArrayAsync(ct);
Guid[] memberUserIds = await dbContext.OrganizationMemberships
.Where(membership => membership.OrganizationId == organization.Id)
.Select(membership => membership.UserId)
.Distinct()
.ToArrayAsync(ct);
int userCount = memberUserIds
.Append(organization.OwnerUserId)
.Distinct()
.Count();
int activeContentItemCount = workspaceIds.Length == 0
? 0
: await dbContext.ContentItems
.Where(contentItem => workspaceIds.Contains(contentItem.WorkspaceId) &&
contentItem.Status != "Approved" &&
contentItem.Status != "Scheduled")
.CountAsync(ct);
OrganizationUsageLimits limits = GetUsageLimits(organization.Name);
return new OrganizationUsageDto(
limits.PlanName,
[
new OrganizationUsageItemDto("users", userCount, limits.UserLimit),
new OrganizationUsageItemDto("workspaces", workspaceIds.Length, limits.WorkspaceLimit),
new OrganizationUsageItemDto("activeContent", activeContentItemCount, limits.ActiveContentLimit),
]);
}
private static OrganizationUsageLimits GetUsageLimits(string organizationName)
{
return string.Equals(organizationName, "Northstar Agency", StringComparison.OrdinalIgnoreCase)
? new OrganizationUsageLimits("Agency", 25, 15, 250)
: new OrganizationUsageLimits("Free", 2, 1, 3);
}
private sealed record OrganizationUsageLimits(
string PlanName,
int UserLimit,
int WorkspaceLimit,
int ActiveContentLimit);
private static string BuildDisplayName(User user)
{
if (!string.IsNullOrWhiteSpace(user.Alias))