Skip to content
Snippets Groups Projects
Commit d5471988 authored by kgaut's avatar kgaut Committed by Jürgen Haas
Browse files

Allow multiple gitlab server connexions

parent e9b22453
No related branches found
No related tags found
1 merge request!4Allow multiple gitlab server connexions
gitlab_api.gitlab_server.*:
type: config_entity
label: Gitlab Server
mapping:
id:
type: string
label: ID
url:
type: string
label: 'Server Url'
auth_token:
type: string
label: 'Authentication token'
default_server:
type: boolean
label: 'Default server'
uuid:
type: string
...@@ -4,4 +4,4 @@ description: Integrates your Drupal site into GitLab using the GitLab API. ...@@ -4,4 +4,4 @@ description: Integrates your Drupal site into GitLab using the GitLab API.
package: Web services package: Web services
core_version_requirement: ^8.8 || ^9 core_version_requirement: ^8.8 || ^9
project: gitlab_api project: gitlab_api
configure: gitlab_api.settings configure: entity.gitlab_server.collection
<?php
use Drupal\Core\Language\LanguageInterface;
use Drupal\gitlab_api\Entity\GitlabServer;
/**
* Migrate configuration to a config entity
*/
function gitlab_api_update_8001() {
$config = \Drupal::config('gitlab_api.settings');
$url = $config->get('url');
$token = $config->get('token');
if (isset($url, $token)) {
$id = \Drupal::service('transliteration')->transliterate($url, LanguageInterface::LANGCODE_DEFAULT, '_');
$id = mb_strtolower($id);
$id = preg_replace('@[^a-z0-9_.]+@', '', $id);
$server = GitlabServer::create([
'id' => $id,
'url' => $url,
'auth_token' => $token,
'status' => TRUE,
'default_server' => TRUE,
]);
if ($server->save()) {
\Drupal::configFactory()->getEditable('gitlab_api.settings')->delete();
return t('The Gitlab Server configuration has been migrated to a config entity');
}
}
}
entity.gitlab_server.add_form:
route_name: 'entity.gitlab_server.add_form'
title: 'Add a gitlab server'
appears_on:
- entity.gitlab_server.collection
gitlab_api.settings: entity.gitlab_server.collection:
title: GitLab title: Gitlab Servers
parent: system.admin_config_system parent: system.admin_config_services
route_name: gitlab_api.settings description: 'List of gitlab servers to extend site functionality.'
route_name: entity.gitlab_server.collection
weight: 10 weight: 10
administer gitlab_server:
title: 'Administer gitlab servers'
gitlab_api.settings: entity.gitlab_server.collection:
path: '/admin/config/system/settings' path: '/admin/config/services/gitlab-server'
defaults: defaults:
_title: 'GitLab' _entity_list: 'gitlab_server'
_form: 'Drupal\gitlab_api\Form\Settings' _title: 'Gitlab Servers'
requirements: requirements:
_permission: 'administer site configuration' _permission: 'administer gitlab_server'
entity.gitlab_server.add_form:
path: '/admin/config/services/gitlab-server/add'
defaults:
_entity_form: 'gitlab_server.add'
_title: 'Add a gitlab server'
requirements:
_permission: 'administer gitlab_server'
entity.gitlab_server.edit_form:
path: '/admin/config/services/gitlab-server/{gitlab_server}'
defaults:
_entity_form: 'gitlab_server.edit'
_title: 'Edit a gitlab server'
requirements:
_permission: 'administer gitlab_server'
entity.gitlab_server.delete_form:
path: '/admin/config/services/gitlab-server/{gitlab_server}/delete'
defaults:
_entity_form: 'gitlab_server.delete'
_title: 'Delete a gitlab server'
requirements:
_permission: 'administer gitlab_server'
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
namespace Drupal\gitlab_api; namespace Drupal\gitlab_api;
use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\gitlab_api\Entity\GitlabServer;
use Gitlab\Client; use Gitlab\Client;
use Gitlab\Exception\InvalidArgumentException; use Gitlab\Exception\InvalidArgumentException;
...@@ -23,6 +24,11 @@ class Api { ...@@ -23,6 +24,11 @@ class Api {
*/ */
protected $client; protected $client;
/**
* @var GitlabServer
*/
protected $server;
/** /**
* Api constructor. * Api constructor.
* *
...@@ -36,10 +42,27 @@ class Api { ...@@ -36,10 +42,27 @@ class Api {
* Initialize client and authenticate session. * Initialize client and authenticate session.
*/ */
protected function init() { protected function init() {
if (!isset($this->server)) {
$this->switchServer();
}
if (!isset($this->client)) { if (!isset($this->client)) {
$this->client = Client::create($this->config->get('url')) $this->client = Client::create($this->server->getUrl());
->authenticate($this->config->get('token'), Client::AUTH_URL_TOKEN); $this->client->authenticate($this->server->getAuthToken(), Client::AUTH_URL_TOKEN);
}
}
/**
* Allow to switch between gitlab server.
* @param string $server_id
*/
public function switchServer(string $server_id = NULL): void {
if ($server_id && $server = GitlabServer::load($server_id)) {
$this->server = $server;
}
else {
$this->server = GitlabServer::loadDefaultServer();
} }
$this->client = NULL;
} }
/** /**
......
<?php
namespace Drupal\gitlab_api\Entity;
use Drupal\Core\Config\Entity\ConfigEntityBase;
use Drupal\Core\Config\Entity\ConfigEntityInterface;
/**
* Defines the gitlab server entity type.
*
* @ConfigEntityType(
* id = "gitlab_server",
* label = @Translation("Gitlab Server"),
* label_collection = @Translation("Gitlab Servers"),
* label_singular = @Translation("gitlab server"),
* label_plural = @Translation("gitlab servers"),
* label_count = @PluralTranslation(
* singular = "@count gitlab server",
* plural = "@count gitlab servers",
* ),
* handlers = {
* "list_builder" = "Drupal\gitlab_api\Entity\ListBuilder\GitlabServerListBuilder",
* "form" = {
* "add" = "Drupal\gitlab_api\Form\GitlabServerForm",
* "edit" = "Drupal\gitlab_api\Form\GitlabServerForm",
* "delete" = "Drupal\Core\Entity\EntityDeleteForm"
* }
* },
* config_prefix = "gitlab_server",
* admin_permission = "administer gitlab_server",
* links = {
* "collection" = "/admin/config/services/gitlab-server",
* "add-form" = "/admin/config/services/gitlab-server/add",
* "edit-form" = "/admin/config/services/gitlab-server/{gitlab_server}",
* "delete-form" = "/admin/config/services/gitlab-server/{gitlab_server}/delete"
* },
* entity_keys = {
* "id" = "id",
* "label" = "url",
* "uuid" = "uuid"
* },
* config_export = {
* "id",
* "url",
* "auth_token",
* "default_server"
* }
* )
*/
class GitlabServer extends ConfigEntityBase {
/**
* The gitlab server ID.
*
* @var string
*/
protected $id;
/**
* The gitlab server url.
*
* @var string
*/
protected $url;
/**
* The gitlab_server auth_token.
*
* @var string
*/
protected $auth_token;
/**
* The gitlab server status.
*
* @var bool
*/
protected $status;
/**
* Is it the default server.
*
* @var bool
*/
protected $default_server;
public static function loadDefaultServer() {
$server = \Drupal::entityTypeManager()->getStorage('gitlab_server')->loadByProperties(['default_server' => TRUE]);
return $server ? reset($server) : FALSE;
}
public function getUrl() : string {
return $this->get('url');
}
public function getAuthToken() : ?string {
return $this->get('auth_token');
}
public function isDefault() : bool {
if ($this->isNew() && !self::loadDefaultServer()) {
return TRUE;
}
return (bool) $this->get('default_server');
}
public function setDefault(bool $isDefault = TRUE) {
$this->set('default_server', $isDefault);
return $this;
}
}
<?php
namespace Drupal\gitlab_api\Entity\ListBuilder;
use Drupal\Core\Config\Entity\ConfigEntityListBuilder;
use Drupal\Core\Entity\EntityInterface;
/**
* Provides a listing of gitlab servers.
*/
class GitlabServerListBuilder extends ConfigEntityListBuilder {
/**
* {@inheritdoc}
*/
public function buildHeader() {
$header['label'] = $this->t('Server URL');
$header['id'] = $this->t('Machine name');
$header['status'] = $this->t('Status');
$header['default_server'] = $this->t('Default');
return $header + parent::buildHeader();
}
/**
* {@inheritdoc}
*/
public function buildRow(EntityInterface $entity) {
/** @var \Drupal\gitlab_api\Entity\GitlabServer $entity */
$row['label'] = $entity->label();
$row['id'] = $entity->id();
$row['status'] = $entity->status() ? $this->t('Enabled') : $this->t('Disabled');
$row['default_server'] = $entity->isDefault() ? $this->t('Yes') : '';
return $row + parent::buildRow($entity);
}
}
<?php
namespace Drupal\gitlab_api\Form;
use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Form\FormStateInterface;
use Drupal\gitlab_api\Entity\GitlabServer;
/**
* Gitlab Server form.
*
* @property \Drupal\gitlab_api\Entity\GitlabServer $entity
*/
class GitlabServerForm extends EntityForm {
/**
* {@inheritdoc}
*/
public function form(array $form, FormStateInterface $form_state) {
$server = $this->entity;
$form = parent::form($form, $form_state);
$form['url'] = [
'#type' => 'textfield',
'#title' => $this->t('Server URL with no trailing slash'),
'#maxlength' => 255,
'#default_value' => $server->label(),
'#description' => $this->t('The url of the gitlab instance (eg : <em>https://gitlab.com</em> or <em>https://gitlab.mysite.com</em>)'),
'#required' => TRUE,
];
$form['id'] = [
'#type' => 'machine_name',
'#default_value' => $server->id(),
'#machine_name' => [
'source' => ['url'],
'exists' => '\Drupal\gitlab_api\Entity\GitlabServer::load',
],
'#disabled' => !$server->isNew(),
];
$form['auth_token'] = [
'#type' => 'textfield',
'#title' => $this->t('Authentication token'),
'#maxlength' => 255,
'#default_value' => $server->getAuthToken(),
'#description' => $this->t('Get this by creating a new personal access token on your gitlab profile (uri : <em>/profile/personal_access_tokens</em>)'),
'#required' => TRUE,
];
$form['default_server'] = [
'#type' => 'checkbox',
'#title' => $this->t('Default server'),
'#default_value' => $server->isDefault(),
'#description' => $this->t('If there is already a default server, you can change it for this server by checking this box.'),
];
$form['status'] = [
'#type' => 'checkbox',
'#title' => $this->t('Enabled'),
'#default_value' => $server->isNew() ? TRUE : $server->status(),
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
/** @var \Drupal\gitlab_api\Entity\GitlabServer $server */
$server = $this->entity;
if (!$form_state->getValue('default_server')) {
$defaultServer = GitlabServer::loadDefaultServer();
if (!$defaultServer || $defaultServer->id() === $server->id()) {
$form_state->setError($form['default_server'], $this->t('You should have one default server.'));
}
}
if (!filter_var($form_state->getValue('url'), FILTER_VALIDATE_URL)) {
$form_state->setError($form['url'], $this->t('The server url seems not valid.'));
}
}
/**
* {@inheritdoc}
*/
public function save(array $form, FormStateInterface $form_state) {
if ($this->entity->isDefault() && $defaultServer = GitlabServer::loadDefaultServer()) {
$defaultServer->setDefault(FALSE);
$defaultServer->save();
}
$result = parent::save($form, $form_state);
$message_args = ['%label' => $this->entity->label()];
$message = $result == SAVED_NEW
? $this->t('Created new gitlab server %label.', $message_args)
: $this->t('Updated gitlab server %label.', $message_args);
$this->messenger()->addStatus($message);
$form_state->setRedirectUrl($this->entity->toUrl('collection'));
return $result;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment