Skip to content

Commit 1648b15

Browse files
committed
Introduce PermissionsService
Signed-off-by: montesm <[email protected]>
1 parent 32d62f2 commit 1648b15

File tree

3 files changed

+55
-37
lines changed

3 files changed

+55
-37
lines changed

UnityAuth/src/main/java/io/unityfoundation/auth/AuthController.java

+5-36
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.unityfoundation.auth;
22

3-
import io.micronaut.core.annotation.Introspected;
43
import io.micronaut.core.annotation.Nullable;
54
import io.micronaut.http.HttpResponse;
65
import io.micronaut.http.HttpStatus;
@@ -11,12 +10,10 @@
1110
import io.micronaut.security.rules.SecurityRule;
1211
import io.micronaut.serde.annotation.Serdeable;
1312
import io.unityfoundation.auth.entities.*;
14-
import io.unityfoundation.auth.entities.Permission.PermissionScope;
1513
import io.unityfoundation.auth.entities.Service.ServiceStatus;
1614
import jakarta.validation.constraints.NotNull;
1715
import java.util.List;
1816
import java.util.Optional;
19-
import java.util.function.BiPredicate;
2017

2118
@Secured(SecurityRule.IS_AUTHENTICATED)
2219
@Controller("/api")
@@ -26,12 +23,14 @@ public class AuthController {
2623
private final ServiceRepo serviceRepo;
2724
private final TenantRepo tenantRepo;
2825
private final RoleRepo roleRepo;
26+
private final PermissionsService permissionsService;
2927

30-
public AuthController(UserRepo userRepo, ServiceRepo serviceRepo, TenantRepo tenantRepo, RoleRepo roleRepo) {
28+
public AuthController(UserRepo userRepo, ServiceRepo serviceRepo, TenantRepo tenantRepo, RoleRepo roleRepo, PermissionsService permissionsService) {
3129
this.userRepo = userRepo;
3230
this.serviceRepo = serviceRepo;
3331
this.tenantRepo = tenantRepo;
3432
this.roleRepo = roleRepo;
33+
this.permissionsService = permissionsService;
3534
}
3635

3736
@Post("/principal/permissions")
@@ -68,7 +67,7 @@ public UserPermissionsResponse permissions(@Body UserPermissionsRequest requestD
6867
"The Tenant and/or Service is not available for this user");
6968
}
7069

71-
return new UserPermissionsResponse.Success(getPermissionsFor(user, tenant));
70+
return new UserPermissionsResponse.Success(permissionsService.getPermissionsFor(user, tenant));
7271
}
7372

7473
@Post("/hasPermission")
@@ -96,7 +95,7 @@ public HttpResponse<HasPermissionResponse> hasPermission(@Body HasPermissionRequ
9695
return createHasPermissionResponse(false, user.getEmail(), "The requested service is not enabled for the requested tenant!", List.of());
9796
}
9897

99-
List<String> commonPermissions = checkUserPermission(user, tenantOptional.get(), requestDTO.permissions());
98+
List<String> commonPermissions = permissionsService.checkUserPermission(user, tenantOptional.get(), requestDTO.permissions());
10099
if (commonPermissions.isEmpty()) {
101100
return createHasPermissionResponse(false, user.getEmail(), "The user does not have permission!", commonPermissions);
102101
}
@@ -159,28 +158,6 @@ private String checkServiceStatus(Optional<Service> service) {
159158
return null;
160159
}
161160

