• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

screwdriver-cd / screwdriver / #3202

25 Jul 2025 04:52PM UTC coverage: 67.669% (-27.3%) from 94.935%
#3202

push

screwdriver

web-flow
feat(3363): Update the existing endpoint to get admin for a pipeline from the specified SCM context (#3370)

1284 of 2114 branches covered (60.74%)

Branch coverage included in aggregate %.

1 of 11 new or added lines in 1 file covered. (9.09%)

1235 existing lines in 49 files now uncovered.

3417 of 4833 relevant lines covered (70.7%)

50.53 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

10.23
/plugins/pipelines/list.js
1
'use strict';
2

3
const joi = require('joi');
1✔
4
const schema = require('screwdriver-data-schema');
1✔
5
const idSchema = schema.models.pipeline.base.extract('id');
1✔
6
const scmUriSchema = schema.models.pipeline.base.extract('scmUri');
1✔
7
const scmContextSchema = schema.models.pipeline.base.extract('scmContext');
1✔
8
const listSchema = joi.array().items(schema.models.pipeline.get).label('List of Pipelines');
1✔
9
const pipelineIdsSchema = joi.alternatives().try(joi.array().items(idSchema), idSchema).required();
1✔
10
const IDS_KEY = 'ids[]';
1✔
11

12
module.exports = () => ({
434✔
13
    method: 'GET',
14
    path: '/pipelines',
15
    options: {
16
        description: 'Get pipelines with pagination',
17
        notes: 'Returns all pipeline records',
18
        tags: ['api', 'pipelines'],
19
        auth: {
20
            strategies: ['token'],
21
            scope: ['user', 'pipeline']
22
        },
23

24
        handler: async (request, h) => {
UNCOV
25
            const { pipelineFactory } = request.server.app;
×
UNCOV
26
            const { sort, configPipelineId, sortBy, search, scmUri, page, count } = request.query;
×
UNCOV
27
            const scmContexts = request.query.scmContext
×
28
                ? [request.query.scmContext]
29
                : pipelineFactory.scm.getScmContexts();
UNCOV
30
            let pipelineArray = [];
×
31

UNCOV
32
            scmContexts.forEach(sc => {
×
UNCOV
33
                const config = {
×
34
                    params: { scmContext: sc },
35
                    sort
36
                };
37

38
                // Only return specific pipelines
UNCOV
39
                if (request.query[IDS_KEY]) {
×
UNCOV
40
                    const ids = request.query[IDS_KEY];
×
41

UNCOV
42
                    config.params.id = Array.isArray(ids)
×
UNCOV
43
                        ? ids.map(pipelineId => parseInt(pipelineId, 10))
×
44
                        : [parseInt(ids, 10)];
45
                }
46

UNCOV
47
                if (configPipelineId) {
×
UNCOV
48
                    config.params.configPipelineId = configPipelineId;
×
49
                }
50

UNCOV
51
                if (sortBy) {
×
UNCOV
52
                    config.sortBy = sortBy;
×
53
                }
54

UNCOV
55
                if (search) {
×
UNCOV
56
                    config.search = {
×
57
                        field: 'name',
58
                        // Do a fuzzy search for name: screwdriver-cd/ui
59
                        // See https://www.w3schools.com/sql/sql_like.asp for syntax
60
                        keyword: `%${search}%`
61
                    };
UNCOV
62
                } else if (scmUri) {
×
63
                    // The format of scmUri is 'github.com:123:main:source-dir'
64
                    // Search pipelines based on the same repository (include other branch)
UNCOV
65
                    const [scm, id] = scmUri.split(':');
×
66

UNCOV
67
                    config.search = {
×
68
                        field: 'scmUri',
69
                        keyword: `${scm}:${id}:%`
70
                    };
71
                } else {
72
                    // default list all to 50 max count, according to schema.api.pagination
UNCOV
73
                    config.paginate = {
×
74
                        page: 1,
75
                        count: 50
76
                    };
77
                }
78

UNCOV
79
                if (page) {
×
UNCOV
80
                    config.paginate = config.paginate || {};
×
UNCOV
81
                    config.paginate.page = page;
×
82
                }
83

UNCOV
84
                if (count) {
×
UNCOV
85
                    config.paginate = config.paginate || {};
×
UNCOV
86
                    config.paginate.count = count;
×
87
                }
88

UNCOV
89
                const pipelines = pipelineFactory.list(config);
×
90

UNCOV
91
                pipelineArray = pipelineArray.concat(pipelines);
×
92
            });
93

UNCOV
94
            return Promise.all(pipelineArray)
×
UNCOV
95
                .then(pipelineArrays => [].concat(...pipelineArrays))
×
96
                .then(allPipelines => {
UNCOV
97
                    const { username, scope, scmContext, scmUserId } = request.auth.credentials;
×
98
                    let adminDetails;
99

UNCOV
100
                    if (scmContext) {
×
UNCOV
101
                        const scmDisplayName = pipelineFactory.scm.getDisplayName({ scmContext });
×
102

UNCOV
103
                        adminDetails = request.server.plugins.banners.screwdriverAdminDetails(
×
104
                            username,
105
                            scmDisplayName,
106
                            scmUserId
107
                        );
108
                    }
109

UNCOV
110
                    if (scope.includes('user') && adminDetails && adminDetails.isAdmin) {
×
UNCOV
111
                        return allPipelines;
×
112
                    }
113

UNCOV
114
                    return allPipelines.filter(pipeline => {
×
UNCOV
115
                        const { settings, scmRepo, admins } = pipeline;
×
UNCOV
116
                        const setToPublic = settings && settings.public;
×
UNCOV
117
                        const privatePipeline = scmRepo && scmRepo.private;
×
118

UNCOV
119
                        return !privatePipeline || setToPublic || admins[username];
×
120
                    });
121
                })
UNCOV
122
                .then(allPipelines => h.response(allPipelines.map(p => p.toJson())))
×
123
                .catch(err => {
UNCOV
124
                    throw err;
×
125
                });
126
        },
127
        response: {
128
            schema: listSchema
129
        },
130
        validate: {
131
            query: schema.api.pagination.concat(
132
                joi.object({
133
                    configPipelineId: idSchema,
134
                    'ids[]': pipelineIdsSchema.optional(),
135
                    scmUri: scmUriSchema,
136
                    scmContext: scmContextSchema.optional()
137
                })
138
            )
139
        }
140
    }
141
});
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc