@@ -101,22 +101,50 @@ func isValidAuditMethod(a string) bool {
101101 return false
102102}
103103
104- func (s * Storage ) GetPipelineList (projectID ProjectUID , fuzzySearchContent string , limit , offset uint32 , userId string , rangeDatasourceIds []string ) ([]* Pipeline , uint64 , error ) {
104+ func (s * Storage ) GetPipelineList (projectID ProjectUID , fuzzySearchContent string , limit , offset uint32 , userId string , rangeDatasourceIds []string , canViewAll bool ) ([]* Pipeline , uint64 , error ) {
105105 var count int64
106106 var pipelines []* Pipeline
107107 query := s .db .Model (& Pipeline {}).Where ("project_uid = ?" , projectID )
108- if userId != "" {
109- query = query .Where ("create_user_id = ? OR create_user_id IS NULL" , userId )
110- }
108+
109+ // 1. 模糊搜索
111110 if fuzzySearchContent != "" {
112111 query = query .Where ("name LIKE ? OR description LIKE ?" , "%" + fuzzySearchContent + "%" , "%" + fuzzySearchContent + "%" )
113112 }
114- if len (rangeDatasourceIds ) > 0 {
115- query = query .Joins ("JOIN pipeline_nodes ON pipelines.id = pipeline_nodes.pipeline_id" ).
116- Where ("pipeline_nodes.instance_id IN (?)" , rangeDatasourceIds ).
117- Group ("pipelines.id" )
113+
114+ // 2. 权限过滤
115+ if ! canViewAll {
116+ if len (rangeDatasourceIds ) > 0 {
117+ // 有数据源权限的用户可以看到:
118+ // 1. 包含权限范围内数据源的流水线(通过LEFT JOIN匹配)
119+ // 2. 自己创建的所有流水线
120+ // 3. 所有节点都是离线节点的流水线(通过NOT EXISTS检查)
121+ query = query .
122+ Joins ("LEFT JOIN pipeline_nodes ON pipelines.id = pipeline_nodes.pipeline_id" ).
123+ Where (`
124+ pipeline_nodes.instance_id IN (?) OR
125+ pipelines.create_user_id = ? OR
126+ NOT EXISTS (
127+ SELECT 1 FROM pipeline_nodes pn2
128+ WHERE pn2.pipeline_id = pipelines.id
129+ AND pn2.instance_id != 0
130+ )` , rangeDatasourceIds , userId ).
131+ Group ("pipelines.id" ) // 去重,因为LEFT JOIN可能产生重复记录
132+ } else if userId != "" {
133+ // 普通用户只能看到:
134+ // 1. 自己创建的流水线
135+ // 2. 所有节点都是离线节点的流水线
136+ query = query .Where (`
137+ create_user_id = ? OR
138+ NOT EXISTS (
139+ SELECT 1 FROM pipeline_nodes pn
140+ WHERE pn.pipeline_id = pipelines.id
141+ AND pn.instance_id != 0
142+ )` , userId )
143+ }
118144 }
145+ // canViewAll = true 时不添加任何过滤条件
119146
147+ // 3. 统计和分页查询
120148 err := query .Count (& count ).Error
121149 if err != nil {
122150 return pipelines , uint64 (count ), errors .New (errors .ConnectStorageError , err )
@@ -169,6 +197,27 @@ func (s *Storage) GetPipelineNodesByInstanceId(instanceID uint64) ([]*PipelineNo
169197 return nodes , nil
170198}
171199
200+ // GetPipelineNodesInBatch 批量获取多个流水线的节点
201+ func (s * Storage ) GetPipelineNodesInBatch (pipelineIDs []uint ) (map [uint ][]* PipelineNode , error ) {
202+ if len (pipelineIDs ) == 0 {
203+ return make (map [uint ][]* PipelineNode ), nil
204+ }
205+
206+ var nodes []* PipelineNode
207+ err := s .db .Model (PipelineNode {}).Where ("pipeline_id IN (?)" , pipelineIDs ).Find (& nodes ).Error
208+ if err != nil {
209+ return nil , errors .New (errors .ConnectStorageError , err )
210+ }
211+
212+ // 按pipeline_id分组
213+ nodeMap := make (map [uint ][]* PipelineNode )
214+ for _ , node := range nodes {
215+ nodeMap [node .PipelineID ] = append (nodeMap [node .PipelineID ], node )
216+ }
217+
218+ return nodeMap , nil
219+ }
220+
172221func (s * Storage ) CreatePipeline (pipeline * Pipeline , nodes []* PipelineNode ) error {
173222 return s .Tx (func (txDB * gorm.DB ) error {
174223 // 4.1 保存 Pipeline 到数据库
0 commit comments