162-
private final BiPredicate<TenantPermission, Tenant> isTenantOrSystemOrSubtenantScopeAndBelongsToTenant = (tp, t) ->
163-
PermissionScope.SYSTEM.equals(tp.permissionScope()) || (
164-
(PermissionScope.TENANT.equals(tp.permissionScope())
165-
|| PermissionScope.SUBTENANT.equals(tp.permissionScope()))
166-
&& tp.tenantId == t.getId());
167-
168-
169-
private List<String> checkUserPermission(User user, Tenant tenant, List<String> permissions) {
170-
List<String> commonPermissions = getPermissionsFor(user, tenant).stream()
171-
.filter(permissions::contains).toList();
172-
173-
return commonPermissions;
174-
}
175-
176-
private List<String> getPermissionsFor(User user, Tenant tenant) {
177-
return userRepo.getTenantPermissionsFor(user.getId()).stream()
178-
.filter(tenantPermission ->
179-
isTenantOrSystemOrSubtenantScopeAndBelongsToTenant.test(tenantPermission, tenant))
180-
.map(TenantPermission::permissionName)
181-
.toList();
182-
}
183-
184161
private HttpResponse<HasPermissionResponse> createHasPermissionResponse(boolean hasPermission,
185162
String userEmail,
186163
String message,
@@ -209,14 +186,6 @@ public record HasPermissionResponse(
209186
List<String> permissions
210187
) {}
211188

212-
@Introspected
213-
public record TenantPermission(
214-
long tenantId,
215-
String permissionName,
216-
PermissionScope permissionScope
217-
) {}
218-
219-
220189
public sealed interface UserPermissionsResponse {
221190
@Serdeable
222191
record Success(List<String> permissions) implements UserPermissionsResponse {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.unityfoundation.auth;
2+
3+
import io.micronaut.core.annotation.Introspected;
4+
import io.unityfoundation.auth.entities.Permission;
5+
import io.unityfoundation.auth.entities.Tenant;
6+
import io.unityfoundation.auth.entities.User;
7+
import io.unityfoundation.auth.entities.UserRepo;
8+
import jakarta.inject.Singleton;
9+
10+
import java.util.List;
11+
import java.util.function.BiPredicate;
12+
13+
@Singleton
14+
public class PermissionsService {
15+
16+
private final UserRepo userRepo;
17+
18+
private final BiPredicate<TenantPermission, Tenant> isTenantOrSystemOrSubtenantScopeAndBelongsToTenant = (tp, t) ->
19+
Permission.PermissionScope.SYSTEM.equals(tp.permissionScope()) || (
20+
(Permission.PermissionScope.TENANT.equals(tp.permissionScope())
21+
|| Permission.PermissionScope.SUBTENANT.equals(tp.permissionScope()))
22+
&& tp.tenantId == t.getId());
23+
24+
public PermissionsService(UserRepo userRepo) {
25+
this.userRepo = userRepo;
26+
}
27+
28+
public List<String> checkUserPermission(User user, Tenant tenant, List<String> permissions) {
29+
return getPermissionsFor(user, tenant).stream()
30+
.filter(permissions::contains).toList();
31+
}
32+
33+
public List<String> getPermissionsFor(User user, Tenant tenant) {
34+
return userRepo.getTenantPermissionsFor(user.getId()).stream()
35+
.filter(tenantPermission ->
36+
isTenantOrSystemOrSubtenantScopeAndBelongsToTenant.test(tenantPermission, tenant))
37+
.map(TenantPermission::permissionName)
38+
.toList();
39+
}
40+
41+
@Introspected
42+
public record TenantPermission(
43+
long tenantId,
44+
String permissionName,
45+
Permission.PermissionScope permissionScope
46+
) {}
47+
}

UnityAuth/src/main/java/io/unityfoundation/auth/entities/UserRepo.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
import io.micronaut.data.jdbc.annotation.JdbcRepository;
66
import io.micronaut.data.model.query.builder.sql.Dialect;
77
import io.micronaut.data.repository.CrudRepository;
8-
import io.unityfoundation.auth.AuthController.TenantPermission;
8+
99
import java.util.List;
1010
import java.util.Optional;
1111

12+
import static io.unityfoundation.auth.PermissionsService.*;
13+
1214
@JdbcRepository(dialect = Dialect.MYSQL)
1315
public interface UserRepo extends CrudRepository<User, Long> {
1416

0 commit comments

Comments
 (0)