-
Notifications
You must be signed in to change notification settings - Fork 90
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
package io.openbas.rest.user.form.user; | ||
|
||
import com.fasterxml.jackson.annotation.JsonProperty; | ||
import jakarta.validation.constraints.NotBlank; | ||
import java.util.Set; | ||
import lombok.Builder; | ||
import lombok.Data; | ||
|
||
@Builder | ||
@Data | ||
public class UserOutput { | ||
|
||
@JsonProperty("user_id") | ||
@NotBlank | ||
private String id; | ||
|
||
@JsonProperty("user_firstname") | ||
private String firstname; | ||
|
||
@JsonProperty("user_lastname") | ||
private String lastname; | ||
|
||
@JsonProperty("user_email") | ||
@NotBlank | ||
private String email; | ||
|
||
@JsonProperty("user_admin") | ||
private boolean admin; | ||
|
||
@JsonProperty("user_organization_name") | ||
private String organizationName; | ||
|
||
@JsonProperty("user_tags") | ||
private Set<String> tags; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
package io.openbas.rest.user.helper; | ||
|
||
import static io.openbas.utils.JpaUtils.createJoinArrayAggOnId; | ||
import static io.openbas.utils.JpaUtils.createLeftJoin; | ||
|
||
import io.openbas.database.model.Organization; | ||
import io.openbas.database.model.User; | ||
import io.openbas.rest.user.form.user.UserOutput; | ||
import jakarta.persistence.Tuple; | ||
import jakarta.persistence.TypedQuery; | ||
import jakarta.persistence.criteria.*; | ||
import java.util.Arrays; | ||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
public class UserQueryHelper { | ||
|
||
private UserQueryHelper() {} | ||
|
||
// -- SELECT -- | ||
|
||
public static void select(CriteriaBuilder cb, CriteriaQuery<Tuple> cq, Root<User> userRoot) { | ||
// Joins | ||
Join<User, Organization> organizationJoin = createLeftJoin(userRoot, "organization"); | ||
// Array aggregations | ||
Expression<String[]> tagIdsExpression = createJoinArrayAggOnId(cb, userRoot, "tags"); | ||
|
||
// Multiselect | ||
cq.multiselect( | ||
userRoot.get("id").alias("user_id"), | ||
userRoot.get("firstname").alias("user_firstname"), | ||
userRoot.get("lastname").alias("user_lastname"), | ||
userRoot.get("email").alias("user_email"), | ||
userRoot.get("admin").alias("user_admin"), | ||
organizationJoin.get("name").alias("user_organization_name"), | ||
tagIdsExpression.alias("user_tags")) | ||
.distinct(true); | ||
|
||
// Group by | ||
cq.groupBy(userRoot.get("id"), organizationJoin.get("id")); | ||
} | ||
|
||
// -- EXECUTION -- | ||
|
||
public static List<UserOutput> execution(TypedQuery<Tuple> query) { | ||
return query.getResultList().stream() | ||
.map( | ||
tuple -> | ||
UserOutput.builder() | ||
.id(tuple.get("user_id", String.class)) | ||
.firstname(tuple.get("user_firstname", String.class)) | ||
.lastname(tuple.get("user_lastname", String.class)) | ||
.email(tuple.get("user_email", String.class)) | ||
.admin(tuple.get("user_admin", boolean.class)) | ||
.organizationName(tuple.get("user_organization_name", String.class)) | ||
.tags( | ||
Arrays.stream(tuple.get("user_tags", String[].class)) | ||
.collect(Collectors.toSet())) | ||
.build()) | ||
.toList(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
package io.openbas.rest.user.service; | ||
|
||
import static io.openbas.database.criteria.GenericCriteria.countQuery; | ||
import static io.openbas.rest.user.helper.UserQueryHelper.execution; | ||
import static io.openbas.rest.user.helper.UserQueryHelper.select; | ||
import static io.openbas.utils.pagination.PaginationUtils.buildPaginationCriteriaBuilder; | ||
import static io.openbas.utils.pagination.SortUtilsCriteriaBuilder.toSortCriteriaBuilder; | ||
|
||
import io.openbas.database.model.User; | ||
import io.openbas.rest.user.form.user.UserOutput; | ||
import io.openbas.utils.pagination.SearchPaginationInput; | ||
import jakarta.persistence.EntityManager; | ||
import jakarta.persistence.PersistenceContext; | ||
import jakarta.persistence.Tuple; | ||
import jakarta.persistence.TypedQuery; | ||
import jakarta.persistence.criteria.*; | ||
import java.util.List; | ||
import lombok.RequiredArgsConstructor; | ||
import org.jetbrains.annotations.NotNull; | ||
import org.springframework.data.domain.Page; | ||
import org.springframework.data.domain.PageImpl; | ||
import org.springframework.data.domain.Pageable; | ||
import org.springframework.data.jpa.domain.Specification; | ||
import org.springframework.stereotype.Service; | ||
|
||
@RequiredArgsConstructor | ||
@Service | ||
public class UserCriteriaBuilderService { | ||
|
||
@PersistenceContext private EntityManager entityManager; | ||
|
||
public Page<UserOutput> userPagination(@NotNull SearchPaginationInput searchPaginationInput) { | ||
return buildPaginationCriteriaBuilder(this::paginate, searchPaginationInput, User.class); | ||
Check warning on line 33 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L33
|
||
} | ||
|
||
public List<UserOutput> find(Specification<User> specification) { | ||
CriteriaBuilder cb = this.entityManager.getCriteriaBuilder(); | ||
Check warning on line 37 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L37
|
||
|
||
CriteriaQuery<Tuple> cq = cb.createTupleQuery(); | ||
Root<User> root = cq.from(User.class); | ||
select(cb, cq, root); | ||
Check warning on line 41 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L39-L41
|
||
|
||
if (specification != null) { | ||
Predicate predicate = specification.toPredicate(root, cq, cb); | ||
Check warning on line 44 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L44
|
||
if (predicate != null) { | ||
cq.where(predicate); | ||
Check warning on line 46 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L46
|
||
} | ||
} | ||
|
||
TypedQuery<Tuple> query = entityManager.createQuery(cq); | ||
return execution(query); | ||
Check warning on line 51 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L50-L51
|
||
} | ||
|
||
// -- PRIVATE -- | ||
|
||
private Page<UserOutput> paginate( | ||
Specification<User> specification, | ||
Specification<User> specificationCount, | ||
Pageable pageable) { | ||
CriteriaBuilder cb = this.entityManager.getCriteriaBuilder(); | ||
Check warning on line 60 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L60
|
||
|
||
CriteriaQuery<Tuple> cq = cb.createTupleQuery(); | ||
Root<User> userRoot = cq.from(User.class); | ||
select(cb, cq, userRoot); | ||
Check warning on line 64 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L62-L64
|
||
|
||
// -- Specification -- | ||
if (specification != null) { | ||
Predicate predicate = specification.toPredicate(userRoot, cq, cb); | ||
Check warning on line 68 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L68
|
||
if (predicate != null) { | ||
cq.where(predicate); | ||
Check warning on line 70 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L70
|
||
} | ||
} | ||
|
||
// -- Sorting -- | ||
List<Order> orders = toSortCriteriaBuilder(cb, userRoot, pageable.getSort()); | ||
cq.orderBy(orders); | ||
Check warning on line 76 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L75-L76
|
||
|
||
// Type Query | ||
TypedQuery<Tuple> query = entityManager.createQuery(cq); | ||
Check warning on line 79 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L79
|
||
|
||
// -- Pagination -- | ||
query.setFirstResult((int) pageable.getOffset()); | ||
query.setMaxResults(pageable.getPageSize()); | ||
Check warning on line 83 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L82-L83
|
||
|
||
// -- EXECUTION -- | ||
List<UserOutput> users = execution(query); | ||
Check warning on line 86 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L86
|
||
|
||
// -- Count Query -- | ||
Long total = countQuery(cb, this.entityManager, User.class, specificationCount); | ||
Check warning on line 89 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L89
|
||
|
||
return new PageImpl<>(users, pageable, total); | ||
Check warning on line 91 in openbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java Codecov / codecov/patchopenbas-api/src/main/java/io/openbas/rest/user/service/UserCriteriaBuilderService.java#L91
|
||
} | ||
} |