<?xml version="1.0" encoding="UTF-8"?>
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<mapper namespace="jnpf.dmsMapper.DmsFileCenterMapper">
|
<resultMap id="Item" type="jnpf.dmsEntity.permission.vo.DmsFileCenterItemVO">
|
<result column="id" property="id" typeHandler="jnpf.dmsDatabase.DmsUuidTypeHandler"/>
|
<result column="resource_type" property="resourceType"/>
|
<result column="parent_id" property="parentId" typeHandler="jnpf.dmsDatabase.DmsUuidTypeHandler"/>
|
<result column="name" property="name"/>
|
<result column="document_id" property="documentId" typeHandler="jnpf.dmsDatabase.DmsUuidTypeHandler"/>
|
<result column="document_no" property="documentNo"/>
|
<result column="document_type" property="documentType"/>
|
<result column="responsible_dept_id" property="responsibleDeptId"/>
|
<result column="version_no" property="versionNo"/>
|
<result column="version_label" property="versionLabel"/>
|
<result column="file_name" property="fileName"/>
|
<result column="mime_type" property="mimeType"/>
|
<result column="size_bytes" property="sizeBytes"/>
|
<result column="checksum_sha256" property="checksumSha256"/>
|
<result column="extended_properties" property="extendedProperties" typeHandler="jnpf.dmsDatabase.DmsJsonNodeTypeHandler"/>
|
<result column="prepared_by" property="preparedBy"/>
|
<result column="prepared_on" property="preparedOn"/>
|
<result column="lifecycle_status" property="lifecycleStatus"/>
|
<result column="invalidated_at" property="invalidatedAt"/>
|
<result column="revoked_at" property="revokedAt"/>
|
<result column="status_reason" property="statusReason"/>
|
<result column="effective_from" property="effectiveFrom"/>
|
<result column="effective_to" property="effectiveTo"/>
|
<result column="review_cycle_months" property="reviewCycleMonths"/>
|
<result column="last_reviewed_on" property="lastReviewedOn"/>
|
<result column="next_review_on" property="nextReviewOn"/>
|
<result column="created_at" property="createdAt"/>
|
<result column="sort_code" property="sortCode"/>
|
<result column="revision" property="revision"/>
|
<result column="has_children" property="hasChildren"/>
|
</resultMap>
|
<sql id="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) </sql>
|
<sql id="PRINCIPAL_MATCH">AND ((p.principal_type = 'USER' AND p.principal_id = #{q.userId}) <if test='q.directOrgIds != null and !q.directOrgIds.isEmpty()'> OR (p.principal_type = 'ORG' AND p.include_child_orgs = FALSE AND p.principal_id IN <foreach collection='q.directOrgIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) </if> <if test='q.immediateParentOrgIds != null and !q.immediateParentOrgIds.isEmpty()'> OR (p.principal_type = 'ORG' AND p.approved_org_scope = 'CHILDREN' AND p.source_type = 'WORKFLOW' AND p.granted_by_type = 'SERVICE' AND p.granted_by_id = 'dms-approved-read' AND p.action_code = 'READ' AND p.resource_type = 'FILE_VERSION' AND p.principal_id IN <foreach collection='q.immediateParentOrgIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) </if> <if test='q.ancestorOrgIds != null and !q.ancestorOrgIds.isEmpty()'> OR (p.principal_type = 'ORG' AND p.include_child_orgs = TRUE AND p.principal_id IN <foreach collection='q.ancestorOrgIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) </if> <if test='q.positionIds != null and !q.positionIds.isEmpty()'> OR (p.principal_type = 'POSITION' AND p.principal_id IN <foreach collection='q.positionIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) </if> <if test='q.roleIds != null and !q.roleIds.isEmpty()'> OR (p.principal_type = 'ROLE' AND p.principal_id IN <foreach collection='q.roleIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) </if> <if test='q.permissionGroupIds != null and !q.permissionGroupIds.isEmpty()'> OR (p.principal_type = 'GROUP' AND p.principal_id IN <foreach collection='q.permissionGroupIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) </if>) </sql>
|
<sql id="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} AND f.f_delete_mark IS NULL 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 AND parent.f_delete_mark IS NULL) </sql>
|
<sql id="FOLDER_SEARCH_SCOPE">WITH RECURSIVE folder_descendants(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} AND f.f_delete_mark IS NULL UNION ALL SELECT child.id, child.parent_id FROM folder_descendants parent JOIN public.dms_folders child ON child.tenant_id = #{q.tenantId} AND child.parent_id = parent.id AND child.f_delete_mark IS NULL), search_folder_ancestors(folder_id, ancestor_id, parent_id) AS ( SELECT folder.id, folder.id, folder.parent_id FROM folder_descendants folder UNION ALL SELECT chain.folder_id, parent.id, parent.parent_id FROM search_folder_ancestors chain JOIN public.dms_folders parent ON parent.tenant_id = #{q.tenantId} AND parent.id = chain.parent_id AND parent.f_delete_mark IS NULL) </sql>
|
<sql id="FILE_SEARCH_MATCH">AND (STRPOS(LOWER(COALESCE(v.file_name, '')), LOWER(#{q.keyword})) > 0 OR STRPOS(LOWER(COALESCE(d.name, '')), LOWER(#{q.keyword})) > 0 OR STRPOS(LOWER(COALESCE(d.document_no, '')), LOWER(#{q.keyword})) > 0) </sql>
|
<sql id="HISTORICAL_STATE">AND (s.lifecycle_status IN ('SUPERSEDED', 'EXPIRED', 'REVOKED', 'OBSOLETE') OR (s.lifecycle_status = 'EFFECTIVE' AND s.effective_to <= CURRENT_TIMESTAMP) OR (s.lifecycle_status = 'INVALIDATED' AND s.approved_at IS NOT NULL)) </sql>
|
<sql id="SEARCH_FOLDER_READ">OR (p.resource_type = 'FOLDER' AND (p.resource_id = d.folder_id OR (p.resource_scope = 'SUBTREE' AND p.resource_id IN (SELECT ancestor_id FROM search_folder_ancestors WHERE folder_id = d.folder_id))))) </sql>
|
<sql id="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, v.extended_properties, CASE WHEN s.lifecycle_status='EFFECTIVE' AND s.effective_to <= CURRENT_TIMESTAMP THEN 'EXPIRED' ELSE s.lifecycle_status END AS lifecycle_status, CASE WHEN s.lifecycle_status='INVALIDATED' THEN s.effective_to END AS invalidated_at, CASE WHEN s.lifecycle_status='REVOKED' THEN s.status_changed_at END AS revoked_at, s.status_reason, s.effective_from, s.effective_to, s.review_cycle_months, s.last_reviewed_on, s.next_review_on, v.created_at </sql>
|
<sql id="DOCUMENT_DIRECTORY_NAME">COALESCE((SELECT initial_version.file_name FROM public.dms_file_versions initial_version WHERE initial_version.tenant_id = d.tenant_id AND initial_version.document_id = d.id ORDER BY initial_version.version_no, initial_version.id LIMIT 1), d.name)</sql>
|
<sql id="DOCUMENT_COLUMNS">d.id, 'DOCUMENT' AS resource_type, d.folder_id AS parent_id, <include refid="DOCUMENT_DIRECTORY_NAME"/> AS name, d.id AS document_id, d.document_no, d.document_type, d.responsible_dept_id, NULL::BIGINT AS version_no, NULL::TEXT AS version_label, NULL::TEXT AS file_name, NULL::TEXT AS mime_type, NULL::BIGINT AS size_bytes, NULL::TEXT AS checksum_sha256, NULL::TEXT AS prepared_by, NULL::DATE AS prepared_on, NULL::jsonb AS extended_properties, CASE WHEN d.access_status='disable' AND d.disable_reason='yishixiao' THEN 'INVALIDATED' WHEN d.access_status='disable' AND d.disable_reason='yichexiao' THEN 'REVOKED' END AS lifecycle_status, CASE WHEN d.disable_reason='yishixiao' THEN d.disabled_at END AS invalidated_at, CASE WHEN d.disable_reason='yichexiao' THEN d.disabled_at END AS revoked_at, NULL::TEXT AS status_reason, NULL::TIMESTAMP AS effective_from, NULL::TIMESTAMP AS effective_to, NULL::INTEGER AS review_cycle_months, NULL::DATE AS last_reviewed_on, NULL::DATE AS next_review_on, d.created_at </sql>
|
<sql id="DOCUMENT_FOLDER_ANCESTORS">WITH RECURSIVE folder_ancestors(id, parent_id) AS ( SELECT f.id, f.parent_id FROM public.dms_folders f JOIN public.dms_documents start_document ON start_document.tenant_id = f.tenant_id AND start_document.folder_id = f.id WHERE f.tenant_id = #{q.tenantId} AND start_document.id = #{q.documentId} AND f.f_delete_mark IS NULL 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 AND parent.f_delete_mark IS NULL) </sql>
|
<sql id="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) </sql>
|
<sql id="SHARED_ELIGIBLE_VERSIONS">WITH eligible_versions(file_version_id) AS ( <choose><when test='q.administrator'> SELECT s.file_version_id FROM public.dms_version_states s WHERE s.tenant_id = #{q.tenantId} </when><otherwise> 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 <include refid="ACTIVE_READ"/><include refid="PRINCIPAL_MATCH"/>AND p.resource_type = 'DOCUMENT' UNION SELECT p.resource_id FROM public.dms_file_permissions p WHERE <include refid="ACTIVE_READ"/><include refid="PRINCIPAL_MATCH"/>AND p.resource_type = 'FILE_VERSION' </otherwise></choose>) </sql>
|
<select id="selectFolders" resultMap="Item">
|
WITH RECURSIVE parent_ancestors(id, parent_id) AS (
|
<choose>
|
<when test='q.parentId != null'>
|
SELECT f.id, f.parent_id FROM public.dms_folders f
|
WHERE f.tenant_id = #{q.tenantId} AND f.id = #{q.parentId} AND f.f_delete_mark IS NULL
|
</when>
|
<otherwise>SELECT NULL::UUID, NULL::UUID WHERE FALSE</otherwise>
|
</choose>
|
UNION ALL SELECT parent.id, parent.parent_id FROM parent_ancestors child
|
JOIN public.dms_folders parent ON parent.tenant_id = #{q.tenantId}
|
AND parent.id = child.parent_id AND parent.f_delete_mark IS NULL)
|
<if test='!q.administrator'>
|
, authorized_navigation_seeds(id, parent_id) AS (
|
SELECT granted.id, granted.parent_id FROM public.dms_file_permissions p
|
JOIN public.dms_folders granted ON granted.tenant_id = p.tenant_id
|
AND granted.id = p.resource_id AND granted.f_delete_mark IS NULL WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND p.resource_type = 'FOLDER'
|
UNION SELECT document_folder.id, document_folder.parent_id FROM public.dms_file_permissions p
|
JOIN public.dms_documents granted_document ON granted_document.tenant_id = p.tenant_id
|
AND granted_document.id = p.resource_id
|
JOIN public.dms_folders document_folder ON document_folder.tenant_id = granted_document.tenant_id
|
AND document_folder.id = granted_document.folder_id AND document_folder.f_delete_mark IS NULL
|
WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND p.resource_type = 'DOCUMENT'
|
AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE
|
<include refid="ACTIVE_EXCLUSION"/>
|
AND e.resource_type = 'DOCUMENT' AND e.resource_id = granted_document.id)
|
UNION SELECT version_folder.id, version_folder.parent_id FROM public.dms_file_permissions p
|
JOIN public.dms_file_versions granted_version ON granted_version.tenant_id = p.tenant_id
|
AND granted_version.id = p.resource_id
|
JOIN public.dms_documents version_document ON version_document.tenant_id = granted_version.tenant_id
|
AND version_document.id = granted_version.document_id
|
JOIN public.dms_folders version_folder ON version_folder.tenant_id = version_document.tenant_id
|
AND version_folder.id = version_document.folder_id AND version_folder.f_delete_mark IS NULL
|
WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND p.resource_type = 'FILE_VERSION'
|
AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE
|
<include refid="ACTIVE_EXCLUSION"/>
|
AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = version_document.id)
|
OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = granted_version.id))))
|
, authorized_navigation_ancestors(id, parent_id) AS (
|
SELECT seed.id, seed.parent_id FROM authorized_navigation_seeds seed
|
UNION SELECT parent.id, parent.parent_id FROM authorized_navigation_ancestors child
|
JOIN public.dms_folders parent ON parent.tenant_id = #{q.tenantId}
|
AND parent.id = child.parent_id AND parent.f_delete_mark IS NULL)
|
</if>
|
SELECT f.id, 'FOLDER' AS resource_type, f.parent_id, f.name, f.sort_code, f.revision, f.created_at
|
<if test='q.includeFolderChildren'>
|
, EXISTS (SELECT 1 FROM public.dms_folders child_folder
|
WHERE child_folder.tenant_id = #{q.tenantId} AND child_folder.parent_id = f.id
|
AND child_folder.f_delete_mark IS NULL
|
<if test='!q.administrator'>
|
AND (child_folder.id IN (SELECT id FROM authorized_navigation_ancestors)
|
OR EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND p.resource_type = 'FOLDER' AND (p.resource_id = child_folder.id OR
|
(p.resource_scope = 'SUBTREE' AND (p.resource_id = f.id
|
OR p.resource_id IN (SELECT id FROM parent_ancestors))))))
|
</if>
|
) AS has_children
|
</if>
|
FROM public.dms_folders f
|
WHERE f.tenant_id = #{q.tenantId} AND f.f_delete_mark IS NULL
|
<choose>
|
<when test='q.parentId == null'>AND f.parent_id IS NULL</when>
|
<otherwise>AND f.parent_id = #{q.parentId}</otherwise>
|
</choose>
|
<if test='q.cursorSortCode != null'>
|
AND (f.sort_code > #{q.cursorSortCode}
|
OR (f.sort_code = #{q.cursorSortCode} AND f.id > #{q.cursorId}))
|
</if>
|
<if test='!q.administrator'>
|
AND (EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND p.resource_type = 'FOLDER' AND (p.resource_id = f.id OR
|
(p.resource_scope = 'SUBTREE' AND p.resource_id IN (SELECT id FROM parent_ancestors))))
|
OR f.id IN (SELECT id FROM authorized_navigation_ancestors))
|
</if>
|
ORDER BY f.sort_code, f.id LIMIT #{q.limit}
|
</select>
|
<select id="selectCurrentDocuments" resultMap="Item">
|
<include refid="FOLDER_ANCESTORS"/>
|
SELECT DISTINCT
|
<include refid="DOCUMENT_COLUMNS"/>
|
FROM public.dms_documents d
|
JOIN public.dms_documents member ON member.tenant_id=d.tenant_id AND (member.id=d.id OR member.main_document_id=d.id)
|
JOIN public.dms_version_states s ON s.tenant_id = d.tenant_id AND s.document_id = member.id
|
JOIN public.dms_file_versions v ON v.tenant_id = s.tenant_id
|
AND v.document_id = s.document_id AND v.id = s.file_version_id
|
WHERE d.tenant_id = #{q.tenantId} AND d.folder_id = #{q.folderId} AND d.main_document_id IS NULL
|
AND d.access_status='enabled'
|
AND NOT EXISTS (SELECT 1 FROM public.dms_documents parent WHERE parent.tenant_id=d.tenant_id
|
AND parent.id=d.main_document_id AND parent.access_status='disable')
|
AND s.lifecycle_status = 'EFFECTIVE' AND s.effective_from <= CURRENT_TIMESTAMP
|
AND (s.effective_to IS NULL OR CURRENT_TIMESTAMP < s.effective_to)
|
<if test='q.cursorName != null'>
|
AND (<include refid="DOCUMENT_DIRECTORY_NAME"/> > #{q.cursorName} OR
|
(<include refid="DOCUMENT_DIRECTORY_NAME"/> = #{q.cursorName} AND d.id > #{q.cursorDocumentId}))
|
</if>
|
<if test='!q.administrator'>
|
AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE
|
<include refid="ACTIVE_EXCLUSION"/>
|
AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = member.id)
|
OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))
|
AND EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND ((p.resource_type = 'DOCUMENT' AND p.resource_id = member.id)
|
OR (p.resource_type = 'FILE_VERSION' AND p.resource_id = v.id)
|
OR (p.resource_type = 'FOLDER' AND (p.resource_id = #{q.folderId}
|
OR (p.resource_scope = 'SUBTREE' AND p.resource_id IN (SELECT id FROM folder_ancestors))))))
|
</if>
|
ORDER BY <include refid="DOCUMENT_DIRECTORY_NAME"/>, d.id LIMIT #{q.limit}
|
</select>
|
<select id="selectCurrentFiles" resultMap="Item">
|
<include refid="FOLDER_SEARCH_SCOPE"/>
|
SELECT
|
<include refid="VERSION_COLUMNS"/>
|
FROM public.dms_documents d
|
JOIN public.dms_version_states s ON s.tenant_id = d.tenant_id AND s.document_id = d.id
|
JOIN public.dms_file_versions v ON v.tenant_id = s.tenant_id
|
AND v.document_id = s.document_id AND v.id = s.file_version_id
|
WHERE d.tenant_id = #{q.tenantId}
|
AND d.folder_id IN (SELECT id FROM folder_descendants)
|
AND d.access_status='enabled'
|
AND NOT EXISTS (SELECT 1 FROM public.dms_documents parent WHERE parent.tenant_id=d.tenant_id
|
AND parent.id=d.main_document_id AND parent.access_status='disable')
|
AND s.lifecycle_status = 'EFFECTIVE' AND s.effective_from <= CURRENT_TIMESTAMP
|
AND (s.effective_to IS NULL OR CURRENT_TIMESTAMP < s.effective_to)
|
<include refid="FILE_SEARCH_MATCH"/>
|
<if test='q.cursorName != null'>
|
AND (d.name > #{q.cursorName}
|
OR (d.name = #{q.cursorName} AND d.id > #{q.cursorDocumentId})
|
OR (d.name = #{q.cursorName} AND d.id = #{q.cursorDocumentId} AND v.id > #{q.cursorId}))
|
</if>
|
<if test='!q.administrator'>
|
AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE
|
<include refid="ACTIVE_EXCLUSION"/>
|
AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)
|
OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))
|
AND EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND ((p.resource_type = 'DOCUMENT' AND p.resource_id = d.id)
|
OR (p.resource_type = 'FILE_VERSION' AND p.resource_id = v.id)
|
<include refid="SEARCH_FOLDER_READ"/>
|
)
|
</if>
|
ORDER BY d.name, d.id, v.id LIMIT #{q.limit}
|
</select>
|
<select id="fileNameExists" resultType="boolean">
|
SELECT EXISTS (
|
SELECT 1 FROM public.dms_documents d
|
JOIN public.dms_version_states s ON s.tenant_id = d.tenant_id AND s.document_id = d.id
|
JOIN public.dms_file_versions v ON v.tenant_id = s.tenant_id
|
AND v.document_id = s.document_id AND v.id = s.file_version_id
|
WHERE d.tenant_id = #{tenantId} AND d.folder_id = #{folderId}
|
AND v.file_name = #{fileName}
|
AND d.access_status = 'enabled'
|
AND NOT EXISTS (SELECT 1 FROM public.dms_documents parent WHERE parent.tenant_id = d.tenant_id
|
AND parent.id = d.main_document_id AND parent.access_status = 'disable')
|
AND s.lifecycle_status = 'EFFECTIVE' AND s.effective_from <= CURRENT_TIMESTAMP
|
AND (s.effective_to IS NULL OR CURRENT_TIMESTAMP < s.effective_to)
|
)
|
</select>
|
<select id="selectHistoricalVersions" resultMap="Item">
|
<include refid="FOLDER_ANCESTORS"/>
|
SELECT
|
<include refid="DOCUMENT_COLUMNS"/>
|
FROM public.dms_documents d
|
WHERE d.tenant_id = #{q.tenantId} AND d.folder_id = #{q.folderId} AND d.main_document_id IS NULL
|
<if test='q.cursorName != null'>
|
AND (<include refid="DOCUMENT_DIRECTORY_NAME"/> > #{q.cursorName}
|
OR (<include refid="DOCUMENT_DIRECTORY_NAME"/> = #{q.cursorName} AND d.id > #{q.cursorDocumentId}))
|
</if>
|
AND EXISTS (SELECT 1 FROM public.dms_documents member
|
JOIN public.dms_file_versions v ON v.tenant_id=member.tenant_id AND v.document_id=member.id
|
JOIN public.dms_version_states s ON s.tenant_id = v.tenant_id
|
AND s.document_id = v.document_id AND s.file_version_id = v.id
|
WHERE member.tenant_id=d.tenant_id AND (member.id=d.id OR member.main_document_id=d.id)
|
<include refid="HISTORICAL_STATE"/>
|
<if test='!q.administrator'>
|
AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE
|
<include refid="ACTIVE_EXCLUSION"/>
|
AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = member.id)
|
OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))
|
AND EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND ((p.resource_type = 'DOCUMENT' AND p.resource_id = member.id)
|
OR (p.resource_type = 'FILE_VERSION' AND p.resource_id = v.id)
|
OR (p.resource_type = 'FOLDER' AND (p.resource_id = #{q.folderId}
|
OR (p.resource_scope = 'SUBTREE' AND p.resource_id IN (SELECT id FROM folder_ancestors))))))
|
</if>
|
)
|
ORDER BY <include refid="DOCUMENT_DIRECTORY_NAME"/>, d.id LIMIT #{q.limit}
|
</select>
|
<select id="selectHistoricalFiles" resultMap="Item">
|
<include refid="FOLDER_SEARCH_SCOPE"/>
|
SELECT
|
<include refid="VERSION_COLUMNS"/>
|
FROM public.dms_documents d
|
JOIN public.dms_file_versions v ON v.tenant_id = d.tenant_id AND v.document_id = d.id
|
JOIN public.dms_version_states s ON s.tenant_id = v.tenant_id
|
AND s.document_id = v.document_id AND s.file_version_id = v.id
|
WHERE d.tenant_id = #{q.tenantId}
|
AND d.folder_id IN (SELECT id FROM folder_descendants)
|
<include refid="HISTORICAL_STATE"/>
|
<include refid="FILE_SEARCH_MATCH"/>
|
<if test='q.cursorName != null'>
|
AND (d.name > #{q.cursorName}
|
OR (d.name = #{q.cursorName} AND d.id > #{q.cursorDocumentId})
|
OR (d.name = #{q.cursorName} AND d.id = #{q.cursorDocumentId}
|
AND v.version_no < #{q.cursorVersionNo})
|
OR (d.name = #{q.cursorName} AND d.id = #{q.cursorDocumentId}
|
AND v.version_no = #{q.cursorVersionNo} AND v.id < #{q.cursorId}))
|
</if>
|
<if test='!q.administrator'>
|
AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE
|
<include refid="ACTIVE_EXCLUSION"/>
|
AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)
|
OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))
|
AND EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND ((p.resource_type = 'DOCUMENT' AND p.resource_id = d.id)
|
OR (p.resource_type = 'FILE_VERSION' AND p.resource_id = v.id)
|
<include refid="SEARCH_FOLDER_READ"/>
|
)
|
</if>
|
ORDER BY d.name, d.id, v.version_no DESC, v.id DESC LIMIT #{q.limit}
|
</select>
|
<select id="selectCurrentDocumentVersions" resultMap="Item">
|
<include refid="DOCUMENT_FOLDER_ANCESTORS"/>
|
SELECT
|
<include refid="VERSION_COLUMNS"/>
|
FROM public.dms_documents d
|
JOIN public.dms_version_states s ON s.tenant_id = d.tenant_id AND s.document_id = d.id
|
JOIN public.dms_file_versions v ON v.tenant_id = s.tenant_id
|
AND v.document_id = s.document_id AND v.id = s.file_version_id
|
WHERE d.tenant_id = #{q.tenantId} AND (d.id = #{q.documentId} OR d.main_document_id = #{q.documentId})
|
AND d.access_status='enabled'
|
AND NOT EXISTS (SELECT 1 FROM public.dms_documents parent WHERE parent.tenant_id=d.tenant_id
|
AND parent.id=d.main_document_id AND parent.access_status='disable')
|
AND s.lifecycle_status = 'EFFECTIVE' AND s.effective_from <= CURRENT_TIMESTAMP
|
AND (s.effective_to IS NULL OR CURRENT_TIMESTAMP < s.effective_to)
|
<if test='q.keyword != null'>
|
<include refid="FILE_SEARCH_MATCH"/>
|
</if>
|
<if test='q.cursorVersionNo != null'>
|
AND (v.version_no < #{q.cursorVersionNo}
|
OR (v.version_no = #{q.cursorVersionNo} AND v.id < #{q.cursorId}))
|
</if>
|
<if test='!q.administrator'>
|
AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE
|
<include refid="ACTIVE_EXCLUSION"/>
|
AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)
|
OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))
|
AND EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND ((p.resource_type = 'DOCUMENT' AND p.resource_id = d.id)
|
OR (p.resource_type = 'FILE_VERSION' AND p.resource_id = v.id)
|
OR (p.resource_type = 'FOLDER' AND (p.resource_id = d.folder_id
|
OR (p.resource_scope = 'SUBTREE' AND p.resource_id IN (SELECT id FROM folder_ancestors))))))
|
</if>
|
ORDER BY v.version_no DESC, v.id DESC LIMIT #{q.limit}
|
</select>
|
<select id="selectDocumentVersions" resultMap="Item">
|
<include refid="DOCUMENT_FOLDER_ANCESTORS"/>
|
SELECT
|
<include refid="VERSION_COLUMNS"/>
|
FROM public.dms_documents d
|
JOIN public.dms_file_versions v ON v.tenant_id = d.tenant_id AND v.document_id = d.id
|
JOIN public.dms_version_states s ON s.tenant_id = v.tenant_id
|
AND s.document_id = v.document_id AND s.file_version_id = v.id
|
WHERE d.tenant_id = #{q.tenantId} AND (d.id = #{q.documentId} OR d.main_document_id = #{q.documentId})
|
<include refid="HISTORICAL_STATE"/>
|
<if test='q.keyword != null'>
|
<include refid="FILE_SEARCH_MATCH"/>
|
</if>
|
<if test='q.cursorVersionNo != null'>
|
AND (v.version_no < #{q.cursorVersionNo}
|
OR (v.version_no = #{q.cursorVersionNo} AND v.id < #{q.cursorId}))
|
</if>
|
<if test='!q.administrator'>
|
AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE
|
<include refid="ACTIVE_EXCLUSION"/>
|
AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)
|
OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))
|
AND EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE
|
<include refid="ACTIVE_READ"/>
|
<include refid="PRINCIPAL_MATCH"/>
|
AND ((p.resource_type = 'DOCUMENT' AND p.resource_id = d.id)
|
OR (p.resource_type = 'FILE_VERSION' AND p.resource_id = v.id)
|
OR (p.resource_type = 'FOLDER' AND (p.resource_id = d.folder_id
|
OR (p.resource_scope = 'SUBTREE' AND p.resource_id IN (SELECT id FROM folder_ancestors))))))
|
</if>
|
ORDER BY v.version_no DESC, v.id DESC LIMIT #{q.limit}
|
</select>
|
<select id="selectSharedDocuments" resultMap="Item">
|
<include refid="SHARED_ELIGIBLE_VERSIONS"/>
|
SELECT
|
<include refid="VERSION_COLUMNS"/>
|
FROM public.dms_documents d
|
JOIN public.dms_version_states s ON s.tenant_id = d.tenant_id AND s.document_id = d.id
|
JOIN public.dms_file_versions v ON v.tenant_id = s.tenant_id
|
AND v.document_id = s.document_id AND v.id = s.file_version_id
|
JOIN eligible_versions allowed ON allowed.file_version_id = v.id
|
WHERE d.tenant_id = #{q.tenantId}
|
AND d.access_status='enabled'
|
AND NOT EXISTS (SELECT 1 FROM public.dms_documents parent WHERE parent.tenant_id=d.tenant_id
|
AND parent.id=d.main_document_id AND parent.access_status='disable')
|
AND s.lifecycle_status = 'EFFECTIVE' AND s.effective_from <= CURRENT_TIMESTAMP
|
AND (s.effective_to IS NULL OR CURRENT_TIMESTAMP < s.effective_to)
|
<if test='q.cursorName != null'>
|
AND (d.name > #{q.cursorName} OR
|
(d.name = #{q.cursorName} AND d.id > #{q.cursorDocumentId}))
|
</if>
|
<if test='!q.administrator'>
|
AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE
|
<include refid="ACTIVE_EXCLUSION"/>
|
AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)
|
OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))
|
</if>
|
ORDER BY d.name, d.id LIMIT #{q.limit}
|
</select>
|
<select id="selectSharedHistoricalVersions" resultMap="Item">
|
<include refid="SHARED_ELIGIBLE_VERSIONS"/>
|
SELECT
|
<include refid="VERSION_COLUMNS"/>
|
FROM public.dms_documents d
|
JOIN public.dms_file_versions v ON v.tenant_id = d.tenant_id AND v.document_id = d.id
|
JOIN public.dms_version_states s ON s.tenant_id = v.tenant_id
|
AND s.document_id = v.document_id AND s.file_version_id = v.id
|
JOIN eligible_versions allowed ON allowed.file_version_id = v.id
|
WHERE d.tenant_id = #{q.tenantId}
|
<include refid="HISTORICAL_STATE"/>
|
<if test='q.cursorName != null'>
|
AND (d.name > #{q.cursorName}
|
OR (d.name = #{q.cursorName} AND d.id > #{q.cursorDocumentId})
|
OR (d.name = #{q.cursorName} AND d.id = #{q.cursorDocumentId}
|
AND v.version_no < #{q.cursorVersionNo})
|
OR (d.name = #{q.cursorName} AND d.id = #{q.cursorDocumentId}
|
AND v.version_no = #{q.cursorVersionNo} AND v.id < #{q.cursorId}))
|
</if>
|
<if test='!q.administrator'>
|
AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE
|
<include refid="ACTIVE_EXCLUSION"/>
|
AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)
|
OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))
|
</if>
|
ORDER BY d.name, d.id, v.version_no DESC, v.id DESC LIMIT #{q.limit}
|
</select>
|
</mapper>
|