Add reference params

This commit is contained in:
Matej Bačo 2025-02-19 11:50:25 +01:00
parent f7749bbbef
commit 63a91e30fa
4 changed files with 77 additions and 11 deletions

View file

@ -19,7 +19,7 @@ use Utopia\VCS\Exception\RepositoryNotFound;
class Base extends Action
{
public function redeployVcsFunction(Request $request, Document $function, Document $project, Document $installation, Database $dbForProject, Build $queueForBuilds, Document $template, GitHub $github): Document
public function redeployVcsFunction(Request $request, Document $function, Document $project, Document $installation, Database $dbForProject, Build $queueForBuilds, Document $template, GitHub $github, string $referenceType = 'branch', string $reference = ''): Document
{
$deploymentId = ID::unique();
$entrypoint = $function->getAttribute('entrypoint', '');
@ -37,7 +37,12 @@ class Base extends Action
} catch (RepositoryNotFound $e) {
throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND);
}
$providerBranch = $function->getAttribute('providerBranch', 'main');
// TODO: Support tag and commit in future
if ($referenceType === 'branch') {
$providerBranch = empty($reference) ? $function->getAttribute('providerBranch', 'main') : $reference;
}
$authorUrl = "https://github.com/$owner";
$repositoryUrl = "https://github.com/$owner/$repositoryName";
$branchUrl = "https://github.com/$owner/$repositoryName/tree/$providerBranch";
@ -95,7 +100,7 @@ class Base extends Action
return $deployment;
}
public function redeployVcsSite(Request $request, Document $site, Document $project, Document $installation, Database $dbForProject, Database $dbForPlatform, Build $queueForBuilds, Document $template, GitHub $github): Document
public function redeployVcsSite(Request $request, Document $site, Document $project, Document $installation, Database $dbForProject, Database $dbForPlatform, Build $queueForBuilds, Document $template, GitHub $github, string $referenceType = 'branch', string $reference = ''): Document
{
$deploymentId = ID::unique();
$providerInstallationId = $installation->getAttribute('providerInstallationId', '');
@ -113,7 +118,11 @@ class Base extends Action
throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND);
}
$providerBranch = $site->getAttribute('providerBranch', 'main');
// TODO: Support tag and commit in future
if ($referenceType === 'branch') {
$providerBranch = empty($reference) ? $site->getAttribute('providerBranch', 'main') : $reference;
}
$authorUrl = "https://github.com/$owner";
$repositoryUrl = "https://github.com/$owner/$repositoryName";
$branchUrl = "https://github.com/$owner/$repositoryName/tree/$providerBranch";

View file

