diff --git a/application/src/main/kotlin/com/alleslocker/backend/application/auditlog/dto/filter/AuditLogFilterDto.kt b/application/src/main/kotlin/com/alleslocker/backend/application/auditlog/dto/filter/AuditLogFilterDto.kt index fa768333..75c1b5c4 100644 --- a/application/src/main/kotlin/com/alleslocker/backend/application/auditlog/dto/filter/AuditLogFilterDto.kt +++ b/application/src/main/kotlin/com/alleslocker/backend/application/auditlog/dto/filter/AuditLogFilterDto.kt @@ -5,5 +5,5 @@ import java.time.Instant data class AuditLogFilterDto( val fromDate: Instant? = null, val toDate: Instant? = null, - val performedByUserId: String? = null, + val searchText: String? = null, ) diff --git a/persistence/src/main/kotlin/com/alleslocker/backend/persistence/auditlog/specification/AuditLogSpecification.kt b/persistence/src/main/kotlin/com/alleslocker/backend/persistence/auditlog/specification/AuditLogSpecification.kt index 12efd7a5..8e6fb89f 100644 --- a/persistence/src/main/kotlin/com/alleslocker/backend/persistence/auditlog/specification/AuditLogSpecification.kt +++ b/persistence/src/main/kotlin/com/alleslocker/backend/persistence/auditlog/specification/AuditLogSpecification.kt @@ -2,12 +2,14 @@ package com.alleslocker.backend.persistence.auditlog.specification import com.alleslocker.backend.application.auditlog.dto.filter.AuditLogFilterDto import com.alleslocker.backend.persistence.auditlog.entity.AuditLogEntity +import com.alleslocker.backend.persistence.user.entity.UserEntity +import jakarta.persistence.criteria.JoinType import jakarta.persistence.criteria.Predicate import org.springframework.data.jpa.domain.Specification object AuditLogSpecification { fun withFilter(filter: AuditLogFilterDto): Specification = - Specification { root, _, cb -> + Specification { root, query, cb -> val predicates = mutableListOf() filter.fromDate?.let { @@ -18,9 +20,29 @@ object AuditLogSpecification { predicates.add(cb.lessThanOrEqualTo(root.get("createdAt"), it)) } - filter.performedByUserId?.let { userId -> - predicates.add(cb.equal(root.get("performedBy").get("id"), userId)) - } + filter.searchText + ?.takeIf { it.isNotBlank() } + ?.let { searchText -> + val isCountQuery = + query?.resultType == java.lang.Long::class.java || + query?.resultType == Long::class.javaPrimitiveType + + if (!isCountQuery) { + query?.distinct(true) + } + + val pattern = "%${searchText.lowercase()}%" + val performedBy = root.join("performedBy", JoinType.LEFT) + + predicates.add( + cb.or( + cb.like(cb.lower(root.get("message")), pattern), + cb.like(cb.lower(performedBy.get("username")), pattern), + cb.like(cb.lower(performedBy.get("firstname")), pattern), + cb.like(cb.lower(performedBy.get("lastname")), pattern), + ), + ) + } cb.and(*predicates.toTypedArray()) }