package jnpf.dmsMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import jnpf.dmsEntity.permission.entity.DmsPermissionResourceEntity; import jnpf.dmsEntity.permission.vo.DmsPermissionResourceVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.Date; import java.util.List; import java.util.UUID; @Mapper public interface DmsPermissionResourceMapper extends BaseMapper { String RESOURCE_VIEW_SQL = "SELECT r.id, r.resource_type, " + "CASE r.resource_type WHEN 'FOLDER' THEN f.parent_id WHEN 'DOCUMENT' THEN d.folder_id " + "WHEN 'FILE_VERSION' THEN v.document_id END AS parent_id, " + "CASE r.resource_type WHEN 'FOLDER' THEN f.name WHEN 'DOCUMENT' THEN d.name " + "WHEN 'FILE_VERSION' THEN v.file_name END AS name, " + "CASE r.resource_type WHEN 'DOCUMENT' THEN d.id " + "WHEN 'FILE_VERSION' THEN v.document_id END AS document_id, " + "COALESCE(d.name, version_document.name) AS document_name, " + "COALESCE(d.document_no, version_document.document_no) AS document_no, " + "COALESCE(v.version_no, current_version.version_no) AS version_no, " + "COALESCE(v.version_label, current_version.version_label) AS version_label, " + "COALESCE(v.file_name, current_version.file_name) AS file_name, " + "COALESCE(v.mime_type, current_version.mime_type) AS mime_type, " + "COALESCE(v.size_bytes, current_version.size_bytes) AS size_bytes, " + "COALESCE(v.checksum_sha256, current_version.checksum_sha256) AS checksum_sha256, " + "COALESCE(version_state.lifecycle_status, current_state.lifecycle_status) AS lifecycle_status, " + "COALESCE(version_state.effective_from, current_state.effective_from) AS effective_from, " + "COALESCE(version_state.effective_to, current_state.effective_to) AS effective_to, " + "r.source_type, r.source_id, CASE r.resource_type " + "WHEN 'FOLDER' THEN f.created_at WHEN 'DOCUMENT' THEN current_version.created_at " + "WHEN 'FILE_VERSION' THEN v.created_at ELSE r.created_at END AS created_at " + "FROM public.dms_permission_resources r " + "LEFT JOIN public.dms_folders f ON r.resource_type = 'FOLDER' " + "AND f.tenant_id = r.tenant_id AND f.id = r.id " + "LEFT JOIN public.dms_documents d ON r.resource_type = 'DOCUMENT' " + "AND d.tenant_id = r.tenant_id AND d.id = r.id " + "LEFT JOIN public.dms_file_versions v ON r.resource_type = 'FILE_VERSION' " + "AND v.tenant_id = r.tenant_id AND v.id = r.id " + "LEFT JOIN public.dms_documents version_document ON r.resource_type = 'FILE_VERSION' " + "AND version_document.tenant_id = v.tenant_id AND version_document.id = v.document_id " + "LEFT JOIN public.dms_version_states current_state ON r.resource_type = 'DOCUMENT' " + "AND current_state.tenant_id = r.tenant_id AND current_state.document_id = r.id " + "AND current_state.lifecycle_status = 'EFFECTIVE' " + "AND CURRENT_TIMESTAMP >= current_state.effective_from " + "AND (current_state.effective_to IS NULL OR current_state.effective_to > CURRENT_TIMESTAMP) " + "LEFT JOIN public.dms_file_versions current_version ON current_version.tenant_id = current_state.tenant_id " + "AND current_version.document_id = current_state.document_id " + "AND current_version.id = current_state.file_version_id " + "LEFT JOIN public.dms_version_states version_state ON r.resource_type = 'FILE_VERSION' " + "AND version_state.tenant_id = v.tenant_id AND version_state.document_id = v.document_id " + "AND version_state.file_version_id = v.id "; @Select("SELECT uuidv7()") UUID nextUuidV7(); @Select("SELECT 1 FROM (SELECT pg_advisory_xact_lock(hashtextextended(#{tenantId} || ':' " + "|| #{sourceType} || ':' || #{sourceId}, 0))) advisory_lock") Integer lockSource(@Param("tenantId") String tenantId, @Param("sourceType") String sourceType, @Param("sourceId") String sourceId); @Select("SELECT id, tenant_id, resource_type, source_type, source_id, registered_by, created_at " + "FROM public.dms_permission_resources WHERE tenant_id = #{tenantId} AND id = #{id}") DmsPermissionResourceEntity selectByTenantAndId(@Param("tenantId") String tenantId, @Param("id") UUID id); @Select("SELECT id, tenant_id, resource_type, source_type, source_id, registered_by, created_at " + "FROM public.dms_permission_resources WHERE tenant_id = #{tenantId} " + "AND source_type = #{sourceType} AND source_id = #{sourceId}") DmsPermissionResourceEntity selectBySource(@Param("tenantId") String tenantId, @Param("sourceType") String sourceType, @Param("sourceId") String sourceId); @Select({""}) List selectByTenantAndIds(@Param("tenantId") String tenantId, @Param("ids") List ids); @Select(RESOURCE_VIEW_SQL + "WHERE r.tenant_id = #{tenantId} AND r.id = #{id}") DmsPermissionResourceVO selectView(@Param("tenantId") String tenantId, @Param("id") UUID id); @Select({""}) List selectPage(@Param("tenantId") String tenantId, @Param("resourceType") String resourceType, @Param("cursorTime") Date cursorTime, @Param("cursorId") UUID cursorId, @Param("limit") int limit); @Select({""}) List selectChildren(@Param("tenantId") String tenantId, @Param("parentId") UUID parentId, @Param("limit") int limit); }