chore: Adding projection back to BaseAppsmithRepository (#19271)
Projection support added as part of https://github.com/appsmithorg/appsmith/pull/18904 was undone during another refactor for the git rbac changes. Adding projection back for appsmith repository functions.
This commit is contained in:
parent
795416ac90
commit
6bd1b08bc3
|
|
@ -135,9 +135,9 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
return criteria.orElse(null);
|
return criteria.orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static final Optional<Criteria> userAcl(Set<String> permissionGroups, Optional<AclPermission> permission) {
|
public static final Optional<Criteria> userAcl(Set<String> permissionGroups, Optional<AclPermission> permission) {
|
||||||
if(permission.isEmpty()) {
|
if (permission.isEmpty()) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
// Check if the permission is being provided by any of the permission groups
|
// Check if the permission is being provided by any of the permission groups
|
||||||
|
|
@ -167,22 +167,39 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
if (id == null) {
|
if (id == null) {
|
||||||
return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.ID));
|
return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.ID));
|
||||||
}
|
}
|
||||||
return findById(id, Optional.ofNullable(permission));
|
return findById(id, projectionFieldNames, Optional.ofNullable(permission));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mono<T> findById(String id, List<String> projectionFieldNames, Optional<AclPermission> permission) {
|
||||||
|
if (id == null) {
|
||||||
|
return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.ID));
|
||||||
|
}
|
||||||
|
|
||||||
|
return getCurrentUserPermissionGroupsIfRequired(permission)
|
||||||
|
.flatMap(permissionGroups -> {
|
||||||
|
Query query = new Query(getIdCriteria(id));
|
||||||
|
query.addCriteria(notDeleted());
|
||||||
|
Optional<Criteria> userAcl = userAcl(permissionGroups, permission);
|
||||||
|
if (userAcl.isPresent()) {
|
||||||
|
query.addCriteria(userAcl.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isEmpty(projectionFieldNames)) {
|
||||||
|
projectionFieldNames.stream()
|
||||||
|
.forEach(projectionFieldName -> {
|
||||||
|
query.fields().include(projectionFieldName);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return mongoOperations.query(this.genericDomain)
|
||||||
|
.matching(query)
|
||||||
|
.one()
|
||||||
|
.flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mono<T> findById(String id, Optional<AclPermission> permission) {
|
public Mono<T> findById(String id, Optional<AclPermission> permission) {
|
||||||
return getCurrentUserPermissionGroupsIfRequired(permission).flatMap(permissionGroups -> {
|
return findById(id, null, permission);
|
||||||
Query query = new Query(getIdCriteria(id));
|
|
||||||
query.addCriteria(notDeleted());
|
|
||||||
Optional<Criteria> userAcl = userAcl(permissionGroups, permission);
|
|
||||||
if(userAcl.isPresent()) {
|
|
||||||
query.addCriteria(userAcl.get());
|
|
||||||
}
|
|
||||||
return mongoOperations.query(this.genericDomain)
|
|
||||||
.matching(query)
|
|
||||||
.one()
|
|
||||||
.flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups));
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
|
|
@ -216,7 +233,7 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
.flatMap(permissionGroups -> {
|
.flatMap(permissionGroups -> {
|
||||||
Optional<Criteria> userAcl = userAcl(permissionGroups, permission);
|
Optional<Criteria> userAcl = userAcl(permissionGroups, permission);
|
||||||
query.addCriteria(notDeleted());
|
query.addCriteria(notDeleted());
|
||||||
if(userAcl.isPresent()) {
|
if (userAcl.isPresent()) {
|
||||||
query.addCriteria(userAcl.get());
|
query.addCriteria(userAcl.get());
|
||||||
}
|
}
|
||||||
return mongoOperations.updateFirst(query, updateObj, resource.getClass())
|
return mongoOperations.updateFirst(query, updateObj, resource.getClass())
|
||||||
|
|
@ -270,11 +287,12 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
public Mono<UpdateResult> updateById(String id, Update updateObj, Optional<AclPermission> permission) {
|
public Mono<UpdateResult> updateById(String id, Update updateObj, Optional<AclPermission> permission) {
|
||||||
Query query = new Query(Criteria.where("id").is(id));
|
Query query = new Query(Criteria.where("id").is(id));
|
||||||
|
|
||||||
if(permission.isEmpty()) {
|
if (permission.isEmpty()) {
|
||||||
return mongoOperations.updateFirst(query, updateObj, this.genericDomain);
|
return mongoOperations.updateFirst(query, updateObj, this.genericDomain);
|
||||||
}
|
}
|
||||||
|
|
||||||
return getCurrentUserPermissionGroupsIfRequired(permission).flatMap(permissionGroups -> {
|
return getCurrentUserPermissionGroupsIfRequired(permission)
|
||||||
|
.flatMap(permissionGroups -> {
|
||||||
query.addCriteria(new Criteria().andOperator(notDeleted(), userAcl(permissionGroups, permission.get())));
|
query.addCriteria(new Criteria().andOperator(notDeleted(), userAcl(permissionGroups, permission.get())));
|
||||||
return mongoOperations.updateFirst(query, updateObj, this.genericDomain);
|
return mongoOperations.updateFirst(query, updateObj, this.genericDomain);
|
||||||
});
|
});
|
||||||
|
|
@ -295,11 +313,11 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
protected Mono<T> queryOne(List<Criteria> criterias, AclPermission aclPermission) {
|
protected Mono<T> queryOne(List<Criteria> criterias, AclPermission aclPermission) {
|
||||||
return queryOne(criterias, Optional.ofNullable(aclPermission));
|
return queryOne(criterias, null, Optional.ofNullable(aclPermission));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Mono<Set<String>> getCurrentUserPermissionGroupsIfRequired(Optional<AclPermission> permission) {
|
protected Mono<Set<String>> getCurrentUserPermissionGroupsIfRequired(Optional<AclPermission> permission) {
|
||||||
if(permission.isEmpty()) {
|
if (permission.isEmpty()) {
|
||||||
return Mono.just(Set.of());
|
return Mono.just(Set.of());
|
||||||
}
|
}
|
||||||
return getCurrentUserPermissionGroups();
|
return getCurrentUserPermissionGroups();
|
||||||
|
|
@ -314,8 +332,9 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
|
|
||||||
protected Mono<T> queryOne(List<Criteria> criterias, List<String> projectionFieldNames, AclPermission permission) {
|
protected Mono<T> queryOne(List<Criteria> criterias, List<String> projectionFieldNames, AclPermission permission) {
|
||||||
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(Optional.ofNullable(permission));
|
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(Optional.ofNullable(permission));
|
||||||
|
|
||||||
return permissionGroupsMono.flatMap(permissionGroups -> {
|
return permissionGroupsMono
|
||||||
|
.flatMap(permissionGroups -> {
|
||||||
return mongoOperations.query(this.genericDomain)
|
return mongoOperations.query(this.genericDomain)
|
||||||
.matching(createQueryWithPermission(criterias, projectionFieldNames, permissionGroups, permission))
|
.matching(createQueryWithPermission(criterias, projectionFieldNames, permissionGroups, permission))
|
||||||
.one()
|
.one()
|
||||||
|
|
@ -323,12 +342,13 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Mono<T> queryOne(List<Criteria> criterias, Optional<AclPermission> permission) {
|
protected Mono<T> queryOne(List<Criteria> criterias, List<String> projectionFieldNames, Optional<AclPermission> permission) {
|
||||||
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(permission);
|
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(permission);
|
||||||
|
|
||||||
return permissionGroupsMono.flatMap(permissionGroups -> {
|
return permissionGroupsMono
|
||||||
|
.flatMap(permissionGroups -> {
|
||||||
return mongoOperations.query(this.genericDomain)
|
return mongoOperations.query(this.genericDomain)
|
||||||
.matching(createQueryWithPermission(criterias, permissionGroups, permission))
|
.matching(createQueryWithPermission(criterias, projectionFieldNames, permissionGroups, permission))
|
||||||
.one()
|
.one()
|
||||||
.flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups));
|
.flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups));
|
||||||
});
|
});
|
||||||
|
|
@ -342,12 +362,13 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
protected Mono<T> queryFirst(List<Criteria> criterias, Optional<AclPermission> permission) {
|
protected Mono<T> queryFirst(List<Criteria> criterias, Optional<AclPermission> permission) {
|
||||||
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(permission);
|
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(permission);
|
||||||
|
|
||||||
return permissionGroupsMono.flatMap(permissionGroups -> {
|
return permissionGroupsMono
|
||||||
return mongoOperations.query(this.genericDomain)
|
.flatMap(permissionGroups -> {
|
||||||
.matching(createQueryWithPermission(criterias, permissionGroups, permission))
|
return mongoOperations.query(this.genericDomain)
|
||||||
.first()
|
.matching(createQueryWithPermission(criterias, null, permissionGroups, permission))
|
||||||
.flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups));
|
.first()
|
||||||
});
|
.flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
|
|
@ -359,7 +380,16 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
return createQueryWithPermission(criterias, null, permissionGroups, permission.orElse(null));
|
return createQueryWithPermission(criterias, null, permissionGroups, permission.orElse(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Query createQueryWithPermission(List<Criteria> criterias, List<String> projectionFieldNames,
|
protected Query createQueryWithPermission(List<Criteria> criterias,
|
||||||
|
List<String> projectionFieldNames,
|
||||||
|
Set<String> permissionGroups,
|
||||||
|
Optional<AclPermission> permission) {
|
||||||
|
|
||||||
|
return createQueryWithPermission(criterias, projectionFieldNames, permissionGroups, permission.orElse(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Query createQueryWithPermission(List<Criteria> criterias,
|
||||||
|
List<String> projectionFieldNames,
|
||||||
Set<String> permissionGroups,
|
Set<String> permissionGroups,
|
||||||
AclPermission aclPermission) {
|
AclPermission aclPermission) {
|
||||||
Query query = new Query();
|
Query query = new Query();
|
||||||
|
|
@ -371,7 +401,7 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
query.addCriteria(new Criteria().andOperator(notDeleted(), userAcl(permissionGroups, aclPermission)));
|
query.addCriteria(new Criteria().andOperator(notDeleted(), userAcl(permissionGroups, aclPermission)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isEmpty(projectionFieldNames)) {
|
if (!isEmpty(projectionFieldNames)) {
|
||||||
projectionFieldNames.stream()
|
projectionFieldNames.stream()
|
||||||
.forEach(fieldName -> query.fields().include(fieldName));
|
.forEach(fieldName -> query.fields().include(fieldName));
|
||||||
}
|
}
|
||||||
|
|
@ -387,9 +417,10 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
protected Mono<Long> count(List<Criteria> criterias, Optional<AclPermission> permission) {
|
protected Mono<Long> count(List<Criteria> criterias, Optional<AclPermission> permission) {
|
||||||
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(permission);
|
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(permission);
|
||||||
|
|
||||||
return permissionGroupsMono.flatMap(permissionGroups ->
|
return permissionGroupsMono
|
||||||
mongoOperations.count(createQueryWithPermission(criterias, permissionGroups, permission), this.genericDomain)
|
.flatMap(permissionGroups ->
|
||||||
);
|
mongoOperations.count(createQueryWithPermission(criterias, permissionGroups, permission), this.genericDomain)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Mono<Long> count(List<Criteria> criteriaList) {
|
protected Mono<Long> count(List<Criteria> criteriaList) {
|
||||||
|
|
@ -428,10 +459,10 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
return queryAll(criterias, Optional.ofNullable(includeFields), Optional.ofNullable(aclPermission), Optional.ofNullable(sort), limit);
|
return queryAll(criterias, Optional.ofNullable(includeFields), Optional.ofNullable(aclPermission), Optional.ofNullable(sort), limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Flux<T> queryAll( List<Criteria> criterias, Optional<List<String>> includeFields, Optional<AclPermission> permission, Optional<Sort> sort, int limit) {
|
public Flux<T> queryAll(List<Criteria> criterias, Optional<List<String>> includeFields, Optional<AclPermission> permission, Optional<Sort> sort, int limit) {
|
||||||
final ArrayList<Criteria> criteriaList = new ArrayList<>(criterias);
|
|
||||||
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(permission);
|
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(permission);
|
||||||
return permissionGroupsMono.flatMapMany(permissionGroups -> queryAllWithPermissionGroups(criterias, includeFields, permission, sort, permissionGroups, limit));
|
return permissionGroupsMono
|
||||||
|
.flatMapMany(permissionGroups -> queryAllWithPermissionGroups(criterias, includeFields, permission, sort, permissionGroups, limit));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
|
|
@ -441,7 +472,8 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
Sort sort,
|
Sort sort,
|
||||||
Set<String> permissionGroups,
|
Set<String> permissionGroups,
|
||||||
int limit) {
|
int limit) {
|
||||||
return queryAllWithPermissionGroups(criterias, Optional.ofNullable(includeFields), Optional.ofNullable(aclPermission), Optional.ofNullable(sort), permissionGroups, limit);
|
return queryAllWithPermissionGroups(criterias, Optional.ofNullable(includeFields),
|
||||||
|
Optional.ofNullable(aclPermission), Optional.ofNullable(sort), permissionGroups, limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Flux<T> queryAllWithPermissionGroups(List<Criteria> criterias,
|
public Flux<T> queryAllWithPermissionGroups(List<Criteria> criterias,
|
||||||
|
|
@ -463,7 +495,7 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
userAcl(permissionGroups, aclPermission).ifPresent(criteria -> criteriaList.add(criteria));
|
userAcl(permissionGroups, aclPermission).ifPresent(criteria -> criteriaList.add(criteria));
|
||||||
andCriteria.andOperator(criteriaList.toArray(new Criteria[0]));
|
andCriteria.andOperator(criteriaList.toArray(new Criteria[0]));
|
||||||
query.addCriteria(andCriteria);
|
query.addCriteria(andCriteria);
|
||||||
sortOptional.ifPresent(sort-> query.with(sort));
|
sortOptional.ifPresent(sort -> query.with(sort));
|
||||||
return mongoOperations.query(this.genericDomain)
|
return mongoOperations.query(this.genericDomain)
|
||||||
.matching(query)
|
.matching(query)
|
||||||
.all()
|
.all()
|
||||||
|
|
@ -562,7 +594,7 @@ public abstract class BaseAppsmithRepositoryCEImpl<T extends BaseDomain> {
|
||||||
criterias.add(notDeleted());
|
criterias.add(notDeleted());
|
||||||
Query query = new Query(new Criteria().andOperator(criterias));
|
Query query = new Query(new Criteria().andOperator(criterias));
|
||||||
|
|
||||||
if(!isEmpty(projectionFieldNames)) {
|
if (!isEmpty(projectionFieldNames)) {
|
||||||
projectionFieldNames.stream()
|
projectionFieldNames.stream()
|
||||||
.forEach(projectionFieldName -> {
|
.forEach(projectionFieldName -> {
|
||||||
query.fields().include(projectionFieldName);
|
query.fields().include(projectionFieldName);
|
||||||
|
|
|
||||||
|
|
@ -188,7 +188,7 @@ public class CustomApplicationRepositoryCEImpl extends BaseAppsmithRepositoryImp
|
||||||
|
|
||||||
Criteria defaultAppCriteria = where(gitApplicationMetadata + "." + fieldName(QApplication.application.gitApplicationMetadata.defaultApplicationId)).is(defaultApplicationId);
|
Criteria defaultAppCriteria = where(gitApplicationMetadata + "." + fieldName(QApplication.application.gitApplicationMetadata.defaultApplicationId)).is(defaultApplicationId);
|
||||||
Criteria branchNameCriteria = where(gitApplicationMetadata + "." + fieldName(QApplication.application.gitApplicationMetadata.branchName)).is(branchName);
|
Criteria branchNameCriteria = where(gitApplicationMetadata + "." + fieldName(QApplication.application.gitApplicationMetadata.branchName)).is(branchName);
|
||||||
return queryOne(List.of(defaultAppCriteria, branchNameCriteria), aclPermission);
|
return queryOne(List.of(defaultAppCriteria, branchNameCriteria), null, aclPermission);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ public class CustomDatasourceRepositoryCEImpl extends BaseAppsmithRepositoryImpl
|
||||||
public Mono<Datasource> findByNameAndWorkspaceId(String name, String workspaceId, Optional<AclPermission> aclPermission) {
|
public Mono<Datasource> findByNameAndWorkspaceId(String name, String workspaceId, Optional<AclPermission> aclPermission) {
|
||||||
Criteria nameCriteria = where(fieldName(QDatasource.datasource.name)).is(name);
|
Criteria nameCriteria = where(fieldName(QDatasource.datasource.name)).is(name);
|
||||||
Criteria workspaceIdCriteria = where(fieldName(QDatasource.datasource.workspaceId)).is(workspaceId);
|
Criteria workspaceIdCriteria = where(fieldName(QDatasource.datasource.workspaceId)).is(workspaceId);
|
||||||
return queryOne(List.of(nameCriteria, workspaceIdCriteria), aclPermission);
|
return queryOne(List.of(nameCriteria, workspaceIdCriteria), null, aclPermission);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user