Issue 17 - Creation d'issue à partie d'un ticket SW

This commit is contained in:
noah.lancien 2023-08-16 08:28:59 +00:00 • committed by Vincent BRIDIER
parent c155e48d78
commit 5b837f907d
16 changed files with 1000 additions and 115 deletions

View file

@ -36,8 +36,6 @@ MAIL_ADMIN=equipe.web@ldc.fr
# Sentry
SENTRY_LARAVEL_DSN=
LDC_STATUS_CHECKER_API_KEY=
# ADMIN SECURE
# - API ENDPOINT (Optional)
LDC_WEB_API_ENDPOINT=
@ -45,3 +43,7 @@ LDC_WEB_API_ENDPOINT=
LDC_WEB_API_KEY=
# - LIST SEPARATED WITH ',' (Optional)
LDC_WEB_CIDR_MANUAL_ALLOWED_LIST=
# GITLAB API
GITLAB_URL=
GITLAB_TOKEN=

View file

@ -0,0 +1,20 @@
<?php
namespace App\Enums\Users;
use App\Traits\Enums\BaseEnum;
enum GitlabUsersEnum: int
{
use BaseEnum;
// Each user is associated to his ID on gitlab.
case olivier = 11;
/**
* Optionnal labels definition
*/
private const LABELS = [
self::olivier->name => "Olivier LEGAT",
];
}

View file

@ -4,6 +4,7 @@ namespace App\Http\Controllers\Bo;
use App\Enums\Tickets\TicketStatusEnum;
use App\Enums\Tickets\TicketTypeEnum;
use App\Enums\Users\GitlabUsersEnum;
use App\Events\NotifySubscriptions;
use App\Events\TicketStatusChanged;
use App\Http\Controllers\Controller;
@ -21,6 +22,7 @@ use App\Models\Message;
use App\Models\Site;
use App\Models\Ticket;
use App\Models\User;
use GrahamCampbell\GitLab\Facades\GitLab;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
@ -624,4 +626,82 @@ class TicketController extends Controller
);
});
}
/**
* Create a gitlab issue from a ticket.
*
* @param \App\Models\Ticket $ticket
* @return \Illuminate\Http\RedirectResponse
*/
public function createGitlabIssue(Ticket $ticket)
{
$gitlabRepoId = $ticket->site->gitlab_project_id;
$description = \sprintf("%s<br>", $ticket->text);
$cLabel = match ($ticket->type) {
TicketTypeEnum::bug => 'c-bug',
TicketTypeEnum::evolution => 'c-feature',
};
try {
if (!\is_null($ticket->file)) {
$uploadedFile = GitLab::projects()->uploadFile($gitlabRepoId, $ticket->file);
$description .= $this->formatGitlabFiles($ticket, $uploadedFile, 1);
}
if (!\is_null($ticket->file2)) {
$uploadedFile2 = GitLab::projects()->uploadFile($gitlabRepoId, $ticket->file2);
$description .= $this->formatGitlabFiles($ticket, $uploadedFile2, 2);
}
$issue = GitLab::issues()->create($gitlabRepoId, [
'title' => 'ts-' . $ticket->id,
'description' => $description,
'labels' => \implode(",", [
'c-support',
$cLabel
]),
'assignee_id' => GitlabUsersEnum::olivier,
]);
} catch (\Exception $e) {
\report($e);
return back()->with('error', \trans("Une erreur est survenue"));
} catch (\Throwable $e) {
\report($e);
return back()->with('error', \trans("Une erreur est survenue"));
} //end try
$ticket->gitlab_issue = $issue['web_url'];
$ticket->save();
return back()->with(
'success',
trans("L'issue a été créée sur Gitlab.")
);
}
/**
* Format files for Gitlab issues
*
* @param \App\Models\Ticket $ticket
* @param array $uploadedFile
* @param integer $fileNb
* @return string
*/
private function formatGitlabFiles(Ticket $ticket, array $uploadedFile, int $fileNb)
{
if (Str::endsWith($ticket->file, ['jpg', 'png', 'jpeg'])) {
$file = \sprintf(
"![Fichier joint %d](%s)",
$fileNb,
$uploadedFile['url']
);
} else {
$file = \sprintf(
'<a href="%s" target="_blank">%s</a>',
$uploadedFile['url'],
__('Lien vers le fichier'),
);
}
return \sprintf("<br><br> Fichier %d : <br>%s<br>", $fileNb, $file);
}
}

