feat(core): Allow transferring credentials in Public API (#10259)

This commit is contained in:
Iván Ovejero
2024-08-02 12:02:38 +02:00
committed by GitHub
parent 489ce10063
commit 07d7b247f0
8 changed files with 127 additions and 5 deletions

View File

@@ -9,9 +9,10 @@ import { randomApiKey, randomName } from '../shared/random';
import * as utils from '../shared/utils/';
import type { CredentialPayload, SaveCredentialFunction } from '../shared/types';
import * as testDb from '../shared/testDb';
import { affixRoleToSaveCredential } from '../shared/db/credentials';
import { affixRoleToSaveCredential, createCredentials } from '../shared/db/credentials';
import { addApiKey, createUser, createUserShell } from '../shared/db/users';
import type { SuperAgentTest } from '../shared/types';
import { createTeamProject } from '@test-integration/db/projects';
let owner: User;
let member: User;
@@ -256,6 +257,53 @@ describe('GET /credentials/schema/:credentialType', () => {
});
});
describe('PUT /credentials/:id/transfer', () => {
test('should transfer credential to project', async () => {
/**
* Arrange
*/
const [firstProject, secondProject] = await Promise.all([
createTeamProject('first-project', owner),
createTeamProject('second-project', owner),
]);
const credentials = await createCredentials(
{ name: 'Test', type: 'test', data: '' },
firstProject,
);
/**
* Act
*/
const response = await authOwnerAgent.put(`/credentials/${credentials.id}/transfer`).send({
destinationProjectId: secondProject.id,
});
/**
* Assert
*/
expect(response.statusCode).toBe(204);
});
test('if no destination project, should reject', async () => {
/**
* Arrange
*/
const project = await createTeamProject('first-project', member);
const credentials = await createCredentials({ name: 'Test', type: 'test', data: '' }, project);
/**
* Act
*/
const response = await authOwnerAgent.put(`/credentials/${credentials.id}/transfer`).send({});
/**
* Assert
*/
expect(response.statusCode).toBe(400);
});
});
const credentialPayload = (): CredentialPayload => ({
name: randomName(),
type: 'githubApi',

View File

@@ -1493,7 +1493,7 @@ describe('PUT /workflows/:id/transfer', () => {
* Arrange
*/
const firstProject = await createTeamProject('first-project', member);
const secondProject = await createTeamProject('secon-project', member);
const secondProject = await createTeamProject('second-project', member);
const workflow = await createWorkflow({}, firstProject);
/**

View File

@@ -38,11 +38,24 @@ export async function createManyCredentials(
);
}
export async function createCredentials(attributes: Partial<CredentialsEntity> = emptyAttributes) {
export async function createCredentials(
attributes: Partial<CredentialsEntity> = emptyAttributes,
project?: Project,
) {
const credentialsRepository = Container.get(CredentialsRepository);
const entity = credentialsRepository.create(attributes);
const credentials = await credentialsRepository.save(credentialsRepository.create(attributes));
return await credentialsRepository.save(entity);
if (project) {
await Container.get(SharedCredentialsRepository).save(
Container.get(SharedCredentialsRepository).create({
project,
credentials,
role: 'credential:owner',
}),
);
}
return credentials;
}
/**