Skip to content

Commit c8b4e53

Browse files
committed
update identity pages
1 parent 074b950 commit c8b4e53

File tree

14 files changed

+2795
-576
lines changed

14 files changed

+2795
-576
lines changed

src/Modules/Multitenancy/Modules.Multitenancy/Features/v1/CreateTenant/CreateTenantEndpoint.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ public static RouteHandlerBuilder Map(this IEndpointRouteBuilder endpoints)
1616
return endpoints.MapPost("/", async (
1717
[FromBody] CreateTenantCommand command,
1818
[FromServices] IMediator mediator)
19-
=> Results.Accepted(string.Empty, await mediator.Send(command)))
19+
=> TypedResults.Ok(await mediator.Send(command)))
2020
.WithName("CreateTenant")
2121
.WithSummary("Create tenant")
2222
.RequirePermission(MultitenancyConstants.Permissions.Create)
23-
.WithDescription("Create a new tenant.");
23+
.WithDescription("Create a new tenant.")
24+
.Produces<CreateTenantCommandResponse>(StatusCodes.Status200OK);
2425
}
2526
}

src/Modules/Multitenancy/Modules.Multitenancy/Services/TenantService.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public async Task<string> DeactivateAsync(string id)
112112
throw new CustomException("At least one active tenant is required.");
113113
}
114114

115-
if (!tenant.Id.Equals(MultitenancyConstants.Root.Id, StringComparison.OrdinalIgnoreCase))
115+
if (tenant.Id.Equals(MultitenancyConstants.Root.Id, StringComparison.OrdinalIgnoreCase))
116116
{
117117
throw new CustomException("The root tenant cannot be deactivated.");
118118
}
@@ -160,7 +160,13 @@ public async Task<TenantStatusDto> GetStatusAsync(string id)
160160
public async Task<DateTime> UpgradeSubscription(string id, DateTime extendedExpiryDate)
161161
{
162162
var tenant = await GetTenantInfoAsync(id).ConfigureAwait(false);
163-
tenant.SetValidity(extendedExpiryDate);
163+
164+
// Ensure the date is UTC for PostgreSQL compatibility
165+
var utcExpiryDate = extendedExpiryDate.Kind == DateTimeKind.Utc
166+
? extendedExpiryDate
167+
: DateTime.SpecifyKind(extendedExpiryDate, DateTimeKind.Utc);
168+
169+
tenant.SetValidity(utcExpiryDate);
164170
await _tenantStore.UpdateAsync(tenant).ConfigureAwait(false);
165171
return tenant.ValidUpto;
166172
}

src/Playground/Playground.Blazor/Components/Layout/NavMenu.razor

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
@using FSH.Framework.Shared.Constants
2+
@using FSH.Framework.Shared.Multitenancy
3+
@using Microsoft.AspNetCore.Components.Authorization
14
@inject NavigationManager Navigation
5+
@inject AuthenticationStateProvider AuthenticationStateProvider
26

37
<nav class="fsh-nav">
48
<MudNavMenu Class="pa-2" Rounded="true" Margin="Margin.Dense" Color="Color.Primary">
@@ -19,14 +23,17 @@
1923
</MudNavLink>
2024
</MudNavGroup>
2125

22-
<MudNavGroup Title="Tenants" Icon="@Icons.Material.Outlined.Business" Expanded="false">
23-
<MudNavLink Href="/tenants" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Outlined.CorporateFare">
24-
Tenants
25-
</MudNavLink>
26-
<MudNavLink Href="/tenants/settings" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Outlined.Tune">
27-
Tenant Settings
28-
</MudNavLink>
29-
</MudNavGroup>
26+
@if (_isRootTenantAdmin)
27+
{
28+
<MudNavGroup Title="Tenants" Icon="@Icons.Material.Outlined.Business" Expanded="false">
29+
<MudNavLink Href="/tenants" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Outlined.CorporateFare">
30+
Tenants
31+
</MudNavLink>
32+
<MudNavLink Href="/tenants/settings" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Outlined.Tune">
33+
Tenant Settings
34+
</MudNavLink>
35+
</MudNavGroup>
36+
}
3037

3138
<MudNavLink Href="/audits" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Outlined.History">
3239
Audit Logs
@@ -76,4 +83,37 @@
7683
</nav>
7784

7885
@code {
86+
private bool _isRootTenantAdmin;
87+
88+
protected override async Task OnInitializedAsync()
89+
{
90+
await CheckRootTenantAdmin();
91+
}
92+
93+
private async Task CheckRootTenantAdmin()
94+
{
95+
try
96+
{
97+
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
98+
var user = authState.User;
99+
100+
if (user.Identity?.IsAuthenticated != true)
101+
{
102+
_isRootTenantAdmin = false;
103+
return;
104+
}
105+
106+
var tenant = user.FindFirst(CustomClaims.Tenant)?.Value;
107+
var isRootTenant = string.Equals(tenant, MultitenancyConstants.Root.Id, StringComparison.OrdinalIgnoreCase);
108+
109+
var roles = user.FindAll(System.Security.Claims.ClaimTypes.Role).Select(c => c.Value).ToList();
110+
var isAdmin = roles.Any(r => string.Equals(r, RoleConstants.Admin, StringComparison.OrdinalIgnoreCase));
111+
112+
_isRootTenantAdmin = isRootTenant && isAdmin;
113+
}
114+
catch
115+
{
116+
_isRootTenantAdmin = false;
117+
}
118+
}
79119
}

0 commit comments

Comments
 (0)