Skip to content

Commit fef756e

Browse files
committed
Fixed some tenant scoping on searches.
1 parent 942f634 commit fef756e

14 files changed

Lines changed: 62 additions & 36 deletions

File tree

Shuttle.Access.Application/Shuttle.Access.Application.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
<PropertyGroup>
3434
<Description>Application concern implementations such as Shuttle.Mediator participants.</Description>
35-
<Version>9.0.6</Version>
35+
<Version>9.0.7</Version>
3636
<Authors>Eben Roux</Authors>
3737
<Company>Shuttle</Company>
3838
<Copyright>Copyright (c) 2025, Eben Roux</Copyright>

Shuttle.Access.AspNetCore/Shuttle.Access.AspNetCore.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
<PropertyGroup>
3535
<Description>Authorization middleware for web API endpoints using Shuttle.Access.</Description>
36-
<Version>9.0.6</Version>
36+
<Version>9.0.7</Version>
3737
<Authors>Eben Roux</Authors>
3838
<Company>Shuttle</Company>
3939
<Copyright>Copyright (c) 2025, Eben Roux</Copyright>

Shuttle.Access.Messages/Shuttle.Access.Messages.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
<PropertyGroup>
2929
<Description>Messages for use in Shuttle.Access implementations.</Description>
30-
<Version>9.0.6</Version>
30+
<Version>9.0.7</Version>
3131
<Authors>Eben Roux</Authors>
3232
<Company>Shuttle</Company>
3333
<Copyright>Copyright (c) 2025, Eben Roux</Copyright>

Shuttle.Access.RestClient/Shuttle.Access.RestClient.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
<PropertyGroup>
3535
<Description>A client used to interact with the restful Shuttle.Access web API.</Description>
36-
<Version>9.0.6</Version>
36+
<Version>9.0.7</Version>
3737
<Authors>Eben Roux</Authors>
3838
<Company>Shuttle</Company>
3939
<Copyright>Copyright (c) 2025, Eben Roux</Copyright>

Shuttle.Access.SqlServer/IdentityQuery.cs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -95,68 +95,68 @@ public async Task<IEnumerable<Guid>> TenantIdsAsync(Query.Identity.Specification
9595
});
9696
}
9797

