Remove Collaborators - GitLab Documentation

Code

const axios = require('axios');
const path = require('path');
const { readPropertiesFile, replacePlaceholders } = require('../essential');

/**
 * Generic function to remove collaborators from repositories.
 *
 * @param {Array<string>} repoIds - List of repository IDs.
 * @param {Array<Array<string>>} collaborators - A 2D array of user IDs.
 * @param {string} token - Authentication token.
 * @param {Object} replacements - Additional replacements like { group_id }.
 * @returns {Promise<Array<Object>>} - Array of results per repository.
 */
async function removeCollaborators(repoIds, collaborators, token, replacements = {}) {
    const filePath = path.join(__dirname, 'properties', 'api.properties');
    const config = readPropertiesFile(filePath);

    if (!config.repocollaboratorurlmember) {
        throw new Error("API base URL is missing in the configuration.");
    }

    const baseUrl = config.repocollaboratorurlmember;

    if (!Array.isArray(repoIds) || !Array.isArray(collaborators) || repoIds.length !== collaborators.length) {
        throw new Error("Invalid input parameters.");
    }

    const results = [];

    for (let i = 0; i < repoIds.length; i++) {
        const repoId = repoIds[i];
        const repoResults = [];

        for (const collaborator of collaborators[i]) {
            const urlReplacements = { ...replacements, project_id: repoId, user_id: collaborator };
            const requestUrl = replacePlaceholders(baseUrl, urlReplacements);

            try {
                const response = await axios.delete(requestUrl, {
                    headers: { Authorization: `Bearer ${token}` },
                });

                repoResults.push({ collaborator, success: true, status: response.status });

            } catch (error) {
                repoResults.push({
                    collaborator,
                    success: false,
                    status: error.response?.status || 'Unknown',
                    error: error.response?.data || error.message,
                });
            }
        }

        results.push({ repoId, results: repoResults });
    }

    return results;
}

/**
 * Removes collaborators from repositories owned by a group.
 */
async function removeFromGroupRepos(groupId, repoIds, collaborators, token) {
    return removeCollaborators(repoIds, collaborators, token, { group_id: groupId });
}

/**
 * Removes collaborators from personal repositories.
 */
async function removeFromPersonalRepos(repoIds, collaborators, token) {
    return removeCollaborators(repoIds, collaborators, token);
}

module.exports = { removeFromGroupRepos, removeFromPersonalRepos };

Usage

/*
    @param repoIds = Array
    @param collaborators = Array
    @param token = String
    @param replacements = Object (optional)
*/
const { removeFromGroupRepos, removeFromPersonalRepos } = require('jwz/gitlab');

const groupId = 'your-group-id';
const repoIds = ['repoId1', 'repoId2'];
const collaborators = [['collaborator1', 'collaborator2'], ['collaborator3']];
const token = 'your-token';

// Remove collaborators from group repositories
const resGroup = await removeFromGroupRepos(groupId, repoIds, collaborators, token);
console.log('Group Repositories:', resGroup);

// Remove collaborators from personal repositories
const resPersonal = await removeFromPersonalRepos(repoIds, collaborators, token);
console.log('Personal Repositories:', resPersonal);

Explanation

The removeCollaborators function is a utility for removing collaborators from repositories. It reads API configurations from an external properties file and makes authenticated API calls to remove users.