package jnpf.dmsMapper;
import jnpf.dmsEntity.permission.vo.DmsFileCenterItemVO;
import jnpf.dmsPermission.DmsFileCenterQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface DmsFileCenterMapper {
String ACTIVE_READ = "p.tenant_id = #{q.tenantId} AND p.action_code = 'READ' "
+ "AND p.revoked_at IS NULL AND p.valid_from <= CURRENT_TIMESTAMP "
+ "AND (p.valid_to IS NULL OR CURRENT_TIMESTAMP < p.valid_to) "
+ "AND (p.max_use_count IS NULL OR p.used_count < p.max_use_count) ";
String PRINCIPAL_MATCH = "AND ((p.principal_type = 'USER' AND p.principal_id = #{q.userId}) "
+ " "
+ "OR (p.principal_type = 'ORG' AND p.include_child_orgs = FALSE AND p.principal_id IN "
+ "#{id}) "
+ " "
+ " "
+ "OR (p.principal_type = 'ORG' AND p.include_child_orgs = TRUE AND p.principal_id IN "
+ "#{id}) "
+ " "
+ " "
+ "OR (p.principal_type = 'POSITION' AND p.principal_id IN "
+ "#{id}) "
+ " "
+ " "
+ "OR (p.principal_type = 'ROLE' AND p.principal_id IN "
+ "#{id}) "
+ " "
+ " "
+ "OR (p.principal_type = 'GROUP' AND p.principal_id IN "
+ "#{id}) "
+ ") ";
String FOLDER_ANCESTORS = "WITH RECURSIVE folder_ancestors(id, parent_id) AS ( "
+ "SELECT f.id, f.parent_id FROM public.dms_folders f "
+ "WHERE f.tenant_id = #{q.tenantId} AND f.id = #{q.folderId} "
+ "UNION ALL SELECT parent.id, parent.parent_id FROM folder_ancestors child "
+ "JOIN public.dms_folders parent ON parent.tenant_id = #{q.tenantId} "
+ "AND parent.id = child.parent_id) ";
String VERSION_COLUMNS = "v.id, 'FILE_VERSION' AS resource_type, d.folder_id AS parent_id, "
+ "d.name, d.id AS document_id, d.document_no, d.document_type, d.responsible_dept_id, "
+ "v.version_no, v.version_label, v.file_name, v.mime_type, v.size_bytes, "
+ "v.checksum_sha256, v.prepared_by, v.prepared_on, s.lifecycle_status, "
+ "s.effective_from, s.effective_to, v.created_at ";
String ACTIVE_EXCLUSION = "e.tenant_id = #{q.tenantId} AND e.user_id = #{q.userId} "
+ "AND e.action_code = 'READ' AND e.revoked_at IS NULL "
+ "AND e.valid_from <= CURRENT_TIMESTAMP "
+ "AND (e.valid_to IS NULL OR CURRENT_TIMESTAMP < e.valid_to) ";
String SHARED_ELIGIBLE_VERSIONS = "WITH eligible_versions(file_version_id) AS ( "
+ " "
+ "SELECT s.file_version_id FROM public.dms_version_states s "
+ "WHERE s.tenant_id = #{q.tenantId} "
+ " "
+ "SELECT s.file_version_id FROM public.dms_file_permissions p "
+ "JOIN public.dms_version_states s ON s.tenant_id = p.tenant_id "
+ "AND s.document_id = p.resource_id WHERE " + ACTIVE_READ + PRINCIPAL_MATCH
+ "AND p.resource_type = 'DOCUMENT' "
+ "UNION SELECT p.resource_id FROM public.dms_file_permissions p WHERE "
+ ACTIVE_READ + PRINCIPAL_MATCH + "AND p.resource_type = 'FILE_VERSION' "
+ ") ";
@Select({""})
List selectFolders(@Param("q") DmsFileCenterQuery query);
@Select({""})
List selectCurrentDocuments(@Param("q") DmsFileCenterQuery query);
@Select({""})
List selectHistoricalVersions(@Param("q") DmsFileCenterQuery query);
@Select({""})
List selectDocumentVersions(@Param("q") DmsFileCenterQuery query);
@Select({""})
List selectSharedDocuments(@Param("q") DmsFileCenterQuery query);
@Select({""})
List selectSharedHistoricalVersions(@Param("q") DmsFileCenterQuery query);
}