98-
private IQueryable<Models.Identity> GetQueryable(Query.Identity.Specification identitySpecification)
98+
private IQueryable<Models.Identity> GetQueryable(Query.Identity.Specification specification)
9999
{
100100
var queryable = _accessDbContext.Identities
101101
.AsNoTracking();
102102

103-
queryable = identitySpecification.ShouldIncludeTenants
103+
queryable = specification.ShouldIncludeTenants
104104
? queryable.Include(item => item.IdentityTenants).ThenInclude(item => item.Tenant)
105105
: queryable;
106106

107-
queryable = identitySpecification is { ShouldIncludeRoles: true, ShouldIncludePermissions: false }
108-
? queryable.Include(item => item.IdentityRoles)
107+
queryable = specification is { ShouldIncludeRoles: true, ShouldIncludePermissions: false }
108+
? queryable.Include(item => item.IdentityRoles.Where(role => role.TenantId == specification.TenantId))
109109
.ThenInclude(item => item.Role)
110110
.ThenInclude(item => item.Tenant)
111111
: queryable;
112112

113-
queryable = identitySpecification.ShouldIncludePermissions
113+
queryable = specification.ShouldIncludePermissions
114114
? queryable.Include(item => item.IdentityRoles).ThenInclude(item => item.Role).ThenInclude(item => item.RolePermissions).ThenInclude(item => item.Permission)
115115
: queryable;
116116

117-
if (!string.IsNullOrEmpty(identitySpecification.NameMatch))
117+
if (!string.IsNullOrEmpty(specification.NameMatch))
118118
{
119-
queryable = queryable.Where(e => e.Name.Contains(identitySpecification.NameMatch) || e.Description.Contains(identitySpecification.NameMatch));
119+
queryable = queryable.Where(e => e.Name.Contains(specification.NameMatch) || e.Description.Contains(specification.NameMatch));
120120
}
121121

122-
if (!string.IsNullOrEmpty(identitySpecification.Name))
122+
if (!string.IsNullOrEmpty(specification.Name))
123123
{
124-
queryable = queryable.Where(e => e.Name == identitySpecification.Name || e.Description == identitySpecification.Name);
124+
queryable = queryable.Where(e => e.Name == specification.Name || e.Description == specification.Name);
125125
}
126126

127-
if (identitySpecification.TenantId != null)
127+
if (specification.TenantId != null)
128128
{
129-
queryable = queryable.Where(e => e.IdentityTenants.Any(it => it.TenantId == identitySpecification.TenantId));
129+
queryable = queryable.Where(e => e.IdentityTenants.Any(it => it.TenantId == specification.TenantId));
130130
}
131131

132-
if (!string.IsNullOrEmpty(identitySpecification.RoleName))
132+
if (!string.IsNullOrEmpty(specification.RoleName))
133133
{
134-
queryable = queryable.Where(e => e.IdentityRoles.Any(ir => ir.Role.Name == identitySpecification.RoleName));
134+
queryable = queryable.Where(e => e.IdentityRoles.Any(ir => ir.Role.Name == specification.RoleName));
135135
}
136136

137-
if (identitySpecification.RoleId != null)
137+
if (specification.RoleId != null)
138138
{
139-
queryable = queryable.Where(e => e.IdentityRoles.Any(ir => ir.RoleId == identitySpecification.RoleId));
139+
queryable = queryable.Where(e => e.IdentityRoles.Any(ir => ir.RoleId == specification.RoleId));
140140
}
141141

142-
if (identitySpecification.PermissionId != null)
142+
if (specification.PermissionId != null)
143143
{
144-
queryable = queryable.Where(e => e.IdentityRoles.Any(ir => ir.Role.RolePermissions.Any(rp => rp.PermissionId == identitySpecification.PermissionId)));
144+
queryable = queryable.Where(e => e.IdentityRoles.Any(ir => ir.Role.RolePermissions.Any(rp => rp.PermissionId == specification.PermissionId)));
145145
}
146146

147-
if (identitySpecification.HasIds)
147+
if (specification.HasIds)
148148
{
149-
queryable = queryable.Where(e => identitySpecification.Ids.Contains(e.Id));
149+
queryable = queryable.Where(e => specification.Ids.Contains(e.Id));
150150
}
151151

152-
if (identitySpecification.HasExcludedIds)
152+
if (specification.HasExcludedIds)
153153
{
154-
queryable = queryable.Where(e => !identitySpecification.ExcludedIds.Contains(e.Id));
154+
queryable = queryable.Where(e => !specification.ExcludedIds.Contains(e.Id));
155155
}
156156

157-
if (identitySpecification.MaximumRows > 0)
157+
if (specification.MaximumRows > 0)
158158
{
159-
queryable = queryable.Take(identitySpecification.MaximumRows);
159+
queryable = queryable.Take(specification.MaximumRows);
160160
}
161161

162162
return queryable.AsSplitQuery();

Shuttle.Access.SqlServer/RoleQuery.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public async ValueTask<int> CountAsync(Query.Role.Specification specification, C
3838
Id = e.Id,
3939
Name = e.Name,
4040
TenantId = e.TenantId,
41+
TenantName = e.Tenant.Name,
4142
Permissions = e.RolePermissions.Select(rolePermission => rolePermission.Permission).Select(permission => new Query.Permission
4243
{
4344
Id = permission.Id,
@@ -58,6 +59,7 @@ public async ValueTask<int> CountAsync(Query.Role.Specification specification, C
5859
{
5960
var queryable = _accessDbContext.Roles
6061
.AsNoTracking()
62+
.Include(item => item.Tenant)
6163
.Include(item => item.RolePermissions).ThenInclude(item => item.Permission)
6264
.Include(item => item.IdentityRoles).ThenInclude(item => item.Identity)
6365
.AsSplitQuery();

Shuttle.Access.SqlServer/SessionQuery.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ public async Task SaveAsync(Session session, CancellationToken cancellationToken
149149
queryable = queryable.Where(e => e.SessionPermissions.Any(p => specification.Permissions.Contains(p.Permission.Name)));
150150
}
151151

152+
if (specification.TenantId.HasValue)
153+
{
154+
queryable = queryable.Where(e => e.TenantId == specification.TenantId);
155+
}
156+
152157
return queryable;
153158
}
154159
}

Shuttle.Access.SqlServer/Shuttle.Access.SqlServer.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
<PropertyGroup>
3333
<Description>Provides a Sql Server implementation of the data access components used by Shuttle.Access.</Description>
34-
<Version>9.0.6</Version>
34+
<Version>9.0.7</Version>
3535
<Authors>Eben Roux</Authors>
3636
<Company>Shuttle</Company>
3737
<Copyright>Copyright (c) 2025, Eben Roux</Copyright>

Shuttle.Access.WebApi.Contracts/Shuttle.Access.WebApi.Contracts.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
<PropertyGroup>
1010
<Description>Shuttle.Access web API contracts.</Description>
11-
<Version>9.0.6</Version>
11+
<Version>9.0.7</Version>
1212
<Authors>Eben Roux</Authors>
1313
<Company>Shuttle</Company>
1414
<Copyright>Copyright (c) 2025, Eben Roux</Copyright>

Shuttle.Access.WebApi.Contracts/v1/Role.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ public class Role
44
{
55
public Guid Id { get; set; }
66
public string Name { get; set; } = string.Empty;
7+
public Guid TenantId { get; set; }
8+
public string TenantName { get; set; } = string.Empty;
79
public List<Permission> Permissions { get; set; } = [];
810
public List<Identity> Identities { get; set; } = [];
911

0 commit comments

Comments
 (0)