diff --git a/app/Enums/VcsPlatform.php b/app/Enums/VcsPlatform.php index 2031bd9..1fe3617 100644 --- a/app/Enums/VcsPlatform.php +++ b/app/Enums/VcsPlatform.php @@ -16,4 +16,16 @@ public function getLabel(): string self::GITLAB => __('GitLab'), }; } + + /** + * @return array + */ + public static function getLabels(): array + { + $platforms = []; + foreach (self::cases() as $platform) { + $platforms[$platform->value] = $platform->getLabel(); + } + return $platforms; + } } diff --git a/app/Http/Controllers/VcsInstanceController.php b/app/Http/Controllers/VcsInstanceController.php new file mode 100644 index 0000000..51774e6 --- /dev/null +++ b/app/Http/Controllers/VcsInstanceController.php @@ -0,0 +1,32 @@ + VcsPlatform::getLabels(), + ]); + } + + public function store(VcsInstanceCreateRequest $request): RedirectResponse + { + $vcsInstance = new VcsInstance($request->validated()); + $vcsInstance->installation_id = $vcsInstance->platform === VcsPlatform::GITHUB ? $vcsInstance->installation_id : null; + $vcsInstance->token = $vcsInstance->platform === VcsPlatform::GITLAB ? $vcsInstance->token : null; + $vcsInstance->save(); + + return to_route('repositories.index'); + } +} diff --git a/app/Http/Requests/VcsInstances/VcsInstanceCreateRequest.php b/app/Http/Requests/VcsInstances/VcsInstanceCreateRequest.php new file mode 100644 index 0000000..ebd5325 --- /dev/null +++ b/app/Http/Requests/VcsInstances/VcsInstanceCreateRequest.php @@ -0,0 +1,21 @@ +|string> + */ + public function rules(): array + { + return VcsInstance::rules(); + } +} diff --git a/app/Models/VcsInstance.php b/app/Models/VcsInstance.php index 95fa8c2..7347d5e 100644 --- a/app/Models/VcsInstance.php +++ b/app/Models/VcsInstance.php @@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Validation\Rule; /** * Attributes @@ -30,6 +31,14 @@ class VcsInstance extends Model public $timestamps = false; + protected $fillable = [ + 'name', + 'api_url', + 'token', + 'installation_id', + 'platform', + ]; + protected function casts(): array { return [ @@ -38,6 +47,20 @@ protected function casts(): array ]; } + /** + * @return array> + */ + public static function rules(): array + { + return [ + 'name' => ['required', 'string', 'max:255'], + 'api_url' => ['required', 'url', 'max:255'], + 'token' => ['required_if:platform,gitlab', 'nullable', 'string'], + 'installation_id' => ['required_if:platform,github', 'nullable', 'string', 'max:255'], + 'platform' => ['required', Rule::enum(VcsPlatform::class)], + ]; + } + /** * @return HasMany */ diff --git a/resources/js/pages/repositories/Repositories.vue b/resources/js/pages/repositories/Repositories.vue index 55f2e0a..0e7f527 100644 --- a/resources/js/pages/repositories/Repositories.vue +++ b/resources/js/pages/repositories/Repositories.vue @@ -26,10 +26,13 @@ const props = defineProps();
-
+
+ + +
diff --git a/resources/js/pages/vcsInstances/Create.vue b/resources/js/pages/vcsInstances/Create.vue new file mode 100644 index 0000000..0be94ea --- /dev/null +++ b/resources/js/pages/vcsInstances/Create.vue @@ -0,0 +1,109 @@ + + + diff --git a/resources/js/types/index.d.ts b/resources/js/types/index.d.ts index 17859bb..490c532 100644 --- a/resources/js/types/index.d.ts +++ b/resources/js/types/index.d.ts @@ -80,6 +80,14 @@ export interface RepositoryForm { statistics_from?: string; } +export interface VcsInstance { + name: string; + api_url: string; + token: string | null; + installation_id: string | null; + platform: 'github' | 'gitlab'; +} + export interface VcsInstanceUser { username: string; } diff --git a/routes/web.php b/routes/web.php index 50b7d95..e865ef1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -7,6 +7,7 @@ use App\Http\Controllers\DashboardController; use App\Http\Controllers\RepositoryController; use App\Http\Controllers\UserController; +use App\Http\Controllers\VcsInstanceController; use App\Http\Controllers\VcsInstanceUserController; use Illuminate\Support\Facades\Route; @@ -54,6 +55,11 @@ 'destroy', ]); + Route::resource('vcs-instances', VcsInstanceController::class)->only([ + 'create', + 'store', + ]); + Route::resource('challenges', ChallengeController::class)->only([ 'create', 'store',