View file

@ -27,7 +27,8 @@ class StoreSiteRequest extends FormRequest
return [
'name' => 'required|string|min:3|max:255',
'users' => 'nullable|array',
'users.*.id' => 'required|exists:users,id'
'users.*.id' => 'required|exists:users,id',
'gitlab_project_id' => 'nullable|unique:sites,gitlab_project_id'
];
}
@ -42,6 +43,7 @@ class StoreSiteRequest extends FormRequest
'name' => trans('Nom du site'),
'users' => trans('Utilisateurs associés au site'),
'users.*.id' => trans('Élément parmis les Utilisateurs associés au site'),
'gitlab_project_id' => trans('ID du dépôt Gitlab')
];
}
}

View file

@ -4,4 +4,15 @@ namespace App\Http\Requests\Bo\Sites;
class UpdateSiteRequest extends StoreSiteRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return array_merge(parent::rules(), [
'gitlab_project_id' => 'nullable|unique:sites,gitlab_project_id,' . $this->route('site')->id . ',id',
]);
}
}

View file

@ -7,8 +7,9 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;
/**
* @property string $name
* @property Brand $brand_id
* @property string $name
* @property integer $gitlab_project_id
* @property Brand $brand_id
*/
class Site extends Model
{
@ -21,6 +22,7 @@ class Site extends Model
*/
protected $fillable = [
'name',
'gitlab_project_id'
];
/**

View file

@ -3,6 +3,7 @@
namespace App\Policies;
use App\Enums\Tickets\TicketStatusEnum;
use App\Enums\Tickets\TicketTypeEnum;
use App\Enums\Users\RoleEnum;
use App\Models\Ticket;
use App\Models\User;
@ -260,4 +261,19 @@ class TicketPolicy
return $user->role->equals(RoleEnum::developper)
&& $ticket->estimation()->exists();
}
/**
* Determine if the user can create a gitlab issue from a given ticket.
*
* @param \App\Models\User $user
* @param \App\Models\Ticket $ticket
* @return boolean
*/
public function createGitlabIssue(User $user, Ticket $ticket)
{
return $user->role->equals(RoleEnum::developper)
&& ($ticket->type->equals(TicketTypeEnum::bug) || $ticket->type->equals(TicketTypeEnum::evolution))
&& !\is_null($ticket->site->gitlab_project_id)
&& \is_null($ticket->gitlab_issue);
}
}

View file

@ -13,6 +13,7 @@
"carlos-meneses/laravel-mpdf": "^2.1",
"diglactic/laravel-breadcrumbs": "^8.0",
"doctrine/dbal": "^3.1",
"graham-campbell/gitlab": "^7.0",
"guzzlehttp/guzzle": "^7.2",
"laravel-lang/lang": "~8.0",
"laravel-validation-rules/colour": "^1.6",
@ -20,7 +21,6 @@
"laravel/tinker": "^2.8",
"laravel/ui": "^4.2",
"ldc/web-admin-secure-laravel": "^2.0",
"ldc/web-status-checker-laravel": "^1.0",
"mews/purifier": "^3.4",
"sentry/sentry-laravel": "*",
"uwil/k8s-laravel": "^1.2"

