85 lines
2.7 KiB
Java
85 lines
2.7 KiB
Java
package eu.eudat.data;
|
|
|
|
import eu.eudat.authorization.Permission;
|
|
import eu.eudat.commons.scope.tenant.TenantScope;
|
|
import eu.eudat.commons.scope.tenant.TenantScoped;
|
|
import gr.cite.commons.web.authz.service.AuthorizationService;
|
|
import gr.cite.commons.web.oidc.principal.CurrentPrincipalResolver;
|
|
import gr.cite.commons.web.oidc.principal.extractor.ClaimExtractor;
|
|
import gr.cite.tools.exception.MyForbiddenException;
|
|
|
|
import jakarta.persistence.*;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.web.context.annotation.RequestScope;
|
|
|
|
import javax.management.InvalidApplicationException;
|
|
|
|
import java.util.UUID;
|
|
|
|
@Service
|
|
@RequestScope
|
|
public class TenantEntityManager {
|
|
@PersistenceContext
|
|
private EntityManager entityManager;
|
|
private final TenantScope tenantScope;
|
|
|
|
public TenantEntityManager(TenantScope tenantScope) {
|
|
this.tenantScope = tenantScope;
|
|
}
|
|
|
|
|
|
public void persist(Object entity) {
|
|
this.entityManager.persist(entity);
|
|
}
|
|
|
|
public <T> T merge(T entity) throws InvalidApplicationException {
|
|
if (tenantScope.isMultitenant() && (entity instanceof TenantScoped tenantScopedEntity)) {
|
|
if (!tenantScope.isDefaultTenant()) {
|
|
if (tenantScopedEntity.getTenantId() == null || !tenantScopedEntity.getTenantId().equals(tenantScope.getTenant())) throw new MyForbiddenException("tenant tampering");
|
|
} else if (tenantScopedEntity.getTenantId() != null) {
|
|
throw new MyForbiddenException("tenant tampering");
|
|
}
|
|
}
|
|
return this.entityManager.merge(entity);
|
|
}
|
|
|
|
public void remove(Object entity) throws InvalidApplicationException {
|
|
if (tenantScope.isMultitenant() && (entity instanceof TenantScoped tenantScopedEntity)) {
|
|
if (!tenantScope.isDefaultTenant()) {
|
|
if (tenantScopedEntity.getTenantId() == null || !tenantScopedEntity.getTenantId().equals(tenantScope.getTenant())) throw new MyForbiddenException("tenant tampering");
|
|
} else if (tenantScopedEntity.getTenantId() != null) {
|
|
throw new MyForbiddenException("tenant tampering");
|
|
}
|
|
}
|
|
this.entityManager.remove(entity);
|
|
}
|
|
|
|
public <T> T find(Class<T> entityClass, Object primaryKey) throws InvalidApplicationException {
|
|
T entity = this.entityManager.find(entityClass, primaryKey);
|
|
|
|
if (tenantScope.isMultitenant() && (entity instanceof TenantScoped tenantScopedEntity)) {
|
|
if (tenantScopedEntity.getTenantId() != null && !tenantScopedEntity.getTenantId().equals(tenantScope.getTenant())) return null;
|
|
}
|
|
return entity;
|
|
}
|
|
|
|
public void flush() {
|
|
this.entityManager.flush();
|
|
}
|
|
|
|
|
|
public void setFlushMode(FlushModeType flushMode) {
|
|
this.entityManager.setFlushMode(flushMode);
|
|
|
|
}
|
|
|
|
public FlushModeType getFlushMode() {
|
|
return this.entityManager.getFlushMode();
|
|
}
|
|
|
|
public void clear() {
|
|
this.entityManager.clear();
|
|
}
|
|
|
|
}
|