刘光辉
14 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package jnpf.dmsMapper;
 
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import jnpf.dmsEntity.permission.entity.DmsFilePermissionEntity;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
 
import java.util.Date;
import java.util.List;
import java.util.UUID;
 
@Mapper
public interface DmsFilePermissionMapper extends BaseMapper<DmsFilePermissionEntity> {
    String COLUMNS = "id, tenant_id, resource_type, resource_id, resource_scope, principal_type, "
            + "principal_id, include_child_orgs, action_code, source_type, source_id, valid_from, "
            + "valid_to, max_use_count, used_count, grant_reason, granted_by_type, granted_by_id, "
            + "revoked_at, revoked_by_type, revoked_by_id, revoke_reason, revision, created_at, updated_at";
 
    @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 " + COLUMNS + " FROM public.dms_file_permissions "
            + "WHERE tenant_id = #{tenantId} AND source_type = #{sourceType} "
            + "AND source_id = #{sourceId} ORDER BY id")
    List<DmsFilePermissionEntity> selectBySource(@Param("tenantId") String tenantId,
                                                  @Param("sourceType") String sourceType,
                                                  @Param("sourceId") String sourceId);
 
    @Select("INSERT INTO public.dms_file_permissions (id, tenant_id, resource_type, resource_id, "
            + "resource_scope, principal_type, principal_id, include_child_orgs, action_code, "
            + "source_type, source_id, valid_from, valid_to, max_use_count, grant_reason, "
            + "granted_by_type, granted_by_id) VALUES (uuidv7(), #{p.tenantId}, #{p.resourceType}, "
            + "#{p.resourceId}, #{p.resourceScope}, #{p.principalType}, #{p.principalId}, "
            + "#{p.includeChildOrgs}, #{p.actionCode}, #{p.sourceType}, #{p.sourceId}, "
            + "#{p.validFrom}, #{p.validTo}, #{p.maxUseCount}, #{p.grantReason}, "
            + "#{p.grantedByType}, #{p.grantedById}) RETURNING " + COLUMNS)
    DmsFilePermissionEntity insertReturning(@Param("p") DmsFilePermissionEntity permission);
 
    @Select({"<script>",
            "SELECT ", COLUMNS, " FROM public.dms_file_permissions",
            "WHERE tenant_id = #{tenantId} AND action_code IN",
            "<foreach collection='actionCodes' item='action' open='(' separator=',' close=')'>#{action}</foreach>",
            "AND revoked_at IS NULL AND valid_from &lt;= CURRENT_TIMESTAMP",
            "AND (valid_to IS NULL OR CURRENT_TIMESTAMP &lt; valid_to)",
            "AND (max_use_count IS NULL OR used_count &lt; max_use_count)",
            "AND resource_id IN",
            "<foreach collection='resourceIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>",
            "ORDER BY CASE WHEN max_use_count IS NULL THEN 0 ELSE 1 END,",
            "CASE WHEN max_use_count IS NOT NULL THEN valid_to END ASC NULLS LAST, created_at, id",
            "</script>"})
    List<DmsFilePermissionEntity> selectCandidates(@Param("tenantId") String tenantId,
                                                    @Param("actionCodes") List<String> actionCodes,
                                                    @Param("resourceIds") List<UUID> resourceIds);
 
    @Select({"<script>",
            "SELECT ", COLUMNS, " FROM public.dms_file_permissions",
            "WHERE tenant_id = #{tenantId} AND resource_id IN",
            "<foreach collection='resourceIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>",
            "ORDER BY created_at DESC, id DESC LIMIT #{limit}",
            "</script>"})
    List<DmsFilePermissionEntity> selectForResourceIds(@Param("tenantId") String tenantId,
                                                        @Param("resourceIds") List<UUID> resourceIds,
                                                        @Param("limit") int limit);
 
    @Select("SELECT " + COLUMNS + " FROM public.dms_file_permissions "
            + "WHERE tenant_id = #{tenantId} AND id = #{id}")
    DmsFilePermissionEntity selectByTenantAndId(@Param("tenantId") String tenantId,
                                                 @Param("id") UUID id);
 
    @Select("SELECT " + COLUMNS + " FROM public.dms_file_permissions "
            + "WHERE tenant_id = #{tenantId} AND id = #{id} FOR UPDATE")
    DmsFilePermissionEntity selectByTenantAndIdForUpdate(@Param("tenantId") String tenantId,
                                                          @Param("id") UUID id);
 
    @Update("UPDATE public.dms_file_permissions SET revoked_at = CURRENT_TIMESTAMP, "
            + "revoked_by_type = #{actorType}, revoked_by_id = #{actorId}, revoke_reason = #{reason}, "
            + "revision = revision + 1 WHERE tenant_id = #{tenantId} AND id = #{id} "
            + "AND revoked_at IS NULL")
    int revoke(@Param("tenantId") String tenantId,
               @Param("id") UUID id,
               @Param("actorType") String actorType,
               @Param("actorId") String actorId,
               @Param("reason") String reason);
 
    @Select({"<script>",
            "SELECT ", COLUMNS, " FROM public.dms_file_permissions",
            "WHERE tenant_id = #{tenantId}",
            "<if test='resourceId != null'>AND resource_id = #{resourceId}</if>",
            "<if test='principalType != null and principalType != \"\"'>",
            "AND principal_type = #{principalType}",
            "</if>",
            "<if test='principalId != null and principalId != \"\"'>AND principal_id = #{principalId}</if>",
            "<if test='cursorTime != null'>",
            "AND (created_at, id) &lt; (#{cursorTime}, #{cursorId})",
            "</if>",
            "ORDER BY created_at DESC, id DESC LIMIT #{limit}",
            "</script>"})
    List<DmsFilePermissionEntity> selectPage(@Param("tenantId") String tenantId,
                                              @Param("resourceId") UUID resourceId,
                                              @Param("principalType") String principalType,
                                              @Param("principalId") String principalId,
                                              @Param("cursorTime") Date cursorTime,
                                              @Param("cursorId") UUID cursorId,
                                              @Param("limit") int limit);
}