@ -16,6 +16,8 @@ use Utopia\Database\Validator\UID;
use Utopia\Platform\Action;
use Utopia\Platform\Scope\HTTP;
use Utopia\Swoole\Request;
use Utopia\Validator\Text;
use Utopia\Validator\WhiteList;
use Utopia\VCS\Adapter\Git\GitHub;
class Create extends Base
@ -32,7 +34,7 @@ class Create extends Base
$this
->setHttpMethod(Action::HTTP_REQUEST_METHOD_POST)
->setHttpPath('/v1/functions/:functionId/deployments/vcs')
->desc('Create deployment')
->desc('Create VCS deployment')
->groups(['api', 'functions'])
->label('scope', 'functions.write')
->label('event', 'functions.[functionId].deployments.[deploymentId].create')
@ -43,6 +45,8 @@ class Create extends Base
name: 'createVcsDeployment',
description: <<<EOT
Create a deployment when a function is connected to VCS.
This endpoint lets you create deployment from a branch, commit, or a tag.
EOT,
auth: [AuthType::KEY],
responses: [
@ -53,6 +57,9 @@ class Create extends Base
],
))
->param('functionId', '', new UID(), 'Function ID.')
// TODO: Support tag and commit in future
->param('type', '', new WhiteList(['branch']), 'Type of reference passed. Allowed values are: branch')
->param('reference', '', new Text(255), 'VCS reference to create deployment from. Depending on type this can be: branch name')
->inject('request')
->inject('response')
->inject('dbForProject')
@ -64,7 +71,7 @@ class Create extends Base
->callback([$this, 'action']);
}
public function action(string $functionId, Request $request, Response $response, Database $dbForProject, Database $dbForPlatform, Document $project, Event $queueForEvents, Build $queueForBuilds, GitHub $github)
public function action(string $functionId, string $type, string $reference, Request $request, Response $response, Database $dbForProject, Database $dbForPlatform, Document $project, Event $queueForEvents, Build $queueForBuilds, GitHub $github)
{
$function = $dbForProject->getDocument('functions', $functionId);
@ -76,7 +83,18 @@ class Create extends Base
$installation = $dbForPlatform->getDocument('installations', $function->getAttribute('installationId'));
$deployment = $this->redeployVcsFunction($request, $function, $project, $installation, $dbForProject, $queueForBuilds, $template, $github);
$deployment = $this->redeployVcsFunction(
request: $request,
function: $function,
project: $project,
installation: $installation,
dbForProject: $dbForProject,
queueForBuilds: $queueForBuilds,
template: $template,
github: $github,
reference: $reference,
referenceType: $type
);
$queueForEvents
->setParam('functionId', $function->getId())

View file

@ -19,9 +19,11 @@ use Utopia\Database\Validator\Authorization;
use Utopia\Database\Validator\UID;
use Utopia\Platform\Action;
use Utopia\Platform\Scope\HTTP;
use Utopia\Swoole\Request;
use Utopia\System\System;
use Utopia\Validator\Boolean;
use Utopia\Validator\Text;
use Utopia\VCS\Adapter\Git\GitHub;
class Create extends Base
{
@ -65,16 +67,18 @@ class Create extends Base
->param('rootDirectory', '', new Text(128, 0), 'Path to site code in the template repo.')
->param('version', '', new Text(128, 0), 'Version (tag) for the repo linked to the site template.')
->param('activate', false, new Boolean(), 'Automatically activate the deployment when it is finished building.', true)
->inject('request')
->inject('response')
->inject('dbForProject')
->inject('dbForPlatform')
->inject('project')
->inject('queueForEvents')
->inject('queueForBuilds')
->inject('gitHub')
->callback([$this, 'action']);
}
public function action(string $siteId, string $repository, string $owner, string $rootDirectory, string $version, bool $activate, Response $response, Database $dbForProject, Database $dbForPlatform, Document $project, Event $queueForEvents, Build $queueForBuilds)
public function action(string $siteId, string $repository, string $owner, string $rootDirectory, string $version, bool $activate, Request $request, Response $response, Database $dbForProject, Database $dbForPlatform, Document $project, Event $queueForEvents, Build $queueForBuilds, GitHub $github)
{
$site = $dbForProject->getDocument('sites', $siteId);
@ -89,6 +93,22 @@ class Create extends Base
'version' => $version
]);
if (!empty($site->getAttribute('providerRepositoryId'))) {
$installation = $dbForPlatform->getDocument('installations', $site->getAttribute('installationId'));
$deployment = $this->redeployVcsSite($request, $site, $project, $installation, $dbForProject, $dbForPlatform, $queueForBuilds, $template, $github);
$queueForEvents
->setParam('siteId', $site->getId())
->setParam('deploymentId', $deployment->getId());
$response
->setStatusCode(Response::STATUS_CODE_ACCEPTED)
->dynamic($deployment, Response::MODEL_DEPLOYMENT);
return;
}
$deploymentId = ID::unique();
$deployment = $dbForProject->createDocument('deployments', new Document([
'$id' => $deploymentId,

View file

@ -16,6 +16,8 @@ use Utopia\Database\Validator\UID;
use Utopia\Platform\Action;
use Utopia\Platform\Scope\HTTP;
use Utopia\Swoole\Request;
use Utopia\Validator\Text;
use Utopia\Validator\WhiteList;
use Utopia\VCS\Adapter\Git\GitHub;
class Create extends Base
@ -32,7 +34,7 @@ class Create extends Base
$this
->setHttpMethod(Action::HTTP_REQUEST_METHOD_POST)
->setHttpPath('/v1/sites/:siteId/deployments/vcs')
->desc('Create deployment')
->desc('Create VCS deployment')
->groups(['api', 'sites'])
->label('scope', 'sites.write')
->label('event', 'sites.[siteId].deployments.[deploymentId].create')
@ -43,6 +45,8 @@ class Create extends Base
name: 'createVcsDeployment',
description: <<<EOT
Create a deployment when a site is connected to VCS.
This endpoint lets you create deployment from a branch, commit, or a tag.
EOT,
auth: [AuthType::KEY],
responses: [
@ -53,6 +57,9 @@ class Create extends Base
],
))
->param('siteId', '', new UID(), 'Site ID.')
// TODO: Support tag and commit in future
->param('type', '', new WhiteList(['branch']), 'Type of reference passed. Allowed values are: branch')
->param('reference', '', new Text(255), 'VCS reference to create deployment from. Depending on type this can be: branch name')
->inject('request')
->inject('response')
->inject('dbForProject')
@ -64,7 +71,7 @@ class Create extends Base
->callback([$this, 'action']);
}
public function action(string $siteId, Request $request, Response $response, Database $dbForProject, Database $dbForPlatform, Document $project, Event $queueForEvents, Build $queueForBuilds, GitHub $github)
public function action(string $siteId, string $type, string $reference, Request $request, Response $response, Database $dbForProject, Database $dbForPlatform, Document $project, Event $queueForEvents, Build $queueForBuilds, GitHub $github)
{
$site = $dbForProject->getDocument('sites', $siteId);
@ -76,7 +83,19 @@ class Create extends Base
$installation = $dbForPlatform->getDocument('installations', $site->getAttribute('installationId'));
$deployment = $this->redeployVcsSite($request, $site, $project, $installation, $dbForProject, $dbForPlatform, $queueForBuilds, $template, $github);
$deployment = $this->redeployVcsSite(
request: $request,
site: $site,
project: $project,
installation: $installation,
dbForProject: $dbForProject,
dbForPlatform: $dbForPlatform,
queueForBuilds: $queueForBuilds,
template: $template,
github: $github,
reference: $reference,
referenceType: $type
);
$queueForEvents
->setParam('siteId', $site->getId())