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 };
/*
@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);
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.
repoIds
: An array of repository IDs.collaborators
: A 2D array mapping repositories to their collaborators.token
: An authentication token for API requests.replacements
: (Optional) Additional replacements, such as group_id
.