const axios = require('axios');
const path = require('path');
const { readPropertiesFile, replacePlaceholders } = require('../essential');
/**
* Deletes multiple repositories from a GitLab group.
*
* @param {string} groupId - The ID of the GitLab group.
* @param {string[]} repoIds - An array of repository IDs to delete.
* @param {string} token - The GitLab access token for authentication.
* @returns {Promise<Object>} - An array of objects containing the deletion status of each repository.
*/
async function deleteGroupRepos(groupId, repoIds, token) {
return deleteRepos(repoIds, token, { group_id: groupId });
}
/**
* Deletes multiple personal repositories from GitLab.
*
* @param {string[]} repoIds - An array of repository IDs to delete.
* @param {string} token - The GitLab access token for authentication.
* @returns {Promise<Object>} - An array of objects containing the deletion status of each repository.
*/
async function deletePersonalRepos(repoIds, token) {
return deleteRepos(repoIds, token);
}
/**
* Deletes repositories from GitLab.
*
* @param {string[]} repoIds - An array of repository IDs to delete.
* @param {string} token - The GitLab access token for authentication.
* @param {object} replacements - Placeholder replacements for API URLs.
* @returns {Promise<Object>} - An array of objects containing the deletion status of each repository.
*/
async function deleteRepos(repoIds, token, replacements = {}) {
const filePath = path.join(__dirname, 'properties', 'api.properties');
const config = readPropertiesFile(filePath);
if (!config || !config.repospecificurl) {
throw new Error("Repository-specific URL is missing in the configuration.");
}
try {
const deleteRequests = repoIds.map(async (repoId) => {
const updatedReplacements = { ...replacements, project_id: repoId };
const url = replacePlaceholders(config.repospecificurl, updatedReplacements);
console.log(`Deleting repo ${repoId} at URL: ${url}`);
try {
const response = await axios.delete(url, {
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
});
return { repoId, status: 'success', data: response.data };
} catch (error) {
return {
repoId,
status: 'failed',
error: error.response?.data || error.message,
};
}
});
const results = await Promise.all(deleteRequests);
const failed = results.filter((result) => result.status === 'failed');
if (failed.length > 0) {
console.warn('Some repositories failed to delete:', JSON.stringify(failed, null, 2));
}
return results;
} catch (error) {
console.error('Error deleting GitLab repos:', error);
throw error;
}
}
module.exports = { deleteGroupRepos, deletePersonalRepos };
/*
@param groupId = String
@param repoIds = Array
@param token = String
*/
const { deleteGroupRepos, deletePersonalRepos } = require('jwz/gitlab'); // Adjust to the appropriate module
const groupId = 'your-group-id'; // Replace with your GitLab group ID
const repoIds = ['repo-id1', 'repo-id2']; // List of repository IDs to delete
const token = 'your-token'; // Your GitLab API token
// Deleting repositories from a group
const groupDeleteRes = await deleteGroupRepos(groupId, repoIds, token);
console.log('Group Deletion Result:', groupDeleteRes);
// Deleting personal repositories
const personalDeleteRes = await deletePersonalRepos(repoIds, token);
console.log('Personal Deletion Result:', personalDeleteRes);
The deleteRepos
function allows deleting multiple repositories from GitLab. It utilizes an API properties file to determine the deletion URL and sends authenticated DELETE requests using Axios.
groupId
: The GitLab group ID (optional, required for group repositories).repoIds
: An array of repository IDs to delete.token
: A GitLab personal access token for authentication.