777
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "8b8d80affdf1ee455767d5e675bf5fe8",
"content-hash": "4f5fe189b89c5ccc99fc4c7a913a64a6",
"packages": [
{
"name": "brick/math",
@ -1251,6 +1251,228 @@
],
"time": "2022-02-20T15:07:15+00:00"
},
{
"name": "graham-campbell/bounded-cache",
"version": "v2.1.1",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Bounded-Cache.git",
"reference": "2840f46f38185e610e62af3662dac75ca1877a84"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/GrahamCampbell/Bounded-Cache/zipball/2840f46f38185e610e62af3662dac75ca1877a84",
"reference": "2840f46f38185e610e62af3662dac75ca1877a84",
"shasum": ""
},
"require": {
"php": "^8.0.2",
"psr/simple-cache": "^2.0 || ^3.0"
},
"require-dev": {
"graham-campbell/analyzer": "^4.0",
"graham-campbell/testbench-core": "^4.0",
"mockery/mockery": "^1.5.1",
"phpunit/phpunit": "^9.6.3 || ^10.0.12"
},
"type": "library",
"autoload": {
"psr-4": {
"GrahamCampbell\\BoundedCache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
}
],
"description": "A Bounded TTL PSR-16 Cache Implementation",
"keywords": [
"Bounded Cache",
"Bounded-Cache",
"Graham Campbell",
"GrahamCampbell",
"bounded",
"cache",
"psr16"
],
"support": {
"issues": "https://github.com/GrahamCampbell/Bounded-Cache/issues",
"source": "https://github.com/GrahamCampbell/Bounded-Cache/tree/v2.1.1"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/graham-campbell/bounded-cache",
"type": "tidelift"
}
],
"time": "2023-02-25T23:00:30+00:00"
},
{
"name": "graham-campbell/gitlab",
"version": "v7.0.0",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Laravel-GitLab.git",
"reference": "fb037dedadacb16e4ab75b8bab58b52b703a4e33"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/GrahamCampbell/Laravel-GitLab/zipball/fb037dedadacb16e4ab75b8bab58b52b703a4e33",
"reference": "fb037dedadacb16e4ab75b8bab58b52b703a4e33",
"shasum": ""
},
"require": {
"graham-campbell/bounded-cache": "^1.2 || ^2.0",
"graham-campbell/manager": "^5.0",
"guzzlehttp/guzzle": "^7.5",
"guzzlehttp/psr7": "^2.4",
"illuminate/contracts": "^8.75 || ^9.0 || ^10.0",
"illuminate/support": "^8.75 || ^9.0 || ^10.0",
"m4tthumphrey/php-gitlab-api": "11.9.*",
"php": "^7.4.15 || ^8.0.2",
"symfony/cache": "^5.4 || ^6.0"
},
"require-dev": {
"graham-campbell/analyzer": "^4.0",
"graham-campbell/testbench": "^6.0",
"mockery/mockery": "^1.5.1",
"phpunit/phpunit": "^9.6.3 || ^10.0.12"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"GrahamCampbell\\GitLab\\GitLabServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"GrahamCampbell\\GitLab\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
}
],
"description": "GitLab Is A GitLab Bridge For Laravel",
"keywords": [
"Bridge",
"Graham Campbell",
"GrahamCampbell",
"Laravel GitLab",
"Laravel-GitLab",
"PHP GitLab API",
"framework",
"gitlab",
"gitlab bridge",
"laravel",
"php-gitlab-api"
],
"support": {
"issues": "https://github.com/GrahamCampbell/Laravel-GitLab/issues",
"source": "https://github.com/GrahamCampbell/Laravel-GitLab/tree/v7.0.0"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/graham-campbell/gitlab",
"type": "tidelift"
}
],
"time": "2023-03-07T11:41:34+00:00"
},
{
"name": "graham-campbell/manager",
"version": "v5.0.0",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Laravel-Manager.git",
"reference": "f1cf95a0bb11ba086387b8049e0e40b82d01588d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/GrahamCampbell/Laravel-Manager/zipball/f1cf95a0bb11ba086387b8049e0e40b82d01588d",
"reference": "f1cf95a0bb11ba086387b8049e0e40b82d01588d",
"shasum": ""
},
"require": {
"illuminate/contracts": "^8.75 || ^9.0 || ^10.0",
"illuminate/support": "^8.75 || ^9.0 || ^10.0",
"php": "^7.4.15 || ^8.0.2"
},
"require-dev": {
"graham-campbell/analyzer": "^4.0",
"graham-campbell/testbench-core": "^4.0",
"mockery/mockery": "^1.5.1",
"phpunit/phpunit": "^9.6.3 || ^10.0.12"
},
"type": "library",
"autoload": {
"psr-4": {
"GrahamCampbell\\Manager\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
}
],
"description": "Manager Provides Some Manager Functionality For Laravel",
"keywords": [
"Graham Campbell",
"GrahamCampbell",
"Laravel Manager",
"Laravel-Manager",
"connector",
"framework",
"interface",
"laravel",
"manager"
],
"support": {
"issues": "https://github.com/GrahamCampbell/Laravel-Manager/issues",
"source": "https://github.com/GrahamCampbell/Laravel-Manager/tree/v5.0.0"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/graham-campbell/manager",
"type": "tidelift"
}
],
"time": "2023-02-25T23:53:34+00:00"
},
{
"name": "graham-campbell/result-type",
"version": "v1.1.1",
@ -2400,113 +2622,6 @@
],
"description": "Restrict access to LDC Network"
},
{
"name": "ldc/web-status-checker",
"version": "1.1.0",
"source": {
"type": "git",
"url": "https://lab.s-web.fr/ldc-web/projets/ldc-web-status-checker.git",
"reference": "7ce62449f3eb052de2d7bfa2e32d37d4524d60b0"
},
"dist": {
"type": "zip",
"url": "https://lab.s-web.fr/api/v4/projects/21/packages/composer/archives/ldc/web-status-checker.zip?sha=7ce62449f3eb052de2d7bfa2e32d37d4524d60b0",
"reference": "7ce62449f3eb052de2d7bfa2e32d37d4524d60b0",
"shasum": ""
},
"require": {
"ext-curl": "*",
"php": "~7.3|7.4|~8"
},
"require-dev": {
"slevomat/coding-standard": "^7.0",
"squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"autoload": {
"psr-4": {
"LDC\\WebStatusChecker\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"LDC\\WebStatusChecker\\Tests\\": "tests"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Jérémy Munsch",
"email": "jeremy.munsch@ldc.fr",
"homepage": "https://jeremydev.ovh"
}
],
"description": "Status checker: report status to ldc-web"
},
{
"name": "ldc/web-status-checker-laravel",
"version": "1.1.0",
"source": {
"type": "git",
"url": "https://lab.s-web.fr/ldc-web/projets/ldc-web-status-checker-laravel.git",
"reference": "3918891846f1e8440ba54b23dc47422f005070b9"
},
"dist": {
"type": "zip",
"url": "https://lab.s-web.fr/api/v4/projects/22/packages/composer/archives/ldc/web-status-checker-laravel.zip?sha=3918891846f1e8440ba54b23dc47422f005070b9",
"reference": "3918891846f1e8440ba54b23dc47422f005070b9",
"shasum": ""
},
"require": {
"illuminate/support": "~8|~9|~10",
"laravel/framework": "~8|~9|~10",
"ldc/web-status-checker": "^1.1.0",
"php": "~7.3|7.4|~8"
},
"require-dev": {
"slevomat/coding-standard": "^7.0",
"squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"LDC\\WebStatusCheckerLaravel\\StatusCheckerServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"LDC\\WebStatusCheckerLaravel\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"LDC\\WebStatusCheckerLaravel\\Tests\\": "tests"
}
},
"scripts": {
"test": [
"vendor/bin/phpunit"
],
"post-autoload-dump": [
"@php ./vendor/bin/testbench package:discover --ansi"
]
},
"license": [
"MIT"
],
"authors": [
{
"name": "Jérémy Munsch",
"email": "jeremy.munsch@ldc.fr",
"homepage": "https://jeremydev.ovh"
}
],
"description": "Status checker: report status to ldc-web"
},
{
"name": "league/commonmark",
"version": "2.4.0",
@ -2899,6 +3014,96 @@
],
"time": "2022-04-17T13:12:02+00:00"
},
{
"name": "m4tthumphrey/php-gitlab-api",
"version": "11.9.1",
"source": {
"type": "git",
"url": "https://github.com/GitLabPHP/Client.git",
"reference": "148ed10609f92e03afbf756e734ee4b76be36832"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/GitLabPHP/Client/zipball/148ed10609f92e03afbf756e734ee4b76be36832",
"reference": "148ed10609f92e03afbf756e734ee4b76be36832",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-xml": "*",
"php": "^7.4.15 || ^8.0.2",
"php-http/cache-plugin": "^1.7.5",
"php-http/client-common": "^2.6",
"php-http/discovery": "^1.15",
"php-http/httplug": "^2.3",
"php-http/multipart-stream-builder": "^1.2",
"psr/cache": "^1.0 || ^2.0 || ^3.0",
"psr/http-client-implementation": "^1.0",
"psr/http-factory-implementation": "^1.0",
"psr/http-message": "^1.0",
"symfony/options-resolver": "^4.4 || ^5.0 || ^6.0",
"symfony/polyfill-php80": "^1.26"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"guzzlehttp/guzzle": "^7.5",
"http-interop/http-factory-guzzle": "^1.0"
},
"type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": {
"psr-4": {
"Gitlab\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Bourigault",
"email": "bourigaultfabien@gmail.com",
"homepage": "https://github.com/fbourigault"
},
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{
"name": "Matt Humphrey",
"email": "matth@windsor-telecom.co.uk",
"homepage": "https://github.com/m4tthumphrey"
},
{
"name": "Miguel Piedrafita",
"email": "github@miguelpiedrafita.com",
"homepage": "https://github.com/m1guelpf"
}
],
"description": "GitLab API v4 client for PHP",
"keywords": [
"api",
"gitlab"
],
"support": {
"issues": "https://github.com/GitLabPHP/Client/issues",
"source": "https://github.com/GitLabPHP/Client/tree/11.9.1"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
}
],
"time": "2023-04-30T19:02:00+00:00"
},
{
"name": "mews/purifier",
"version": "3.4.0",
@ -3779,6 +3984,60 @@
},
"time": "2020-10-15T08:29:30+00:00"
},
{
"name": "php-http/cache-plugin",
"version": "1.8.0",
"source": {
"type": "git",
"url": "https://github.com/php-http/cache-plugin.git",
"reference": "6bf9fbf66193f61d90c2381b75eb1fa0202fd314"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/cache-plugin/zipball/6bf9fbf66193f61d90c2381b75eb1fa0202fd314",
"reference": "6bf9fbf66193f61d90c2381b75eb1fa0202fd314",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0",
"php-http/client-common": "^1.9 || ^2.0",
"php-http/message-factory": "^1.0",
"psr/cache": "^1.0 || ^2.0 || ^3.0",
"symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
},
"require-dev": {
"phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Http\\Client\\Common\\Plugin\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com"
}
],
"description": "PSR-6 Cache plugin for HTTPlug",
"homepage": "http://httplug.io",
"keywords": [
"cache",
"http",
"httplug",
"plugin"
],
"support": {
"issues": "https://github.com/php-http/cache-plugin/issues",
"source": "https://github.com/php-http/cache-plugin/tree/1.8.0"
},
"time": "2023-04-28T10:56:55+00:00"
},
{
"name": "php-http/client-common",
"version": "2.7.0",
@ -4107,6 +4366,62 @@
"abandoned": "psr/http-factory",
"time": "2023-04-14T14:16:17+00:00"
},
{
"name": "php-http/multipart-stream-builder",
"version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/php-http/multipart-stream-builder.git",
"reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/f5938fd135d9fa442cc297dc98481805acfe2b6a",
"reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0",
"php-http/discovery": "^1.15",
"psr/http-factory-implementation": "^1.0"
},
"require-dev": {
"nyholm/psr7": "^1.0",
"php-http/message": "^1.5",
"php-http/message-factory": "^1.0.2",
"phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3"
},
"type": "library",
"autoload": {
"psr-4": {
"Http\\Message\\MultipartStream\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com"
}
],
"description": "A builder class that help you create a multipart stream",
"homepage": "http://php-http.org",
"keywords": [
"factory",
"http",
"message",
"multipart stream",
"stream"
],
"support": {
"issues": "https://github.com/php-http/multipart-stream-builder/issues",
"source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.0"
},
"time": "2023-04-28T14:10:22+00:00"
},
{
"name": "php-http/promise",
"version": "1.1.0",
@ -5387,6 +5702,178 @@
],
"time": "2023-02-09T10:38:43+00:00"
},
{
"name": "symfony/cache",
"version": "v6.3.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
"reference": "d176b97600860df13e851538c2df2ad88e9e5ca9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache/zipball/d176b97600860df13e851538c2df2ad88e9e5ca9",
"reference": "d176b97600860df13e851538c2df2ad88e9e5ca9",
"shasum": ""
},
"require": {
"php": ">=8.1",
"psr/cache": "^2.0|^3.0",
"psr/log": "^1.1|^2|^3",
"symfony/cache-contracts": "^2.5|^3",
"symfony/service-contracts": "^2.5|^3",
"symfony/var-exporter": "^6.2.10"
},
"conflict": {
"doctrine/dbal": "<2.13.1",
"symfony/dependency-injection": "<5.4",
"symfony/http-kernel": "<5.4",
"symfony/var-dumper": "<5.4"
},
"provide": {
"psr/cache-implementation": "2.0|3.0",
"psr/simple-cache-implementation": "1.0|2.0|3.0",
"symfony/cache-implementation": "1.1|2.0|3.0"
},
"require-dev": {
"cache/integration-tests": "dev-master",
"doctrine/dbal": "^2.13.1|^3.0",
"predis/predis": "^1.1|^2.0",
"psr/simple-cache": "^1.0|^2.0|^3.0",
"symfony/config": "^5.4|^6.0",
"symfony/dependency-injection": "^5.4|^6.0",
"symfony/filesystem": "^5.4|^6.0",
"symfony/http-kernel": "^5.4|^6.0",
"symfony/messenger": "^5.4|^6.0",
"symfony/var-dumper": "^5.4|^6.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Cache\\": ""
},
"classmap": [
"Traits/ValueWrapper.php"
],
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
"homepage": "https://symfony.com",
"keywords": [
"caching",
"psr6"
],
"support": {
"source": "https://github.com/symfony/cache/tree/v6.3.2"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-07-27T16:19:14+00:00"
},
{
"name": "symfony/cache-contracts",
"version": "v3.3.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache-contracts.git",
"reference": "ad945640ccc0ae6e208bcea7d7de4b39b569896b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/ad945640ccc0ae6e208bcea7d7de4b39b569896b",
"reference": "ad945640ccc0ae6e208bcea7d7de4b39b569896b",
"shasum": ""
},
"require": {
"php": ">=8.1",
"psr/cache": "^3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.4-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Cache\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Generic abstractions related to caching",
"homepage": "https://symfony.com",
"keywords": [
"abstractions",
"contracts",
"decoupling",
"interfaces",
"interoperability",
"standards"
],
"support": {
"source": "https://github.com/symfony/cache-contracts/tree/v3.3.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-05-23T14:45:45+00:00"
},
{
"name": "symfony/console",
"version": "v6.3.0",
@ -7955,6 +8442,80 @@
],
"time": "2023-06-21T12:08:28+00:00"
},
{
"name": "symfony/var-exporter",
"version": "v6.3.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-exporter.git",
"reference": "3400949782c0cb5b3e73aa64cfd71dde000beccc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/3400949782c0cb5b3e73aa64cfd71dde000beccc",
"reference": "3400949782c0cb5b3e73aa64cfd71dde000beccc",
"shasum": ""
},
"require": {
"php": ">=8.1"
},
"require-dev": {
"symfony/var-dumper": "^5.4|^6.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\VarExporter\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Allows exporting any serializable PHP data structure to plain PHP code",
"homepage": "https://symfony.com",
"keywords": [
"clone",
"construct",
"export",
"hydrate",
"instantiate",
"lazy-loading",
"proxy",
"serialize"
],
"support": {
"source": "https://github.com/symfony/var-exporter/tree/v6.3.2"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-07-26T17:39:03+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
"version": "2.2.6",

74
config/gitlab.php Normal file
View file

@ -0,0 +1,74 @@
<?php
declare(strict_types=1);
/*
* This file is part of Laravel GitLab.
*
* (c) Graham Campbell <hello@gjcampbell.co.uk>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
return [
/**
*--------------------------------------------------------------------------
* Default Connection Name
*--------------------------------------------------------------------------
*
* Here you may specify which of the connections below you wish to use as
* your default connection for all work. Of course, you may use many
* connections at once using the manager class.
*
*/
'default' => 'main',
/**
*--------------------------------------------------------------------------
* GitLab Connections
*--------------------------------------------------------------------------
*
* Here are each of the connections setup for your application. Example
* configuration has been included, but you may add as many connections as
* you would like. Note that the 4 supported authentication methods are:
* "none", "oauth", "job_token", and "token".
*
*/
'connections' => [
'main' => [
'token' => env('GITLAB_TOKEN'),
'method' => 'token',
'url' => env('GITLAB_URL'),
],
],
/**
*--------------------------------------------------------------------------
* HTTP Cache
*--------------------------------------------------------------------------
*
* Here are each of the cache configurations setup for your application.
* Only the "illuminate" driver is provided out of the box. Example
* configuration has been included.
*
*/
'cache' => [
'main' => [
'driver' => 'illuminate',
'connector' => null,
],
'bar' => [
'driver' => 'illuminate',
'connector' => 'redis',
],
],
];

View file

@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up(): void
{
Schema::table('sites', function (Blueprint $table) {
$table->unsignedInteger('gitlab_project_id')
->unique()
->nullable()
->comment("ID du dépôt Gitlab")
->after('name');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down(): void
{
Schema::table('sites', function (Blueprint $table) {
$table->dropColumn('gitlab_project_id');
});
}
};

View file

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up(): void
{
Schema::table('tickets', function (Blueprint $table) {
$table->string('gitlab_issue')
->nullable()
->comment("URL de l'issue Gitlab")
->after('is_internal');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down(): void
{
Schema::table('tickets', function (Blueprint $table) {
$table->dropColumn('gitlab_issue');
});
}
};

View file

@ -155,6 +155,7 @@ return [
'excerpt' => 'extrait',
'firstname' => 'prénom',
'gender' => 'genre',
'gitlab_project_id' => 'id du dépôt Gitlab',
'hour' => 'heure',
'invoiced_to_id' => 'Entité à facturer',
'label' => 'label',

View file

@ -59,6 +59,34 @@
</div>
</fieldset>
</div>
{{-- GITLAB_PROJECT_ID --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="border h-100 bg-white p-3">
<legend>{{ Str::ucfirst(__('validation.attributes.gitlab_project_id')) }}</legend>
<div class="row">
<div class="col-12 mb-3">
@include('bo.partials.inputs.int-number', [
'id' => 'siteGitlabProject',
'label' => __(':field du :model', [
'field' => Str::ucfirst(__('validation.attributes.gitlab_project_id')),
'model' => Str::singular(__('models.classes.sites')),
]),
'name' => 'gitlab_project_id',
'required' => true,
'model' => $siteModel ?? null,
'helper' => __('validation.integer', [
'attribute' => __(':field du :model', [
'field' => Str::ucfirst(__('validation.attributes.gitlab_project_id')),
'model' => Str::singular(__('models.classes.sites')),
]),
]),
'step' => 1,
'min' => 1
])
</div>
</div>
</fieldset>
</div>
</div>
@push('scripts')

View file

@ -256,4 +256,18 @@
</ul>
</div>
@endif
@can('createGitlabIssue', $ticket)
<form action="{{ route('bo.ticket.create-issue', $ticket) }}" method="POST" id="form_issue" class="col d-flex justify-content-end">
@csrf
<button class="btn btn-warning align-end" type="submit">{{ __("Créer l'issue Gitlab") }}</button>
</form>
@else
@if (!\is_null($ticket->gitlab_issue))
<br>
<p>
{{ __("Lien vers l'issue Gitlab : ")}}
<a href="{{ $ticket->gitlab_issue}}" target="_blank">{{ __("Ouvrir") }}</a>
</p>
@endif
@endcan
@endsection

View file

@ -90,7 +90,10 @@ Route::middleware('admin-secure')
// * TICKETS
Route::get('/tickets/json/paginate', [TicketController::class, 'jsonPaginate'])
->name('tickets.json-paginate');
->name('tickets.json-paginate');
Route::post('/ticket/{ticket}/create-issue', [TicketController::class, 'createGitlabIssue'])
->middleware('can:createGitlabIssue,ticket')
->name('ticket.create-issue');
// * SCHEDULE
Route::prefix('/schedule')