$input * * @throws ValidationException */ public function connect(Project $project, array $input): SourceControl { $sourceControl = new SourceControl([ 'provider' => $input['provider'], 'profile' => $input['name'], 'url' => Arr::has($input, 'url') ? $input['url'] : null, 'project_id' => isset($input['global']) && $input['global'] ? null : $project->id, ]); $sourceControl->provider_data = $sourceControl->provider()->createData($input); if (! $sourceControl->provider()->connect()) { throw ValidationException::withMessages([ 'token' => __('Cannot connect to :provider or invalid token!', ['provider' => $sourceControl->provider] ), ]); } $sourceControl->save(); return $sourceControl; } /** * @param array $input * @return array> */ public static function rules(array $input): array { $rules = [ 'name' => [ 'required', ], 'provider' => [ 'required', Rule::in(config('core.source_control_providers')), ], ]; return array_merge($rules, self::providerRules($input)); } /** * @param array $input * @return array> * * @throws ValidationException */ private static function providerRules(array $input): array { if (! isset($input['provider'])) { return []; } $sourceControl = new SourceControl([ 'provider' => $input['provider'], ]); return $sourceControl->provider()->createRules($input); } }