2024-03-13 16:04:17 +01:00
|
|
|
package eu.eudat.authorization.authorizationcontentresolver;
|
|
|
|
|
|
|
|
import eu.eudat.authorization.AffiliatedResource;
|
|
|
|
import eu.eudat.authorization.PermissionNameProvider;
|
|
|
|
import eu.eudat.commons.enums.IsActive;
|
|
|
|
import eu.eudat.commons.scope.user.UserScope;
|
|
|
|
import eu.eudat.data.DmpEntity;
|
|
|
|
import eu.eudat.data.DmpUserEntity;
|
|
|
|
import eu.eudat.model.DmpUser;
|
|
|
|
import eu.eudat.query.DmpUserQuery;
|
|
|
|
import gr.cite.tools.data.query.QueryFactory;
|
|
|
|
import gr.cite.tools.fieldset.BaseFieldSet;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import org.springframework.web.context.annotation.RequestScope;
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
@Service
|
|
|
|
@RequestScope
|
|
|
|
public class AuthorizationContentResolverImpl implements AuthorizationContentResolver {
|
|
|
|
private final QueryFactory queryFactory;
|
|
|
|
private final UserScope userScope;
|
|
|
|
private final AffiliationCacheService affiliationCacheService;
|
|
|
|
private final PermissionNameProvider permissionNameProvider;
|
|
|
|
public AuthorizationContentResolverImpl(QueryFactory queryFactory, UserScope userScope, AffiliationCacheService affiliationCacheService, PermissionNameProvider permissionNameProvider) {
|
|
|
|
this.queryFactory = queryFactory;
|
|
|
|
this.userScope = userScope;
|
|
|
|
this.affiliationCacheService = affiliationCacheService;
|
|
|
|
this.permissionNameProvider = permissionNameProvider;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public List<String> getPermissionNames() {
|
|
|
|
return permissionNameProvider.getPermissions();
|
|
|
|
}
|
2024-03-13 16:45:25 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public AffiliatedResource dmpAffiliation(UUID id) {
|
|
|
|
return this.dmpsAffiliation(List.of(id)).getOrDefault(id, new AffiliatedResource());
|
|
|
|
}
|
2024-03-13 16:04:17 +01:00
|
|
|
@Override
|
2024-03-13 16:45:25 +01:00
|
|
|
public Map<UUID, AffiliatedResource> dmpsAffiliation(List<UUID> ids){
|
2024-03-13 16:04:17 +01:00
|
|
|
UUID userId = this.userScope.getUserIdSafe();
|
|
|
|
Map<UUID, AffiliatedResource> affiliatedResources = new HashMap<>();
|
|
|
|
for (UUID id : ids){
|
|
|
|
affiliatedResources.put(id, new AffiliatedResource());
|
|
|
|
}
|
|
|
|
if (userId == null || !userScope.isSet()) return affiliatedResources;
|
|
|
|
|
|
|
|
List<UUID> idsToResolve = this.getAffiliatedFromCache(ids, userId, affiliatedResources, DmpEntity.class.getSimpleName());
|
|
|
|
if (idsToResolve.isEmpty()) return affiliatedResources;
|
|
|
|
|
|
|
|
List<DmpUserEntity> dmpUsers = this.queryFactory.query(DmpUserQuery.class).dmpIds(ids).userIds(userId).isActives(IsActive.Active).collectAs(new BaseFieldSet().ensure(DmpUser._role).ensure(DmpUser._dmp));
|
|
|
|
|
|
|
|
for (DmpUserEntity dmpUser : dmpUsers){
|
|
|
|
affiliatedResources.get(dmpUser.getDmpId()).getDmpUserRoles().add(dmpUser.getRole());
|
|
|
|
}
|
|
|
|
|
|
|
|
this.ensureAffiliatedInCache(idsToResolve, userId, affiliatedResources, DmpEntity.class.getSimpleName());
|
|
|
|
return affiliatedResources;
|
|
|
|
}
|
|
|
|
|
|
|
|
private List<UUID> getAffiliatedFromCache(List<UUID> ids, UUID userId, Map<UUID, AffiliatedResource> affiliatedResources, String entityType){
|
|
|
|
List<UUID> idsToResolve = new ArrayList<>();
|
|
|
|
for (UUID id : ids){
|
|
|
|
AffiliationCacheService.AffiliationCacheValue cacheValue = this.affiliationCacheService.lookup(this.affiliationCacheService.buildKey(userId, id, entityType));
|
|
|
|
if (cacheValue != null) affiliatedResources.put(id, cacheValue.getAffiliatedResource());
|
|
|
|
else idsToResolve.add(id);
|
|
|
|
}
|
|
|
|
return idsToResolve;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void ensureAffiliatedInCache(List<UUID> idsToResolve, UUID userId, Map<UUID, AffiliatedResource> affiliatedResources, String entityType){
|
|
|
|
for (UUID id : idsToResolve){
|
|
|
|
AffiliatedResource affiliatedResource = affiliatedResources.getOrDefault(id, null);
|
|
|
|
if (affiliatedResource != null) {
|
|
|
|
AffiliationCacheService.AffiliationCacheValue cacheValue = new AffiliationCacheService.AffiliationCacheValue(userId, id, entityType, affiliatedResource);
|
|
|
|
this.affiliationCacheService.put(cacheValue);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|