ReturningRequestSpecification.java

package com.nashtech.rookie.asset_management_0701.services.returning_request;

import java.time.LocalDate;
import java.util.Set;

import org.springframework.data.jpa.domain.Specification;

import com.nashtech.rookie.asset_management_0701.entities.Asset;
import com.nashtech.rookie.asset_management_0701.entities.Assignment;
import com.nashtech.rookie.asset_management_0701.entities.Location;
import com.nashtech.rookie.asset_management_0701.entities.ReturningRequest;
import com.nashtech.rookie.asset_management_0701.entities.User;
import com.nashtech.rookie.asset_management_0701.enums.EAssignmentReturnState;
import jakarta.persistence.criteria.Join;

public final class ReturningRequestSpecification {

    private ReturningRequestSpecification () {
    }

    public static Specification<ReturningRequest> hasAssetName (String assetName) {
        String lowerCase = assetName == null ? "" : assetName.trim().toLowerCase();
        return (root, query, criteriaBuilder) -> {
            Join<ReturningRequest, Assignment> assignment = root.join("assignment");
            Join<Assignment, Asset> asset = assignment.join("asset");
            return criteriaBuilder.like(criteriaBuilder.lower(asset.get("name")), "%" + lowerCase + "%");
        };
    }

    public static Specification<ReturningRequest> hasAssetCode (String assetCode) {
        String lowerCase = assetCode == null ? "" : assetCode.trim().toLowerCase();
        return (root, query, criteriaBuilder) -> {
            Join<ReturningRequest, Assignment> assignment = root.join("assignment");
            Join<Assignment, Asset> asset = assignment.join("asset");
            return criteriaBuilder.like(criteriaBuilder.lower(asset.get("assetCode")), "%" + lowerCase + "%");
        };
    }

    public static Specification<ReturningRequest> hasRequestUserName (String username){
        String lowerCaseName = username == null ? "" : username.trim().toLowerCase();
        return (root, query, criteriaBuilder) -> {
            Join<Assignment, User> assignmentAsset = root.join("requestedBy");
            return criteriaBuilder.like(criteriaBuilder.lower(assignmentAsset.get("username")), "%"+lowerCaseName+"%");
        };
    }

    public static Specification<ReturningRequest> hasState (Set<EAssignmentReturnState> states) {
        return (root, query, criteriaBuilder) -> {
            if (states == null || states.isEmpty()) {
                return null;
            }
            return root.get("state").in(states);
        };
    }

    public static Specification<ReturningRequest> hasReturnDate (LocalDate returnDate) {
        return (root, query, criteriaBuilder) -> {
            if (returnDate == null) {
                return null;
            }
            return criteriaBuilder.equal(root.get("returnDate"), returnDate);
        };
    }

    public static Specification<ReturningRequest> hasLocation (Location location) {
        return (root, query, criteriaBuilder) -> {
            if (location == null){
                return null;
            }
            Join<ReturningRequest, User> returningRequestUser = root.join("requestedBy");
            return criteriaBuilder.equal(returningRequestUser.get("location"), location);
        };
    }
}