use of io.lumeer.api.model.Query in project engine by Lumeer.
the class SearchFacadeIT method testSearchFulltextDocumentsByNumberConstraint.
@Test
public void testSearchFulltextDocumentsByNumberConstraint() {
Constraint constraint = new Constraint(ConstraintType.Number, new DataDocument("currency", "sk-SK"));
Attribute attribute = new Attribute(DOCUMENT_KEY, DOCUMENT_KEY, null, constraint, null, null, 3, null);
String collectionId = createCollection("numberCollection2", attribute).getId();
String id1 = createDocument(collectionId, "20.3").getId();
String id2 = createDocument(collectionId, "40.1").getId();
String id3 = createDocument(collectionId, "60").getId();
Query query = createSimpleQueryWithFulltext("20");
List<Document> documents = searchFacade.searchDocuments(query, true);
assertThat(documents).extracting(Document::getId).containsOnly(id1);
query = createSimpleQueryWithFulltext("€");
documents = searchFacade.searchDocuments(query, true);
assertThat(documents).extracting(Document::getId).containsOnly(id1, id2, id3);
query = createSimpleQueryWithFulltext("60 €");
documents = searchFacade.searchDocuments(query, true);
assertThat(documents).extracting(Document::getId).containsOnly(id3);
}
use of io.lumeer.api.model.Query in project engine by Lumeer.
the class ViewFacadeIT method configureProject.
@Before
public void configureProject() {
User user = new User(USER);
this.user = userDao.createUser(user);
Organization organization = new Organization();
organization.setCode(ORGANIZATION_CODE);
organization.setPermissions(new Permissions());
Organization storedOrganization = organizationDao.createOrganization(organization);
projectDao.setOrganization(storedOrganization);
groupDao.setOrganization(storedOrganization);
group = groupDao.createGroup(new Group(GROUP, Collections.singletonList(user.getId())));
user.setOrganizations(Collections.singleton(storedOrganization.getId()));
this.user = userDao.updateUser(user.getId(), user);
Permissions organizationPermissions = new Permissions();
Permission userPermission = Permission.buildWithRoles(this.user.getId(), Set.of(new Role(RoleType.Read)));
organizationPermissions.updateUserPermissions(userPermission);
storedOrganization.setPermissions(organizationPermissions);
this.organization = organizationDao.updateOrganization(storedOrganization.getId(), storedOrganization);
this.userPermission = Permission.buildWithRoles(this.user.getId(), Set.of(new Role(RoleType.Read)));
this.groupPermission = Permission.buildWithRoles(this.group.getId(), Set.of(new Role(RoleType.Read)));
Project project = new Project();
project.setCode(PROJECT_CODE);
project.setPermissions(new Permissions());
Project storedProject = projectDao.createProject(project);
workspaceKeeper.setWorkspaceIds(storedOrganization.getId(), storedProject.getId());
Permissions projectPermissions = new Permissions();
Permission userProjectPermission = Permission.buildWithRoles(this.user.getId(), Set.of(new Role(RoleType.Read), new Role(RoleType.ViewContribute), new Role(RoleType.CollectionContribute)));
projectPermissions.updateUserPermissions(userProjectPermission);
storedProject.setPermissions(projectPermissions);
this.project = projectDao.updateProject(storedProject.getId(), storedProject);
viewDao.setProject(this.project);
Collection collection = collectionFacade.createCollection(new Collection("abc", "abc random", ICON, COLOR, projectPermissions));
collectionFacade.updateUserPermissions(collection.getId(), Set.of(Permission.buildWithRoles(this.user.getId(), Collections.singleton(new Role(RoleType.Read)))));
query = new Query(new QueryStem(collection.getId()));
PermissionCheckerUtil.allowGroups();
permissionsChecker.getPermissionAdapter().invalidateUserCache();
}
use of io.lumeer.api.model.Query in project engine by Lumeer.
the class ViewFacadeIT method testCollectionAccessViaView.
@Test
public void testCollectionAccessViaView() {
// non-existing user
final String NON_EXISTING_USER = "aaaaa4444400000000111111";
final String COLLECTION_NAME = "kolekce1";
final String COLLECTION_ICON = "fa-eye";
final String COLLECTION_COLOR = "#abcdea";
setOrganizationUserRoles(Set.of(new Role(RoleType.Read), new Role(RoleType.UserConfig)));
setProjectUserRoles(Set.of(new Role(RoleType.Read), new Role(RoleType.ViewContribute), new Role(RoleType.CollectionContribute), new Role(RoleType.UserConfig)));
Permission workspacePermission = Permission.buildWithRoles(NON_EXISTING_USER, Set.of(new Role(RoleType.Read)));
organizationFacade.updateUserPermissions(organization.getId(), Set.of(workspacePermission));
projectFacade.updateUserPermissions(project.getId(), Set.of(workspacePermission));
// create collection under a different user
Permissions collectionPermissions = new Permissions();
Permission userPermission = Permission.buildWithRoles(NON_EXISTING_USER, Collection.ROLES);
collectionPermissions.updateUserPermissions(userPermission);
Collection collection = collectionFacade.createCollection(new Collection("", COLLECTION_NAME, COLLECTION_ICON, COLLECTION_COLOR, collectionPermissions));
collectionFacade.updateUserPermissions(collection.getId(), Set.of(Permission.buildWithRoles(this.user.getId(), Collections.emptySet())));
removeOrganizationManagePermission();
removeProjectManagePermission();
// we are not able to read the collection now
try {
collectionFacade.getCollection(collection.getId());
fail("Still able to access collection where I have no access rights");
} catch (Exception e) {
assertThat(e).isInstanceOf(NoResourcePermissionException.class);
}
// create a view under a different user
View view = createView(CODE2);
view.setAuthorId(NON_EXISTING_USER);
view.setQuery(new Query(new QueryStem(collection.getId())));
Permissions permissions = new Permissions();
permissions.updateUserPermissions(Set.of(Permission.buildWithRoles(NON_EXISTING_USER, View.ROLES), Permission.buildWithRoles(this.user.getId(), Collections.emptySet())));
view.setPermissions(permissions);
viewDao.updateView(view.getId(), view);
try {
viewFacade.getViewById(view.getId());
fail("Still able to access view where I have no access rights");
} catch (Exception e) {
assertThat(e).isInstanceOf(NoResourcePermissionException.class);
}
try {
viewFacade.updateUserPermissions(view.getId(), Set.of(Permission.buildWithRoles(this.user.getId(), Set.of(new Role(RoleType.Read)))));
fail("Can manage view without manage rights");
} catch (Exception e) {
assertThat(e).isInstanceOf(NoResourcePermissionException.class);
}
// share the view and make sure we can see it now
Permissions viewPermissions = new Permissions();
viewPermissions.updateUserPermissions(Permission.buildWithRoles(NON_EXISTING_USER, View.ROLES));
viewPermissions.updateUserPermissions(Permission.buildWithRoles(this.user.getId(), Collections.singleton(new Role(RoleType.Read))));
view.setPermissions(viewPermissions);
// since we lost manage rights, we can only do it directly
viewDao.updateView(view.getId(), view);
// now this should be all possible
viewFacade.getViewById(view.getId());
// access the collection via the view with the current user
PermissionCheckerUtil.setViewId(permissionsChecker, view.getId());
collectionFacade.getCollection(collection.getId());
}
use of io.lumeer.api.model.Query in project engine by Lumeer.
the class SearchFacade method searchDocumentsAndLinksInStem.
private Tuple<? extends java.util.Collection<Document>, ? extends java.util.Collection<LinkInstance>> searchDocumentsAndLinksInStem(final QueryStem stem, final Set<String> fulltexts, final Map<String, Collection> collectionsMap, final Map<String, LinkType> linkTypesMap, @Nullable final Function<Document, Boolean> documentFilter, final ConstraintData constraintData, boolean includeChildDocuments) {
final Set<Document> allDocuments = new HashSet<>();
final Set<LinkInstance> allLinkInstances = new HashSet<>();
var resources = getResourcesFromStem(stem, collectionsMap, linkTypesMap);
final List<Collection> allCollections = resources.getFirst();
final List<LinkType> allLinkTypes = resources.getSecond();
if (allCollections.isEmpty()) {
return new Tuple<>(allDocuments, allLinkInstances);
}
final Map<String, AllowedPermissions> collectionsPermissions = permissionsChecker.getCollectionsPermissions(allCollections);
final Map<String, AllowedPermissions> linkTypesPermissions = permissionsChecker.getLinkTypesPermissions(allLinkTypes);
final Query query = new Query(Collections.singletonList(stem), fulltexts, null, null);
var hasMoreDocuments = true;
var page = 0;
while (hasMoreDocuments) {
var previousCollection = allCollections.get(0);
var firstCollectionDocuments = getDocumentsByCollection(previousCollection, page, FETCH_SIZE);
var previousDocuments = filterDocumentsByDocumentFilter(firstCollectionDocuments, documentFilter);
final Set<Document> currentDocuments = new HashSet<>(previousDocuments);
final Set<LinkInstance> currentLinkInstances = new HashSet<>();
for (String linkTypeId : stem.getLinkTypeIds()) {
var linkType = linkTypesMap.get(linkTypeId);
var collection = getOtherCollection(linkType, collectionsMap, Utils.computeIfNotNull(previousCollection, Collection::getId));
if (linkType != null && previousCollection != null) {
var links = getLinkInstancesByLinkType(linkType, getDocumentsIds(previousDocuments));
var documents = getDocumentsByCollection(collection, getLinkDocumentsIds(links), documentFilter);
currentDocuments.addAll(documents);
currentLinkInstances.addAll(links);
previousCollection = collection;
previousDocuments = documents;
}
}
if (!currentDocuments.isEmpty()) {
var result = DataFilter.filterDocumentsAndLinksByQueryFromJson(new ArrayList<>(currentDocuments), allCollections, allLinkTypes, new ArrayList<>(currentLinkInstances), query, collectionsPermissions, linkTypesPermissions, constraintData, includeChildDocuments, language);
allDocuments.addAll(result.getFirst());
allLinkInstances.addAll(result.getSecond());
}
page++;
hasMoreDocuments = !firstCollectionDocuments.isEmpty();
}
return new Tuple<>(allDocuments, allLinkInstances);
}
use of io.lumeer.api.model.Query in project engine by Lumeer.
the class SearchFacade method modifyQueryForTasks.
private Query modifyQueryForTasks(boolean isPublic, final Query query, final List<Collection> collections) {
if (isPublic || !query.isEmpty()) {
return query;
}
final List<QueryStem> stems = collections.stream().map(collection -> {
final String assigneeAttributeId = collection.getPurpose().getAssigneeAttributeId();
final Attribute assigneeAttribute = ResourceUtils.findAttribute(collection.getAttributes(), assigneeAttributeId);
if (assigneeAttribute != null) {
final CollectionAttributeFilter filter = CollectionAttributeFilter.createFromTypes(collection.getId(), assigneeAttribute.getId(), ConditionType.HAS_SOME, ConditionValueType.CURRENT_USER.getValue());
return new QueryStem(null, collection.getId(), Collections.emptyList(), Collections.emptySet(), Collections.singletonList(filter), Collections.emptyList());
}
if (permissionsChecker.hasAnyRole(collection, Set.of(RoleType.DataRead, RoleType.DataContribute))) {
return new QueryStem(null, collection.getId(), Collections.emptyList(), Collections.emptySet(), Collections.emptyList(), Collections.emptyList());
}
return null;
}).filter(Objects::nonNull).collect(Collectors.toList());
return stems.isEmpty() ? null : new Query(stems);
}
Aggregations