2023-11-07 11:12:14 +01:00
package eu.eudat.query ;
import eu.eudat.authorization.AuthorizationFlags ;
2023-11-08 12:37:16 +01:00
import eu.eudat.authorization.Permission ;
2023-11-07 11:12:14 +01:00
import eu.eudat.commons.enums.DmpUserRole ;
2023-11-08 17:42:52 +01:00
import eu.eudat.commons.enums.IsActive ;
2023-11-07 11:12:14 +01:00
import eu.eudat.commons.scope.user.UserScope ;
2024-03-15 13:13:55 +01:00
import eu.eudat.data.* ;
2023-11-07 11:12:14 +01:00
import eu.eudat.model.DmpUser ;
2023-11-14 15:08:48 +01:00
import eu.eudat.model.PublicDmpUser ;
2024-03-12 17:27:16 +01:00
import eu.eudat.query.utils.BuildSubQueryInput ;
2023-11-08 17:42:52 +01:00
import eu.eudat.query.utils.QueryUtilsService ;
2023-11-07 11:12:14 +01:00
import gr.cite.commons.web.authz.service.AuthorizationService ;
import gr.cite.tools.data.query.FieldResolver ;
import gr.cite.tools.data.query.QueryBase ;
import gr.cite.tools.data.query.QueryContext ;
import jakarta.persistence.Tuple ;
import jakarta.persistence.criteria.CriteriaBuilder ;
import jakarta.persistence.criteria.Predicate ;
2024-03-15 13:13:55 +01:00
import jakarta.persistence.criteria.Subquery ;
2023-11-07 11:12:14 +01:00
import org.springframework.beans.factory.config.ConfigurableBeanFactory ;
import org.springframework.context.annotation.Scope ;
import org.springframework.stereotype.Component ;
import java.time.Instant ;
import java.util.* ;
@Component
@Scope ( value = ConfigurableBeanFactory . SCOPE_PROTOTYPE )
public class DmpUserQuery extends QueryBase < DmpUserEntity > {
private Collection < UUID > ids ;
2023-11-08 16:13:07 +01:00
private Collection < IsActive > isActives ;
2023-11-07 11:12:14 +01:00
private Collection < UUID > dmpIds ;
2024-03-15 13:13:55 +01:00
private Collection < UUID > descriptionIds ;
2023-11-07 11:12:14 +01:00
private Collection < UUID > userIds ;
private Collection < DmpUserRole > userRoles ;
2024-02-21 11:46:24 +01:00
private Collection < UUID > sectionIds ;
2024-03-19 16:21:50 +01:00
private Boolean sectionIsEmpty ;
2024-02-21 11:46:24 +01:00
2023-11-07 11:12:14 +01:00
private EnumSet < AuthorizationFlags > authorize = EnumSet . of ( AuthorizationFlags . None ) ;
2023-11-08 17:42:52 +01:00
2023-11-07 11:12:14 +01:00
public DmpUserQuery ids ( UUID value ) {
this . ids = List . of ( value ) ;
return this ;
}
public DmpUserQuery ids ( UUID . . . value ) {
this . ids = Arrays . asList ( value ) ;
return this ;
}
public DmpUserQuery ids ( Collection < UUID > values ) {
this . ids = values ;
return this ;
}
2023-11-08 16:13:07 +01:00
public DmpUserQuery isActives ( IsActive value ) {
this . isActives = List . of ( value ) ;
return this ;
}
public DmpUserQuery isActives ( IsActive . . . value ) {
this . isActives = Arrays . asList ( value ) ;
return this ;
}
public DmpUserQuery isActives ( Collection < IsActive > values ) {
this . isActives = values ;
return this ;
}
2023-11-07 11:12:14 +01:00
public DmpUserQuery dmpIds ( UUID value ) {
this . dmpIds = List . of ( value ) ;
return this ;
}
public DmpUserQuery dmpIds ( UUID . . . value ) {
this . dmpIds = Arrays . asList ( value ) ;
return this ;
}
public DmpUserQuery dmpIds ( Collection < UUID > values ) {
this . dmpIds = values ;
return this ;
}
2024-03-15 13:13:55 +01:00
public DmpUserQuery descriptionIds ( UUID value ) {
this . descriptionIds = List . of ( value ) ;
return this ;
}
public DmpUserQuery descriptionIds ( UUID . . . value ) {
this . descriptionIds = Arrays . asList ( value ) ;
return this ;
}
public DmpUserQuery descriptionIds ( Collection < UUID > values ) {
this . descriptionIds = values ;
return this ;
}
2023-11-07 11:12:14 +01:00
public DmpUserQuery userRoles ( DmpUserRole value ) {
this . userRoles = List . of ( value ) ;
return this ;
}
public DmpUserQuery userRoles ( DmpUserRole . . . value ) {
this . userRoles = Arrays . asList ( value ) ;
return this ;
}
public DmpUserQuery userRoles ( Collection < DmpUserRole > values ) {
this . userRoles = values ;
return this ;
}
public DmpUserQuery userIds ( UUID value ) {
this . userIds = List . of ( value ) ;
return this ;
}
public DmpUserQuery userIds ( UUID . . . value ) {
this . userIds = Arrays . asList ( value ) ;
return this ;
}
public DmpUserQuery userIds ( Collection < UUID > values ) {
this . userIds = values ;
return this ;
}
2024-02-21 11:46:24 +01:00
public DmpUserQuery sectionIds ( UUID value ) {
this . sectionIds = List . of ( value ) ;
return this ;
}
public DmpUserQuery sectionIds ( UUID . . . value ) {
this . sectionIds = Arrays . asList ( value ) ;
return this ;
}
public DmpUserQuery sectionIds ( Collection < UUID > values ) {
this . sectionIds = values ;
return this ;
}
2024-03-19 16:21:50 +01:00
public DmpUserQuery sectionIsEmpty ( Boolean sectionIsEmpty ) {
this . sectionIsEmpty = sectionIsEmpty ;
return this ;
}
2024-02-21 11:46:24 +01:00
2023-11-07 11:12:14 +01:00
public DmpUserQuery authorize ( EnumSet < AuthorizationFlags > values ) {
this . authorize = values ;
return this ;
}
private final UserScope userScope ;
private final AuthorizationService authService ;
2023-11-08 17:42:52 +01:00
private final QueryUtilsService queryUtilsService ;
2023-11-07 11:12:14 +01:00
public DmpUserQuery (
UserScope userScope ,
2023-11-08 17:42:52 +01:00
AuthorizationService authService ,
QueryUtilsService queryUtilsService ) {
2023-11-07 11:12:14 +01:00
this . userScope = userScope ;
this . authService = authService ;
2023-11-08 17:42:52 +01:00
this . queryUtilsService = queryUtilsService ;
2023-11-07 11:12:14 +01:00
}
@Override
protected Class < DmpUserEntity > entityClass ( ) {
return DmpUserEntity . class ;
}
@Override
protected Boolean isFalseQuery ( ) {
2024-03-15 13:13:55 +01:00
return this . isEmpty ( this . ids ) | | this . isEmpty ( this . dmpIds ) | | this . isEmpty ( this . descriptionIds ) | | this . isEmpty ( this . userIds ) ;
2023-11-07 11:12:14 +01:00
}
2023-11-08 12:37:16 +01:00
@Override
protected < X , Y > Predicate applyAuthZ ( QueryContext < X , Y > queryContext ) {
if ( this . authorize . contains ( AuthorizationFlags . None ) ) return null ;
if ( this . authorize . contains ( AuthorizationFlags . Permission ) & & this . authService . authorize ( Permission . BrowseDmp ) ) return null ;
2023-11-08 17:42:52 +01:00
UUID userId = null ;
boolean usePublic = this . authorize . contains ( AuthorizationFlags . Public ) ;
if ( this . authorize . contains ( AuthorizationFlags . DmpAssociated ) ) userId = this . userScope . getUserIdSafe ( ) ;
2023-11-08 12:37:16 +01:00
List < Predicate > predicates = new ArrayList < > ( ) ;
2023-11-08 17:42:52 +01:00
if ( userId ! = null | | usePublic ) {
predicates . add ( queryContext . CriteriaBuilder . or (
2023-12-05 15:05:37 +01:00
usePublic ? queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpUserEntity . _dmpId ) ) . value ( queryUtilsService . buildPublicDmpAuthZSubQuery ( queryContext . Query , queryContext . CriteriaBuilder , usePublic ) ) : queryContext . CriteriaBuilder . or ( ) , //Creates a false query
2024-03-12 17:27:16 +01:00
userId ! = null ? queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpUserEntity . _dmpId ) ) . value ( queryUtilsService . buildDmpUserAuthZSubQuery ( queryContext . Query , queryContext . CriteriaBuilder , userId ) ) : queryContext . CriteriaBuilder . or ( ) //Creates a false query
2023-11-08 17:42:52 +01:00
) ) ;
2023-11-08 12:37:16 +01:00
}
2023-11-08 16:13:07 +01:00
if ( ! predicates . isEmpty ( ) ) {
2023-11-08 12:37:16 +01:00
Predicate [ ] predicatesArray = predicates . toArray ( new Predicate [ 0 ] ) ;
return queryContext . CriteriaBuilder . and ( predicatesArray ) ;
} else {
return queryContext . CriteriaBuilder . or ( ) ; //Creates a false query
}
}
2024-03-12 17:27:16 +01:00
2023-11-07 11:12:14 +01:00
@Override
protected < X , Y > Predicate applyFilters ( QueryContext < X , Y > queryContext ) {
List < Predicate > predicates = new ArrayList < > ( ) ;
if ( this . ids ! = null ) {
CriteriaBuilder . In < UUID > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpUserEntity . _id ) ) ;
for ( UUID item : this . ids )
inClause . value ( item ) ;
predicates . add ( inClause ) ;
}
2023-11-08 16:13:07 +01:00
if ( this . isActives ! = null ) {
CriteriaBuilder . In < IsActive > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpUserEntity . _isActive ) ) ;
for ( IsActive item : this . isActives )
inClause . value ( item ) ;
predicates . add ( inClause ) ;
}
2023-11-07 11:12:14 +01:00
if ( this . dmpIds ! = null ) {
2023-12-05 15:05:37 +01:00
CriteriaBuilder . In < UUID > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpUserEntity . _dmpId ) ) ;
2023-11-07 11:12:14 +01:00
for ( UUID item : this . dmpIds )
inClause . value ( item ) ;
predicates . add ( inClause ) ;
}
2024-03-19 16:21:50 +01:00
if ( this . sectionIsEmpty ! = null ) {
if ( this . sectionIsEmpty ) predicates . add ( queryContext . CriteriaBuilder . isNull ( queryContext . Root . get ( DmpUserEntity . _sectionId ) ) ) ;
else predicates . add ( queryContext . CriteriaBuilder . isNotNull ( queryContext . Root . get ( DmpUserEntity . _sectionId ) ) ) ;
}
2024-03-15 13:13:55 +01:00
if ( this . descriptionIds ! = null ) {
Subquery < UUID > descriptionSubquery = queryUtilsService . buildSubQuery ( new BuildSubQueryInput < > (
new BuildSubQueryInput . Builder < > ( DescriptionEntity . class , UUID . class , queryContext )
. keyPathFunc ( ( subQueryRoot ) - > subQueryRoot . get ( DescriptionEntity . _dmpId ) )
. filterFunc ( ( subQueryRoot , cb ) - > {
CriteriaBuilder . In < UUID > inClause = cb . in ( subQueryRoot . get ( DmpUserEntity . _id ) ) ;
for ( UUID item : this . descriptionIds )
inClause . value ( item ) ;
return inClause ;
} )
) ) ;
predicates . add ( queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpUserEntity . _dmpId ) ) . value ( descriptionSubquery ) ) ;
}
2023-11-07 11:12:14 +01:00
if ( this . userIds ! = null ) {
2023-11-20 16:09:24 +01:00
CriteriaBuilder . In < UUID > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpUserEntity . _userId ) ) ;
2023-11-07 11:12:14 +01:00
for ( UUID item : this . userIds )
inClause . value ( item ) ;
predicates . add ( inClause ) ;
}
2024-02-21 11:46:24 +01:00
if ( this . sectionIds ! = null ) {
CriteriaBuilder . In < UUID > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpUserEntity . _sectionId ) ) ;
for ( UUID item : this . sectionIds )
inClause . value ( item ) ;
predicates . add ( inClause ) ;
}
2023-11-07 11:12:14 +01:00
if ( this . userRoles ! = null ) {
CriteriaBuilder . In < DmpUserRole > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpUserEntity . _role ) ) ;
for ( DmpUserRole item : this . userRoles )
inClause . value ( item ) ;
predicates . add ( inClause ) ;
}
if ( ! predicates . isEmpty ( ) ) {
Predicate [ ] predicatesArray = predicates . toArray ( new Predicate [ 0 ] ) ;
return queryContext . CriteriaBuilder . and ( predicatesArray ) ;
} else {
return null ;
}
}
@Override
protected DmpUserEntity convert ( Tuple tuple , Set < String > columns ) {
DmpUserEntity item = new DmpUserEntity ( ) ;
item . setId ( QueryBase . convertSafe ( tuple , columns , DmpUserEntity . _id , UUID . class ) ) ;
2024-04-03 12:22:22 +02:00
item . setTenantId ( QueryBase . convertSafe ( tuple , columns , DmpUserEntity . _tenantId , UUID . class ) ) ;
2023-12-05 15:05:37 +01:00
item . setDmpId ( QueryBase . convertSafe ( tuple , columns , DmpUserEntity . _dmpId , UUID . class ) ) ;
2023-11-20 16:09:24 +01:00
item . setUserId ( QueryBase . convertSafe ( tuple , columns , DmpUserEntity . _userId , UUID . class ) ) ;
2024-02-21 11:46:24 +01:00
item . setSectionId ( QueryBase . convertSafe ( tuple , columns , DmpUserEntity . _sectionId , UUID . class ) ) ;
2023-11-07 11:12:14 +01:00
item . setRole ( QueryBase . convertSafe ( tuple , columns , DmpUserEntity . _role , DmpUserRole . class ) ) ;
item . setCreatedAt ( QueryBase . convertSafe ( tuple , columns , DmpUserEntity . _createdAt , Instant . class ) ) ;
item . setUpdatedAt ( QueryBase . convertSafe ( tuple , columns , DmpUserEntity . _updatedAt , Instant . class ) ) ;
2024-03-11 08:47:03 +01:00
item . setIsActive ( QueryBase . convertSafe ( tuple , columns , DmpUserEntity . _isActive , IsActive . class ) ) ;
2023-11-07 11:12:14 +01:00
return item ;
}
@Override
protected String fieldNameOf ( FieldResolver item ) {
2023-11-14 15:08:48 +01:00
if ( item . match ( DmpUser . _id ) | | item . match ( PublicDmpUser . _id ) ) return DmpUserEntity . _id ;
2023-12-05 15:05:37 +01:00
else if ( item . prefix ( DmpUser . _dmp ) | | item . prefix ( PublicDmpUser . _dmp ) ) return DmpUserEntity . _dmpId ;
2023-11-20 16:09:24 +01:00
else if ( item . prefix ( DmpUser . _user ) | | item . prefix ( PublicDmpUser . _user ) ) return DmpUserEntity . _userId ;
2023-11-14 15:08:48 +01:00
else if ( item . match ( DmpUser . _role ) | | item . match ( PublicDmpUser . _role ) ) return DmpUserEntity . _role ;
2024-02-21 11:46:24 +01:00
else if ( item . match ( DmpUser . _sectionId ) ) return DmpUserEntity . _sectionId ;
2023-11-07 11:12:14 +01:00
else if ( item . match ( DmpUser . _createdAt ) ) return DmpUserEntity . _createdAt ;
else if ( item . match ( DmpUser . _updatedAt ) ) return DmpUserEntity . _updatedAt ;
2024-03-11 08:47:03 +01:00
else if ( item . match ( DmpUser . _isActive ) ) return DmpUserEntity . _isActive ;
2023-11-20 16:09:24 +01:00
else if ( item . match ( DmpUser . _hash ) ) return DmpUserEntity . _updatedAt ;
2024-03-13 16:04:17 +01:00
else if ( item . match ( DmpUser . _dmp ) ) return DmpUserEntity . _dmpId ;
else if ( item . match ( DmpUser . _user ) ) return DmpUserEntity . _userId ;
2024-04-03 12:22:22 +02:00
else if ( item . match ( DmpUser . _belongsToCurrentTenant ) ) return DmpUserEntity . _tenantId ;
2023-11-07 11:12:14 +01:00
else return null ;
}
2023-11-08 17:42:52 +01:00
2023-11-07 11:12:14 +01:00
}