diff --git a/.env.example b/.env.example index 047b7ed..0f22481 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -APP_NAME=Laravel +APP_NAME=Webapps APP_ENV=local APP_KEY= APP_DEBUG=true diff --git a/app/Actions/AuthenticatePortainer.php b/app/Actions/AuthenticatePortainer.php new file mode 100644 index 0000000..3d412ef --- /dev/null +++ b/app/Actions/AuthenticatePortainer.php @@ -0,0 +1,43 @@ + $username, + 'password' => $password, + ] + ); + + $jwt = $auth->json('jwt'); + + $endpoints = Http::withToken($jwt) + ->get("{$portainerUrl}/api/endpoints") + ->json(); + $endpointId = $endpoints[0]['Id']; + + return [ + 'jwt' => $jwt, + 'endpointId' => $endpointId + ]; + } +} diff --git a/app/Actions/GenerateComposeYml.php b/app/Actions/GenerateComposeYml.php new file mode 100644 index 0000000..fd72a5d --- /dev/null +++ b/app/Actions/GenerateComposeYml.php @@ -0,0 +1,48 @@ +appVariables; + $environment = []; + foreach ($env_variables as $env_variable): + $environment[$env_variable->imageVariable->name] = $env_variable->value; + endforeach; + + $composeArray = [ + 'services' => [ + 'app' => [ + 'image' => "{$dockerImage->path}:{$dockerImage->tag}", + 'restart' => 'unless-stopped', + 'ports' => ['8888:80'], + 'environment' => $environment, + 'entrypoint' => [ + 'sh', + '-c', + 'php artisan migrate --force && exec apache2-foreground' + ] + ] + ] + ]; + + $composeYaml = Yaml::dump($composeArray, 4, 2); + $composeYaml = str_replace("'-c'", "-c", $composeYaml); + + return $composeYaml; + } +} diff --git a/app/Actions/GetGwmariadbPayload.php b/app/Actions/GetGwmariadbPayload.php new file mode 100644 index 0000000..23f8744 --- /dev/null +++ b/app/Actions/GetGwmariadbPayload.php @@ -0,0 +1,30 @@ + $action + ]; + else: + $payload = [ + 'action' => $action, + 'nome' => $siteName + ]; + endif; + + return $payload; + } +} diff --git a/app/Actions/SendGwmariadbRequest.php b/app/Actions/SendGwmariadbRequest.php new file mode 100644 index 0000000..9409111 --- /dev/null +++ b/app/Actions/SendGwmariadbRequest.php @@ -0,0 +1,25 @@ + env('GWMARIADB_TOKEN'), + ])->post(env('GWMARIADB_URL'), $payload); + + return $response; + } +} diff --git a/app/Actions/StoreAppVariablesOnImageSelection.php b/app/Actions/StoreAppVariablesOnImageSelection.php new file mode 100644 index 0000000..c12d1c5 --- /dev/null +++ b/app/Actions/StoreAppVariablesOnImageSelection.php @@ -0,0 +1,27 @@ + $imageVariable->id, + 'app_id' => $webapp->id, + 'value' => null + ]); + } +} diff --git a/app/Http/Controllers/Bucket/BucketController.php b/app/Http/Controllers/Bucket/BucketController.php new file mode 100644 index 0000000..bfd8246 --- /dev/null +++ b/app/Http/Controllers/Bucket/BucketController.php @@ -0,0 +1,11 @@ +getAllDockerImages(); + return view('dockerimages.index', [ + 'docker_images' => $dockerImages + ]); + } + + public function show(DockerImage $dockerimage) + { + return view('dockerimages.show', [ + 'docker_image' => $dockerimage + ]); + } + + public function create() + { + return view('dockerimages.create'); + } + + public function store(DockerImageRequest $request) + { + $dockerImage = (new DockerImageService())->createDockerImage($request->validated()); + return redirect("/dockerimages/{$dockerImage->id}"); + } + + public function edit(DockerImage $dockerimage) + { + return view('dockerimages.edit', [ + 'docker_image' => $dockerimage + ]); + } + + public function update(DockerImageUpdateRequest $request, DockerImage $dockerimage) + { + $dockerImage = (new DockerImageService())->updateDockerImage($dockerimage, $request->validated()); + return redirect("/dockerimages/{$dockerImage->id}"); + } + + public function destroy(DockerImage $dockerimage) + { + $deleted = (new DockerImageService())->destroyDockerImage($dockerimage); + + if($deleted) { + return redirect("/dockerimages"); + } + } + + public function storeImageVariable(string $imageId, StoreImageVariableRequest $request) + { + + (new ImageVariableService())->storeVariable($imageId, $request->validated()); + + return redirect("/dockerimages/{$imageId}"); + } +} diff --git a/app/Http/Controllers/Dockerimage/ImageVariableController.php b/app/Http/Controllers/Dockerimage/ImageVariableController.php new file mode 100644 index 0000000..2e77b3f --- /dev/null +++ b/app/Http/Controllers/Dockerimage/ImageVariableController.php @@ -0,0 +1,30 @@ +image->id; + + (new ImageVariableService())->updateVariable($variable, $request->validated()); + + return redirect("/dockerimages/{$imageId}"); + } + + public function destroy(string $variableId) + { + $variable = (new ImageVariableService())->getImageVariableById($variableId); + $imageId = $variable->image->id; + $variable->delete(); + + return redirect("/dockerimages/{$imageId}"); + } +} diff --git a/app/Http/Controllers/Gwmariadb/TestGwmariadbConnectionController.php b/app/Http/Controllers/Gwmariadb/TestGwmariadbConnectionController.php new file mode 100644 index 0000000..0d0e1a2 --- /dev/null +++ b/app/Http/Controllers/Gwmariadb/TestGwmariadbConnectionController.php @@ -0,0 +1,22 @@ + env('GWMARIADB_TOKEN'), + ])->get(env('GWMARIADB_URL')); + + return json_encode($response->json()); + } +} diff --git a/app/Http/Controllers/GwmariadbController.php b/app/Http/Controllers/GwmariadbController.php new file mode 100644 index 0000000..aebeb96 --- /dev/null +++ b/app/Http/Controllers/GwmariadbController.php @@ -0,0 +1,79 @@ +listarDatabase(); + + dd($response); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(string $appId) + { + $webapp = (new WebappService())->getWebappById($appId); + $siteName = $webapp->name; + + $response = (new GwmariadbService($siteName))->storeDatabase(); + + return var_dump($response->json()); + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $appId) { + + return view('gwmariadb.edit'); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $appId) + { + $webapp = (new WebappService())->getWebappById($appId); + $siteName = $webapp->name; + + $response = (new GwmariadbService($siteName))->trocarSenhaUsuario(); + + return $response; + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/app/Http/Controllers/PortainerController.php b/app/Http/Controllers/PortainerController.php new file mode 100644 index 0000000..3914931 --- /dev/null +++ b/app/Http/Controllers/PortainerController.php @@ -0,0 +1,95 @@ +getWebappById(1); + $dockerImage = $webapp->dockerImage; + + $composeYml = GenerateComposeYml::execute($dockerImage, $webapp); + dd($composeYml); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(string $webappId) + { + $webapp = (new WebappService())->getWebappById($webappId); + $dockerImage = $webapp->dockerImage; + $composeYml = GenerateComposeYml::execute($dockerImage, $webapp); + + $response = (new PortainerService())->createStack($webapp->name, $composeYml); + + $webapp->status = "Publicado"; + $webapp->stack = $response['Id']; + $webapp->save(); + + return redirect("/webapps/{$webapp->id}"); + + //dd($response->status(), $response->json() ?: $response->body()); + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(string $webappId) + { + $webapp = (new WebappService())->getWebappById($webappId); + $dockerImage = $webapp->dockerImage; + $stackId = $webapp->stack; + + $composeYml = GenerateComposeYml::execute($dockerImage, $webapp); + + $response = (new PortainerService())->updateStack($webapp->name, $composeYml, $stackId); + + return redirect("/webapps/{$webapp->id}"); + + dd( + $response->status(), + $response->json() ?: $response->body() + ); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/app/Http/Controllers/ReuniaoController.php b/app/Http/Controllers/ReuniaoController.php index a2f7b8b..5fb670a 100644 --- a/app/Http/Controllers/ReuniaoController.php +++ b/app/Http/Controllers/ReuniaoController.php @@ -20,7 +20,6 @@ public function gwmariadb() ])->post(env('GWMARIADB_URL'), $payload); dd($response->json()); - } public function rustfs($app) @@ -40,7 +39,6 @@ public function rustfs($app) $s3Client->createBucket([ 'Bucket' => $app, ]); - } public function portainer() @@ -65,10 +63,10 @@ public function portainer() $endpointId = $endpoints[0]['Id']; -$yaml = <<<'YAML' + $yaml = <<status(), $response->json() ?: $response->body() ); - - } } diff --git a/app/Http/Controllers/WebappController.php b/app/Http/Controllers/WebappController.php index 3e7c198..1e27227 100644 --- a/app/Http/Controllers/WebappController.php +++ b/app/Http/Controllers/WebappController.php @@ -3,33 +3,57 @@ namespace App\Http\Controllers; use App\Http\Requests\WebappRequest; +use App\Http\Requests\AppUpdateRequest; use App\Models\Webapp; -use Illuminate\Http\Client\RequestException; +use App\Services\WebappService; class WebappController extends Controller { - public function index(){ + public function index() + { $webapps = Webapp::all(); return view('webapps.index', ['webapps' => $webapps]); } - - public function show(Webapp $webapp){ - return view('webapps.show', ['webapp' => $webapp]); + + public function show(Webapp $webapp) + { + //dd(($webapp->envVariables()->whereNotNull('value')->get()->isEmpty())); + if ($webapp->image_id == NULL): + $dockerStatus = 'not_configured'; + else: + $dockerStatus = 'configured'; + endif; + + $dockerStatus; + return view('webapps.show', [ + 'webapp' => $webapp, + 'dockerStatus' => $dockerStatus + ]); } - public function create(Webapp $webapp){ + public function create(Webapp $webapp) + { return view('webapps.create', ['webapp' => $webapp]); } - public function store(WebappRequest $request){ + public function store(WebappRequest $request) + { $validated = $request->validated(); $validated['user_id'] = auth()->user()->id; + $validated['dominio'] = $validated['name'] . '.fflch.usp.br'; $webapp = Webapp::create($validated); - - session()->flash('alert-success','Solicitação enviada com sucesso. Aguarde a análise de um administrador'); + + session()->flash('alert-success', 'Solicitação enviada com sucesso. Aguarde a análise de um administrador'); return redirect('/'); } + + public function updateImage(AppUpdateRequest $request, Webapp $webapp) + { + $webapp = (new WebappService()->updateImage($webapp, $request->validated())); + + return redirect("/webapps/{$webapp->id}"); + } } diff --git a/app/Http/Controllers/Webapps/EditWebappImageController.php b/app/Http/Controllers/Webapps/EditWebappImageController.php new file mode 100644 index 0000000..7fb8823 --- /dev/null +++ b/app/Http/Controllers/Webapps/EditWebappImageController.php @@ -0,0 +1,21 @@ +getAllDockerImages(); + return view('webapps.dockerimage', [ + 'webapp' => $webapp, + 'docker_images' => $dockerImages + ]); + } +} diff --git a/app/Http/Controllers/Webapps/ShowWebappVariablesController.php b/app/Http/Controllers/Webapps/ShowWebappVariablesController.php new file mode 100644 index 0000000..3699fb6 --- /dev/null +++ b/app/Http/Controllers/Webapps/ShowWebappVariablesController.php @@ -0,0 +1,21 @@ + $webapp, + 'env_variables' => $webapp->appVariables + ]); + } +} diff --git a/app/Http/Controllers/Webapps/UpdateWebappVariablesController.php b/app/Http/Controllers/Webapps/UpdateWebappVariablesController.php new file mode 100644 index 0000000..c9d2803 --- /dev/null +++ b/app/Http/Controllers/Webapps/UpdateWebappVariablesController.php @@ -0,0 +1,22 @@ +storeAppVariables($variable, $request->validated()); + + return redirect("/webapps/{$variable->app_id}/variables"); + } +} diff --git a/app/Http/Requests/AppUpdateRequest.php b/app/Http/Requests/AppUpdateRequest.php new file mode 100644 index 0000000..fd3de97 --- /dev/null +++ b/app/Http/Requests/AppUpdateRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'image' => 'required' + ]; + } +} diff --git a/app/Http/Requests/DockerImageRequest.php b/app/Http/Requests/DockerImageRequest.php new file mode 100644 index 0000000..5e4e649 --- /dev/null +++ b/app/Http/Requests/DockerImageRequest.php @@ -0,0 +1,39 @@ +|string> + */ + public function rules(): array + { + return [ + 'name' => 'required|string', + 'path' => 'required|string', + 'tag' => 'required|string' + ]; + } + + public function messages(){ + return [ + 'name.required' => 'O nome da imagem é obrigatório.', + 'path.required' => 'A tag docker é obrigatória.', + 'tag.required' => 'A versão da tag é obrigatória.' + ]; + } +} diff --git a/app/Http/Requests/DockerImageUpdateRequest.php b/app/Http/Requests/DockerImageUpdateRequest.php new file mode 100644 index 0000000..8ec19e3 --- /dev/null +++ b/app/Http/Requests/DockerImageUpdateRequest.php @@ -0,0 +1,39 @@ +|string> + */ + public function rules(): array + { + return [ + 'path' => 'required|string', + 'tag' => 'required|string', + 'env_variables' => 'required|string' + ]; + } + + public function messages(){ + return [ + 'path.required' => 'A tag docker é obrigatória.', + 'tag.required' => 'A versão da tag é obrigatória.', + 'env_variables.required' => 'As variáveis de ambiente são obrigatórias.', + ]; + } +} diff --git a/app/Http/Requests/StoreImageVariableRequest.php b/app/Http/Requests/StoreImageVariableRequest.php new file mode 100644 index 0000000..7f279de --- /dev/null +++ b/app/Http/Requests/StoreImageVariableRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'name' => 'string|required' + ]; + } +} diff --git a/app/Http/Requests/UpdateAppVariableRequest.php b/app/Http/Requests/UpdateAppVariableRequest.php new file mode 100644 index 0000000..e45afac --- /dev/null +++ b/app/Http/Requests/UpdateAppVariableRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'value' => 'string|required' + ]; + } +} diff --git a/app/Http/Requests/WebappDockerImageRequest.php b/app/Http/Requests/WebappDockerImageRequest.php new file mode 100644 index 0000000..2ecc507 --- /dev/null +++ b/app/Http/Requests/WebappDockerImageRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'docker_image' => 'required' + ]; + } +} diff --git a/app/Http/Requests/WebappDockerRequest.php b/app/Http/Requests/WebappDockerRequest.php new file mode 100644 index 0000000..7b8b2af --- /dev/null +++ b/app/Http/Requests/WebappDockerRequest.php @@ -0,0 +1,35 @@ +|string> + */ + public function rules(): array + { + return [ + 'env_variables' => 'required|string' + ]; + } + + public function messages(){ + return [ + 'env_variables.required' => 'As variáveis de ambiente são obrigatórias.', + ]; + } +} diff --git a/app/Http/Requests/WebappRequest.php b/app/Http/Requests/WebappRequest.php index e083dcc..453e800 100644 --- a/app/Http/Requests/WebappRequest.php +++ b/app/Http/Requests/WebappRequest.php @@ -23,21 +23,17 @@ public function authorize(): bool public function rules(): array { return [ - 'dominio' => 'required', - 'url_github' => ['nullable','url','starts_with:https://github.com/fflch'], + 'name' => 'required', 'justificativa' => 'required', 'tipo' => 'required', - ]; } public function messages(){ return [ - 'dominio.required' => 'O domínio é obrigatório', + 'name.required' => 'O domínio é obrigatório', 'justificativa.required' => 'A justificativa é obrigatória', 'tipo.required' => 'O tipo é obrigatório', - 'url_github.url' => 'A Url precisa começar com https://', - 'url_github.starts_with' => 'A URL inserida não pertence a fflch' ]; } diff --git a/app/Models/AppDatabase.php b/app/Models/AppDatabase.php new file mode 100644 index 0000000..c6c0fa9 --- /dev/null +++ b/app/Models/AppDatabase.php @@ -0,0 +1,15 @@ +belongsTo(Webapp::class, 'app_id', 'id'); + } +} diff --git a/app/Models/AppVariable.php b/app/Models/AppVariable.php new file mode 100644 index 0000000..4007fde --- /dev/null +++ b/app/Models/AppVariable.php @@ -0,0 +1,20 @@ +belongsTo(Webapp::class, 'app_id', 'id'); + } + + public function imageVariable() + { + return $this->belongsTo(ImageVariable::class); + } +} diff --git a/app/Models/Bucket.php b/app/Models/Bucket.php new file mode 100644 index 0000000..6394a5e --- /dev/null +++ b/app/Models/Bucket.php @@ -0,0 +1,15 @@ +belongsTo(Webapp::class, 'app_id', 'id'); + } +} diff --git a/app/Models/DockerImage.php b/app/Models/DockerImage.php new file mode 100644 index 0000000..7bc2e9d --- /dev/null +++ b/app/Models/DockerImage.php @@ -0,0 +1,27 @@ +hasMany(Webapp::class); + } + + public function imageVariables() + { + return $this->hasMany(ImageVariable::class, 'image_id', 'id'); + } +} diff --git a/app/Models/ImageVariable.php b/app/Models/ImageVariable.php new file mode 100644 index 0000000..23985fd --- /dev/null +++ b/app/Models/ImageVariable.php @@ -0,0 +1,20 @@ +belongsTo(DockerImage::class, 'image_id', 'id'); + } + + public function appVariables() + { + return $this->hasMany(AppVariable::class); + } +} diff --git a/app/Models/Webapp.php b/app/Models/Webapp.php index 7ab8413..983d434 100644 --- a/app/Models/Webapp.php +++ b/app/Models/Webapp.php @@ -6,10 +6,37 @@ class Webapp extends Model { + /** + * The table associated with the model. + * + * @var string + */ + protected $table = 'apps'; + protected $guarded = ['id']; - - public function user(){ - return $this->belongsTo(User::class, 'user_id'); + + public function user() + { + return $this->belongsTo(User::class); } + public function appVariables() + { + return $this->hasMany(AppVariable::class, 'app_id', 'id'); + } + + public function dockerImage() + { + return $this->belongsTo(DockerImage::class, 'image_id', 'id'); + } + + public function Bucket() + { + return $this->hasMany(Bucket::class, 'app_id', 'id'); + } + + public function AppDatabase() + { + return $this->hasOne(AppDatabase::class, 'app_id', 'id'); + } } diff --git a/app/Services/AppDatabaseService.php b/app/Services/AppDatabaseService.php new file mode 100644 index 0000000..e4bc003 --- /dev/null +++ b/app/Services/AppDatabaseService.php @@ -0,0 +1,41 @@ + $requestData['name'], + 'username' => $requestData['name'], + 'password' => $requestData['password'], + 'app_id' => $webapp->id + ]); + return $appDatabase; + } + + public function updateDatabasePassword(AppDatabase $appDatabase, array $requestData): AppDatabase + { + $appDatabase->password = $requestData['new_password']; + $appDatabase->save(); + + return $appDatabase; + } +} diff --git a/app/Services/BucketService.php b/app/Services/BucketService.php new file mode 100644 index 0000000..cedb3ac --- /dev/null +++ b/app/Services/BucketService.php @@ -0,0 +1,33 @@ + $requestData['name'], + 'key' => $requestData['key'], + 'secret' => $requestData['secret'] + ]); + + return $bucket; + } + + public function deleteBucket(Bucket $bucket) + { + + } +} diff --git a/app/Services/DockerImageService.php b/app/Services/DockerImageService.php new file mode 100644 index 0000000..502203c --- /dev/null +++ b/app/Services/DockerImageService.php @@ -0,0 +1,67 @@ +getImageById($image_id); + $variables = []; + foreach($image->imageVariables as $variable) { + $variables[] = [ + 'name' => $variable->name, + 'value' => null + ]; + } + return $variables; + } + + function createDockerImage(array $dockerImageData) + { + $dockerImage = new DockerImage(); + $dockerImage->name = $dockerImageData['name']; + $dockerImage->path = $dockerImageData['path']; + $dockerImage->tag = $dockerImageData['tag']; + $dockerImage->save(); + + return $dockerImage; + } + + function updateDockerImage(DockerImage $dockerImage, array $dockerImageData): DockerImage + { + $dockerImage->update([ + 'path' => $dockerImageData['path'], + 'tag' => $dockerImageData['tag'], + 'env_variables' => $dockerImageData['env_variables'] + ]); + + return $dockerImage; + } + + + function destroyDockerImage(DockerImage $dockerImage) + { + $dockerImage->delete(); + + return true; + } + + function storeImageVariable() { + + } +} diff --git a/app/Services/GwmariadbService.php b/app/Services/GwmariadbService.php new file mode 100644 index 0000000..614dd11 --- /dev/null +++ b/app/Services/GwmariadbService.php @@ -0,0 +1,134 @@ +siteName = $siteName; + } + + public function listarDatabase() + { + $action = 'listar_databases'; + $payload = GetGwmariadbPayload::execute($action); + $response = SendGwmariadbRequest::execute($payload); + + return $response->json(); + } + + public function listarUsuarios() + { + $action = 'listar_usuarios'; + $payload = GetGwmariadbPayload::execute($action); + $response = SendGwmariadbRequest::execute($payload); + + return $response; + } + + public function storeDatabase() + { + if(!$this->userExists() && !$this->databaseExists()) { + $response = $this->criarDatabaseUsuarioPrivilegio(); + + return $response; + } + + if(!$this->userExists() && $this->databaseExists()) { + $response = $this->criarDatabase(); + $this->concederPrivilegios(); + + return $response; + } + + if($this->userExists() && !$this->databaseExists()) { + $response = $this->criarUsuario(); + $this->concederPrivilegios(); + + return $response; + } + } + + public function criarDatabase() + { + $action = 'criar_database'; + $payload = GetGwmariadbPayload::execute($action, $this->siteName); + $response = SendGwmariadbRequest::execute($payload); + + return $response->json(); + } + + public function trocarSenhaUsuario() + { + $action = 'trocar_senha'; + $payload = GetGwmariadbPayload::execute($action, $this->siteName); + $response = SendGwmariadbRequest::execute($payload); + + return $response->json(); + } + + public function criarUsuario() + { + $action = 'criar_usuario'; + $payload = GetGwmariadbPayload::execute($action, $this->siteName); + $response = SendGwmariadbRequest::execute($payload); + + return $response; + } + + public function criarDatabaseUsuario() + { + $action = 'criar_database_usuario'; + $payload = GetGwmariadbPayload::execute($action, $this->siteName); + $response = SendGwmariadbRequest::execute($payload); + + return $response; + } + + public function criarDatabaseUsuarioPrivilegio() + { + $action = 'criar_database_usuario_privilegio'; + $payload = GetGwmariadbPayload::execute($action, $this->siteName); + $response = SendGwmariadbRequest::execute($payload); + + return $response; + } + + public function concederPrivilegios() + { + $action = 'conceder_privilegios'; + $payload = GetGwmariadbPayload::execute($action, $this->siteName); + $response = SendGwmariadbRequest::execute($payload); + + return $response; + } + + protected function databaseExists() + { + $action = 'database_existe'; + $payload = GetGwmariadbPayload::execute($action, $this->siteName); + $response = SendGwmariadbRequest::execute($payload); + + dd($response->json()); + + return true; + } + + protected function userExists() + { + $action = 'usuario_existe'; + $payload = GetGwmariadbPayload::execute($action, $this->siteName); + $response = SendGwmariadbRequest::execute($payload); + + dd($response->json()); + + return true; + } +} diff --git a/app/Services/ImageVariableService.php b/app/Services/ImageVariableService.php new file mode 100644 index 0000000..636f598 --- /dev/null +++ b/app/Services/ImageVariableService.php @@ -0,0 +1,36 @@ + $imageId, + 'name' => $requestData['name'] + ]); + } + + public function updateVariable(ImageVariable $variable, array $requestData) + { + $variable->name = $requestData['name']; + $variable->save(); + } +} diff --git a/app/Services/PortainerService.php b/app/Services/PortainerService.php new file mode 100644 index 0000000..6add8b8 --- /dev/null +++ b/app/Services/PortainerService.php @@ -0,0 +1,58 @@ +jwt = $auth['jwt']; + $this->endpointId = $auth['endpointId']; + $this->portainerUrl = env('PORTAINER_URL'); + } + + public function createStack(string $webappName, string $yaml) + { + $response = Http::withToken($this->jwt) + ->post( + "{$this->portainerUrl}/api/stacks/create/standalone/string?endpointId={$this->endpointId}", + [ + 'Name' => $webappName, + 'StackFileContent' => $yaml, + ] + ); + + return $response->json(); + } + + public function updateStack(string $webappName, string $yaml, string $stack) + { + $response = Http::withToken($this->jwt) + ->put( + "{$this->portainerUrl}/api/stacks/{$stack}?endpointId={$this->endpointId}", + [ + 'Name' => $webappName, + 'StackFileContent' => $yaml, + ] + ); + + return $response->json(); + } + + public function deleteStack() + { + + } +} diff --git a/app/Services/WebappService.php b/app/Services/WebappService.php new file mode 100644 index 0000000..96bdad1 --- /dev/null +++ b/app/Services/WebappService.php @@ -0,0 +1,39 @@ +getImageById($requestData['image']); + foreach ($image->imageVariables as $variable) { + StoreAppVariablesOnImageSelection::execute($webapp, $variable); + } + + $webapp->image_id = $requestData['image']; + $webapp->save(); + + return $webapp; + } + + function storeAppVariables(AppVariable $appVariable, array $requestData) + { + $appVariable->value = $requestData['value']; + $appVariable->save(); + + return $appVariable; + } +} diff --git a/composer.json b/composer.json index 69eb2de..380d318 100644 --- a/composer.json +++ b/composer.json @@ -15,6 +15,7 @@ }, "require-dev": { "fakerphp/faker": "^1.23", + "laravel/dusk": "^8.6", "laravel/pail": "^1.2.2", "laravel/pint": "^1.24", "laravel/sail": "^1.41", diff --git a/composer.lock b/composer.lock index cdbaf5f..ec34f44 100644 --- a/composer.lock +++ b/composer.lock @@ -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": "dbeae0e5802d07751c2eb33c29126205", + "content-hash": "ee44a3977b47a8aee987e2ceaa0cdde9", "packages": [ { "name": "aws/aws-crt-php", @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.384.0", + "version": "3.384.5", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "6de1120aa6138e8f007c3537be86c0e64337c53b" + "reference": "c7d34f2d60515bd0c307e462268f75877842da4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6de1120aa6138e8f007c3537be86c0e64337c53b", - "reference": "6de1120aa6138e8f007c3537be86c0e64337c53b", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c7d34f2d60515bd0c307e462268f75877842da4a", + "reference": "c7d34f2d60515bd0c307e462268f75877842da4a", "shasum": "" }, "require": { @@ -153,9 +153,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.384.0" + "source": "https://github.com/aws/aws-sdk-php/tree/3.384.5" }, - "time": "2026-06-02T18:23:32+00:00" + "time": "2026-06-08T18:25:02+00:00" }, { "name": "brick/math", @@ -818,12 +818,12 @@ "version": "v7.0.5", "source": { "type": "git", - "url": "https://github.com/firebase/php-jwt.git", + "url": "https://github.com/googleapis/php-jwt.git", "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380", + "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380", "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380", "shasum": "" }, @@ -872,8 +872,8 @@ "php" ], "support": { - "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v7.0.5" + "issues": "https://github.com/googleapis/php-jwt/issues", + "source": "https://github.com/googleapis/php-jwt/tree/v7.0.5" }, "time": "2026-04-01T20:38:03+00:00" }, @@ -1012,25 +1012,26 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.10.0", + "version": "7.11.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + "reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/5af96f374e0ab4ebd747b8310888c99d3adb0a8c", + "reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^2.3", - "guzzlehttp/psr7": "^2.8", + "guzzlehttp/promises": "^2.5", + "guzzlehttp/psr7": "^2.11", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/polyfill-php80": "^1.24" }, "provide": { "psr/http-client-implementation": "1.0" @@ -1039,8 +1040,9 @@ "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "guzzle/client-integration-tests": "3.0.2", + "guzzlehttp/test-server": "^0.5", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "phpunit/phpunit": "^8.5.52 || ^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -1118,7 +1120,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + "source": "https://github.com/guzzle/guzzle/tree/7.11.1" }, "funding": [ { @@ -1134,28 +1136,29 @@ "type": "tidelift" } ], - "time": "2025-08-23T22:36:01+00:00" + "time": "2026-06-07T22:54:06+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.3.0", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "481557b130ef3790cf82b713667b43030dc9c957" + "reference": "4360e982f87f5f258bf872d094647791db2f4c8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", - "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "url": "https://api.github.com/repos/guzzle/promises/zipball/4360e982f87f5f258bf872d094647791db2f4c8e", + "reference": "4360e982f87f5f258bf872d094647791db2f4c8e", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "php": "^7.2.5 || ^8.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" + "phpunit/phpunit": "^8.5.52 || ^9.6.34" }, "type": "library", "extra": { @@ -1201,7 +1204,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.3.0" + "source": "https://github.com/guzzle/promises/tree/2.5.0" }, "funding": [ { @@ -1217,27 +1220,29 @@ "type": "tidelift" } ], - "time": "2025-08-22T14:34:08+00:00" + "time": "2026-06-02T12:23:43+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.9.0", + "version": "2.11.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" + "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", - "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f", + "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" + "ralouphie/getallheaders": "^3.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/polyfill-php80": "^1.24" }, "provide": { "psr/http-factory-implementation": "1.0", @@ -1245,9 +1250,9 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", + "http-interop/http-factory-tests": "1.1.0", "jshttp/mime-db": "1.54.0.1", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" + "phpunit/phpunit": "^8.5.52 || ^9.6.34" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -1318,7 +1323,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.9.0" + "source": "https://github.com/guzzle/psr7/tree/2.11.0" }, "funding": [ { @@ -1334,20 +1339,20 @@ "type": "tidelift" } ], - "time": "2026-03-10T16:41:02+00:00" + "time": "2026-06-02T12:30:48+00:00" }, { "name": "guzzlehttp/uri-template", - "version": "v1.0.5", + "version": "v1.0.6", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" + "reference": "eef7f87bab6f204eba3c39224d8075c70c637946" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", - "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/eef7f87bab6f204eba3c39224d8075c70c637946", + "reference": "eef7f87bab6f204eba3c39224d8075c70c637946", "shasum": "" }, "require": { @@ -1356,7 +1361,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "phpunit/phpunit": "^8.5.52 || ^9.6.34", "uri-template/tests": "1.0.0" }, "type": "library", @@ -1404,7 +1409,7 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.6" }, "funding": [ { @@ -1420,7 +1425,7 @@ "type": "tidelift" } ], - "time": "2025-08-22T14:27:06+00:00" + "time": "2026-05-23T22:00:21+00:00" }, { "name": "kyslik/column-sortable", @@ -1485,16 +1490,16 @@ }, { "name": "laravel/framework", - "version": "v12.56.0", + "version": "v12.61.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "dac16d424b59debb2273910dde88eb7050a2a709" + "reference": "e8472ca9774452fe50841d9bdced060679f4d58d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/dac16d424b59debb2273910dde88eb7050a2a709", - "reference": "dac16d424b59debb2273910dde88eb7050a2a709", + "url": "https://api.github.com/repos/laravel/framework/zipball/e8472ca9774452fe50841d9bdced060679f4d58d", + "reference": "e8472ca9774452fe50841d9bdced060679f4d58d", "shasum": "" }, "require": { @@ -1535,8 +1540,8 @@ "symfony/mailer": "^7.2.0", "symfony/mime": "^7.2.0", "symfony/polyfill-php83": "^1.33", - "symfony/polyfill-php84": "^1.33", - "symfony/polyfill-php85": "^1.33", + "symfony/polyfill-php84": "^1.34", + "symfony/polyfill-php85": "^1.34", "symfony/process": "^7.2.0", "symfony/routing": "^7.2.0", "symfony/uid": "^7.2.0", @@ -1703,20 +1708,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-03-26T14:51:54+00:00" + "time": "2026-06-04T14:22:52+00:00" }, { "name": "laravel/prompts", - "version": "v0.3.16", + "version": "v0.3.18", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "11e7d5f93803a2190b00e145142cb00a33d17ad2" + "reference": "a19af51bb144bf87f08397921fa619f85c7d4e72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/11e7d5f93803a2190b00e145142cb00a33d17ad2", - "reference": "11e7d5f93803a2190b00e145142cb00a33d17ad2", + "url": "https://api.github.com/repos/laravel/prompts/zipball/a19af51bb144bf87f08397921fa619f85c7d4e72", + "reference": "a19af51bb144bf87f08397921fa619f85c7d4e72", "shasum": "" }, "require": { @@ -1760,22 +1765,22 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.16" + "source": "https://github.com/laravel/prompts/tree/v0.3.18" }, - "time": "2026-03-23T14:35:33+00:00" + "time": "2026-05-19T00:47:18+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.10", + "version": "v2.0.13", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669" + "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669", - "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b566ee0dd251f3c4078bed003a7ce015f5ea6dce", + "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce", "shasum": "" }, "require": { @@ -1823,20 +1828,20 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-02-20T19:59:49+00:00" + "time": "2026-04-16T14:03:50+00:00" }, { "name": "laravel/socialite", - "version": "v5.26.1", + "version": "v5.27.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "db6ec2ee967b7f06412c3a0cf1daaf072f4752a4" + "reference": "40e0757a75637c7b2dff05d3286b0d8fc25e5c0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/db6ec2ee967b7f06412c3a0cf1daaf072f4752a4", - "reference": "db6ec2ee967b7f06412c3a0cf1daaf072f4752a4", + "url": "https://api.github.com/repos/laravel/socialite/zipball/40e0757a75637c7b2dff05d3286b0d8fc25e5c0e", + "reference": "40e0757a75637c7b2dff05d3286b0d8fc25e5c0e", "shasum": "" }, "require": { @@ -1895,7 +1900,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2026-03-29T14:50:53+00:00" + "time": "2026-04-24T14:05:47+00:00" }, { "name": "laravel/tinker", @@ -2154,16 +2159,16 @@ }, { "name": "league/flysystem", - "version": "3.33.0", + "version": "3.34.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "570b8871e0ce693764434b29154c54b434905350" + "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/570b8871e0ce693764434b29154c54b434905350", - "reference": "570b8871e0ce693764434b29154c54b434905350", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e", + "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e", "shasum": "" }, "require": { @@ -2231,9 +2236,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.33.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.34.0" }, - "time": "2026-03-25T07:59:30+00:00" + "time": "2026-05-14T10:28:08+00:00" }, { "name": "league/flysystem-local", @@ -2769,16 +2774,16 @@ }, { "name": "nesbot/carbon", - "version": "3.11.3", + "version": "3.11.4", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "6a7e652845bb018c668220c2a545aded8594fbbf" + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf", - "reference": "6a7e652845bb018c668220c2a545aded8594fbbf", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60", "shasum": "" }, "require": { @@ -2870,7 +2875,7 @@ "type": "tidelift" } ], - "time": "2026-03-11T17:23:39+00:00" + "time": "2026-04-07T09:57:54+00:00" }, { "name": "nette/schema", @@ -2941,16 +2946,16 @@ }, { "name": "nette/utils", - "version": "v4.1.3", + "version": "v4.1.4", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" + "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", - "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", + "url": "https://api.github.com/repos/nette/utils/zipball/7da6c396d7ebe142bc857c20479d5e70a5e1aac7", + "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7", "shasum": "" }, "require": { @@ -3026,9 +3031,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.3" + "source": "https://github.com/nette/utils/tree/v4.1.4" }, - "time": "2026-02-13T03:05:33+00:00" + "time": "2026-05-11T20:49:54+00:00" }, { "name": "nikic/php-parser", @@ -3371,16 +3376,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.50", + "version": "3.0.52", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "aa6ad8321ed103dc3624fb600a25b66ebf78ec7b" + "reference": "2adaefc83df2ec548558307690f376dd7d4f4fce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/aa6ad8321ed103dc3624fb600a25b66ebf78ec7b", - "reference": "aa6ad8321ed103dc3624fb600a25b66ebf78ec7b", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2adaefc83df2ec548558307690f376dd7d4f4fce", + "reference": "2adaefc83df2ec548558307690f376dd7d4f4fce", "shasum": "" }, "require": { @@ -3461,7 +3466,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.50" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.52" }, "funding": [ { @@ -3477,7 +3482,7 @@ "type": "tidelift" } ], - "time": "2026-03-19T02:57:58+00:00" + "time": "2026-04-27T07:02:15+00:00" }, { "name": "psr/cache", @@ -3942,16 +3947,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.22", + "version": "v0.12.23", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f" + "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3be75d5b9244936dd4ac62ade2bfb004d13acf0f", - "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4dcc0f08047d52bbde475eda481146fd8e27e1a4", + "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4", "shasum": "" }, "require": { @@ -4015,9 +4020,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.22" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.23" }, - "time": "2026-03-22T23:03:24+00:00" + "time": "2026-05-23T13:41:31+00:00" }, { "name": "ralouphie/getallheaders", @@ -4293,16 +4298,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.93.0", + "version": "1.93.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7" + "reference": "d5552849801f2642aea710557463234b59ef65eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", - "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d5552849801f2642aea710557463234b59ef65eb", + "reference": "d5552849801f2642aea710557463234b59ef65eb", "shasum": "" }, "require": { @@ -4342,7 +4347,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.0" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.1" }, "funding": [ { @@ -4350,20 +4355,20 @@ "type": "github" } ], - "time": "2026-02-21T12:49:54+00:00" + "time": "2026-05-19T14:06:37+00:00" }, { "name": "spatie/laravel-permission", - "version": "7.2.4", + "version": "7.4.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "0a8ab4b84dc5efe23be9ddcd77951e10030c452d" + "reference": "15a9daf02ba02d3ae77aaa6da582708231ef999b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/0a8ab4b84dc5efe23be9ddcd77951e10030c452d", - "reference": "0a8ab4b84dc5efe23be9ddcd77951e10030c452d", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/15a9daf02ba02d3ae77aaa6da582708231ef999b", + "reference": "15a9daf02ba02d3ae77aaa6da582708231ef999b", "shasum": "" }, "require": { @@ -4371,7 +4376,7 @@ "illuminate/container": "^12.0|^13.0", "illuminate/contracts": "^12.0|^13.0", "illuminate/database": "^12.0|^13.0", - "php": "^8.4", + "php": "^8.3", "spatie/laravel-package-tools": "^1.0" }, "require-dev": { @@ -4429,7 +4434,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/7.2.4" + "source": "https://github.com/spatie/laravel-permission/tree/7.4.2" }, "funding": [ { @@ -4437,24 +4442,24 @@ "type": "github" } ], - "time": "2026-03-17T22:57:08+00:00" + "time": "2026-05-30T19:21:26+00:00" }, { "name": "symfony/clock", - "version": "v8.0.8", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3" + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b55a638b189a6faa875e0ccdb00908fb87af95b3", - "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3", + "url": "https://api.github.com/repos/symfony/clock/zipball/701ef4de9705d6c32292ebee5e8044094a09fbf6", + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/clock": "^1.0" }, "provide": { @@ -4494,7 +4499,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v8.0.8" + "source": "https://github.com/symfony/clock/tree/v8.1.0" }, "funding": [ { @@ -4514,20 +4519,20 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/console", - "version": "v7.4.8", + "version": "v7.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707" + "reference": "85095d2573eaefaf35e40b9513a9bf09f72cd217" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", - "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", + "url": "https://api.github.com/repos/symfony/console/zipball/85095d2573eaefaf35e40b9513a9bf09f72cd217", + "reference": "85095d2573eaefaf35e40b9513a9bf09f72cd217", "shasum": "" }, "require": { @@ -4592,7 +4597,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.8" + "source": "https://github.com/symfony/console/tree/v7.4.13" }, "funding": [ { @@ -4612,24 +4617,24 @@ "type": "tidelift" } ], - "time": "2026-03-30T13:54:39+00:00" + "time": "2026-05-24T08:56:14+00:00" }, { "name": "symfony/css-selector", - "version": "v8.0.8", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "8db1c00226a94d8ab6aa89d9224eeee91e2ea2ed" + "reference": "dc0e2be45c9b5588c82414f02ac574b4b986abcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/8db1c00226a94d8ab6aa89d9224eeee91e2ea2ed", - "reference": "8db1c00226a94d8ab6aa89d9224eeee91e2ea2ed", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/dc0e2be45c9b5588c82414f02ac574b4b986abcd", + "reference": "dc0e2be45c9b5588c82414f02ac574b4b986abcd", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.4.1" }, "type": "library", "autoload": { @@ -4661,7 +4666,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v8.0.8" + "source": "https://github.com/symfony/css-selector/tree/v8.1.0" }, "funding": [ { @@ -4681,20 +4686,20 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", "shasum": "" }, "require": { @@ -4707,7 +4712,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -4732,7 +4737,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0" }, "funding": [ { @@ -4743,12 +4748,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-04-13T15:52:40+00:00" }, { "name": "symfony/error-handler", @@ -4834,20 +4843,21 @@ }, { "name": "symfony/event-dispatcher", - "version": "v8.0.8", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6" + "reference": "f249ae3f680958b6f1f9dd76e5747cf0695b4102" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f662acc6ab22a3d6d716dcb44c381c6002940df6", - "reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f249ae3f680958b6f1f9dd76e5747cf0695b4102", + "reference": "f249ae3f680958b6f1f9dd76e5747cf0695b4102", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { @@ -4895,7 +4905,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.1.0" }, "funding": [ { @@ -4915,20 +4925,20 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.6.0", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/ccba7060602b7fed0b03c85bf025257f76d9ef32", + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32", "shasum": "" }, "require": { @@ -4942,7 +4952,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -4975,7 +4985,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.0" }, "funding": [ { @@ -4986,12 +4996,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-01-05T13:30:16+00:00" }, { "name": "symfony/filesystem", @@ -5134,16 +5148,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.4.8", + "version": "v7.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "9381209597ec66c25be154cbf2289076e64d1eab" + "reference": "bc354f47c62301e990b7874fa662326368508e2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9381209597ec66c25be154cbf2289076e64d1eab", - "reference": "9381209597ec66c25be154cbf2289076e64d1eab", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/bc354f47c62301e990b7874fa662326368508e2c", + "reference": "bc354f47c62301e990b7874fa662326368508e2c", "shasum": "" }, "require": { @@ -5192,7 +5206,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.8" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.13" }, "funding": [ { @@ -5212,20 +5226,20 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-05-24T11:20:33+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.8", + "version": "v7.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "017e76ad089bac281553389269e259e155935e1a" + "reference": "9df847980c436451f4f51d1284491bb4356dd989" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/017e76ad089bac281553389269e259e155935e1a", - "reference": "017e76ad089bac281553389269e259e155935e1a", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9df847980c436451f4f51d1284491bb4356dd989", + "reference": "9df847980c436451f4f51d1284491bb4356dd989", "shasum": "" }, "require": { @@ -5311,7 +5325,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.8" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.13" }, "funding": [ { @@ -5331,20 +5345,20 @@ "type": "tidelift" } ], - "time": "2026-03-31T20:57:01+00:00" + "time": "2026-05-27T08:31:43+00:00" }, { "name": "symfony/mailer", - "version": "v7.4.8", + "version": "v7.4.12", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62" + "reference": "5cefb712a25f320579615ba9e1942abaeade7dff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/f6ea532250b476bfc1b56699b388a1bdbf168f62", - "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62", + "url": "https://api.github.com/repos/symfony/mailer/zipball/5cefb712a25f320579615ba9e1942abaeade7dff", + "reference": "5cefb712a25f320579615ba9e1942abaeade7dff", "shasum": "" }, "require": { @@ -5395,7 +5409,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.4.8" + "source": "https://github.com/symfony/mailer/tree/v7.4.12" }, "funding": [ { @@ -5415,20 +5429,20 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-05-20T07:20:23+00:00" }, { "name": "symfony/mime", - "version": "v7.4.8", + "version": "v7.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379" + "reference": "a845722765c4f6b2ce88beaf4f4479975b186770" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/6df02f99998081032da3407a8d6c4e1dcb5d4379", - "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379", + "url": "https://api.github.com/repos/symfony/mime/zipball/a845722765c4f6b2ce88beaf4f4479975b186770", + "reference": "a845722765c4f6b2ce88beaf4f4479975b186770", "shasum": "" }, "require": { @@ -5484,7 +5498,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.4.8" + "source": "https://github.com/symfony/mime/tree/v7.4.13" }, "funding": [ { @@ -5504,20 +5518,20 @@ "type": "tidelift" } ], - "time": "2026-03-30T14:11:46+00:00" + "time": "2026-05-23T16:22:37+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { @@ -5567,7 +5581,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -5587,20 +5601,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "e9247d281d694a5120554d9afaf54e070e88a603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603", "shasum": "" }, "require": { @@ -5649,7 +5663,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1" }, "funding": [ { @@ -5669,20 +5683,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-05-26T05:58:03+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + "reference": "dc21118016c039a66235cf93d96b435ffb282412" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412", + "reference": "dc21118016c039a66235cf93d96b435ffb282412", "shasum": "" }, "require": { @@ -5736,7 +5750,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1" }, "funding": [ { @@ -5756,20 +5770,20 @@ "type": "tidelift" } ], - "time": "2024-09-10T14:38:51+00:00" + "time": "2026-05-25T15:22:23+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.38.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", "shasum": "" }, "require": { @@ -5821,7 +5835,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" }, "funding": [ { @@ -5841,20 +5855,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-05-25T13:48:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.38.2", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, "require": { @@ -5906,7 +5920,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" }, "funding": [ { @@ -5926,20 +5940,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-05-27T06:59:30+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { @@ -5990,7 +6004,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" }, "funding": [ { @@ -6010,20 +6024,20 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.33.0", + "version": "v1.38.2", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "reference": "796a26abb75ce49f3a84433cd81bf1009d73d5f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/796a26abb75ce49f3a84433cd81bf1009d73d5f8", + "reference": "796a26abb75ce49f3a84433cd81bf1009d73d5f8", "shasum": "" }, "require": { @@ -6070,7 +6084,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.38.2" }, "funding": [ { @@ -6090,20 +6104,20 @@ "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2026-05-27T06:51:48+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", "shasum": "" }, "require": { @@ -6150,7 +6164,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" }, "funding": [ { @@ -6170,20 +6184,20 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-05-26T12:51:13+00:00" }, { "name": "symfony/polyfill-php85", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", "shasum": "" }, "require": { @@ -6230,7 +6244,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1" }, "funding": [ { @@ -6250,20 +6264,20 @@ "type": "tidelift" } ], - "time": "2025-06-23T16:12:55+00:00" + "time": "2026-05-26T02:25:22+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", "shasum": "" }, "require": { @@ -6313,7 +6327,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.37.0" }, "funding": [ { @@ -6333,20 +6347,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/process", - "version": "v7.4.8", + "version": "v7.4.13", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "60f19cd3badc8de688421e21e4305eba50f8089a" + "reference": "f5804be144caceb570f6747519999636b664f24c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/60f19cd3badc8de688421e21e4305eba50f8089a", - "reference": "60f19cd3badc8de688421e21e4305eba50f8089a", + "url": "https://api.github.com/repos/symfony/process/zipball/f5804be144caceb570f6747519999636b664f24c", + "reference": "f5804be144caceb570f6747519999636b664f24c", "shasum": "" }, "require": { @@ -6378,7 +6392,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.8" + "source": "https://github.com/symfony/process/tree/v7.4.13" }, "funding": [ { @@ -6398,20 +6412,20 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-05-23T16:05:06+00:00" }, { "name": "symfony/routing", - "version": "v7.4.8", + "version": "v7.4.13", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b" + "reference": "3a162171bb008e5e0f15dce6581373a4c0e8390d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", - "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", + "url": "https://api.github.com/repos/symfony/routing/zipball/3a162171bb008e5e0f15dce6581373a4c0e8390d", + "reference": "3a162171bb008e5e0f15dce6581373a4c0e8390d", "shasum": "" }, "require": { @@ -6463,7 +6477,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.8" + "source": "https://github.com/symfony/routing/tree/v7.4.13" }, "funding": [ { @@ -6483,20 +6497,20 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-05-24T11:20:33+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.1", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a", "shasum": "" }, "require": { @@ -6514,7 +6528,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -6550,7 +6564,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.0" }, "funding": [ { @@ -6570,24 +6584,24 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:30:57+00:00" + "time": "2026-03-28T09:44:51+00:00" }, { "name": "symfony/string", - "version": "v8.0.8", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ae9488f874d7603f9d2dfbf120203882b645d963" + "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ae9488f874d7603f9d2dfbf120203882b645d963", - "reference": "ae9488f874d7603f9d2dfbf120203882b645d963", + "url": "https://api.github.com/repos/symfony/string/zipball/afd5944f4005862d961efb85c8bbd5c523c4e3c9", + "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-intl-grapheme": "^1.33", "symfony/polyfill-intl-normalizer": "^1.0", @@ -6640,7 +6654,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.0.8" + "source": "https://github.com/symfony/string/tree/v8.1.0" }, "funding": [ { @@ -6660,24 +6674,24 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/translation", - "version": "v8.0.8", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f" + "reference": "b2bd012ca28c4acae830ee1206a5b6e35dd99693" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f", - "reference": "27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f", + "url": "https://api.github.com/repos/symfony/translation/zipball/b2bd012ca28c4acae830ee1206a5b6e35dd99693", + "reference": "b2bd012ca28c4acae830ee1206a5b6e35dd99693", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-mbstring": "^1.0", "symfony/translation-contracts": "^3.6.1" }, @@ -6733,7 +6747,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v8.0.8" + "source": "https://github.com/symfony/translation/tree/v8.1.0" }, "funding": [ { @@ -6753,20 +6767,20 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.6.1", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + "reference": "0ab302977a952b42fd51475c4ebac81f8da0a95d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", - "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/0ab302977a952b42fd51475c4ebac81f8da0a95d", + "reference": "0ab302977a952b42fd51475c4ebac81f8da0a95d", "shasum": "" }, "require": { @@ -6779,7 +6793,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -6815,7 +6829,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.7.0" }, "funding": [ { @@ -6835,20 +6849,20 @@ "type": "tidelift" } ], - "time": "2025-07-15T13:41:35+00:00" + "time": "2026-01-05T13:30:16+00:00" }, { "name": "symfony/uid", - "version": "v7.4.8", + "version": "v7.4.9", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56" + "reference": "2676b524340abcfe4d6151ec698463cebafee439" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/6883ebdf7bf6a12b37519dbc0df62b0222401b56", - "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56", + "url": "https://api.github.com/repos/symfony/uid/zipball/2676b524340abcfe4d6151ec698463cebafee439", + "reference": "2676b524340abcfe4d6151ec698463cebafee439", "shasum": "" }, "require": { @@ -6893,7 +6907,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.4.8" + "source": "https://github.com/symfony/uid/tree/v7.4.9" }, "funding": [ { @@ -6913,7 +6927,7 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-04-30T15:19:22+00:00" }, { "name": "symfony/var-dumper", @@ -7059,16 +7073,16 @@ }, { "name": "uspdev/cadastros-auxiliares-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/uspdev/cadastros-auxiliares-client.git", - "reference": "d0c8d057b73cb48ff483c24982996a7d201ceeaa" + "reference": "a809913f1f484306c9219056b2aa31c19a711ece" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/uspdev/cadastros-auxiliares-client/zipball/d0c8d057b73cb48ff483c24982996a7d201ceeaa", - "reference": "d0c8d057b73cb48ff483c24982996a7d201ceeaa", + "url": "https://api.github.com/repos/uspdev/cadastros-auxiliares-client/zipball/a809913f1f484306c9219056b2aa31c19a711ece", + "reference": "a809913f1f484306c9219056b2aa31c19a711ece", "shasum": "" }, "require": { @@ -7097,22 +7111,22 @@ "description": "Laravel client for cadastros-auxiliares webservice endpoints", "support": { "issues": "https://github.com/uspdev/cadastros-auxiliares-client/issues", - "source": "https://github.com/uspdev/cadastros-auxiliares-client/tree/1.0.2" + "source": "https://github.com/uspdev/cadastros-auxiliares-client/tree/1.0.3" }, - "time": "2026-03-25T19:47:58+00:00" + "time": "2026-04-02T19:55:48+00:00" }, { "name": "uspdev/laravel-usp-theme", - "version": "2.8.27", + "version": "2.8.31", "source": { "type": "git", "url": "https://github.com/uspdev/laravel-usp-theme.git", - "reference": "75f09e02929d5588bd26f9ccad8f7b5300cb7162" + "reference": "b92895d08cd3caf36fc5e4b73cadcc424919ee10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/uspdev/laravel-usp-theme/zipball/75f09e02929d5588bd26f9ccad8f7b5300cb7162", - "reference": "75f09e02929d5588bd26f9ccad8f7b5300cb7162", + "url": "https://api.github.com/repos/uspdev/laravel-usp-theme/zipball/b92895d08cd3caf36fc5e4b73cadcc424919ee10", + "reference": "b92895d08cd3caf36fc5e4b73cadcc424919ee10", "shasum": "" }, "require": { @@ -7150,9 +7164,9 @@ "description": "usp theme for laravel", "support": { "issues": "https://github.com/uspdev/laravel-usp-theme/issues", - "source": "https://github.com/uspdev/laravel-usp-theme/tree/2.8.27" + "source": "https://github.com/uspdev/laravel-usp-theme/tree/2.8.31" }, - "time": "2026-03-27T14:35:42+00:00" + "time": "2026-06-03T19:05:14+00:00" }, { "name": "uspdev/senhaunica-socialite", @@ -7297,23 +7311,23 @@ }, { "name": "voku/portable-ascii", - "version": "2.0.3", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + "reference": "8e1051fe39379367aecf014f41744ce7539a856f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" }, "suggest": { "ext-intl": "Use Intl for transliterator_transliterate() support" @@ -7343,7 +7357,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + "source": "https://github.com/voku/portable-ascii/tree/2.1.1" }, "funding": [ { @@ -7367,7 +7381,7 @@ "type": "tidelift" } ], - "time": "2024-11-21T01:49:47+00:00" + "time": "2026-04-26T05:33:54+00:00" } ], "packages-dev": [ @@ -7556,18 +7570,92 @@ }, "time": "2025-04-30T06:54:44+00:00" }, + { + "name": "laravel/dusk", + "version": "v8.6.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/dusk.git", + "reference": "e7fd48762c6a82ad2cd311db07587aa2a97ce143" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/dusk/zipball/e7fd48762c6a82ad2cd311db07587aa2a97ce143", + "reference": "e7fd48762c6a82ad2cd311db07587aa2a97ce143", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-zip": "*", + "guzzlehttp/guzzle": "^7.5", + "illuminate/console": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "php": "^8.1", + "php-webdriver/webdriver": "^1.15.2", + "symfony/console": "^6.2|^7.0|^8.0", + "symfony/finder": "^6.2|^7.0|^8.0", + "symfony/process": "^6.2|^7.0|^8.0", + "vlucas/phpdotenv": "^5.2" + }, + "require-dev": { + "laravel/framework": "^10.0|^11.0|^12.0|^13.0", + "mockery/mockery": "^1.6", + "orchestra/testbench-core": "^8.19|^9.17|^10.8|^11.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.1|^11.0|^12.0.1", + "psy/psysh": "^0.11.12|^0.12", + "symfony/yaml": "^6.2|^7.0|^8.0" + }, + "suggest": { + "ext-pcntl": "Used to gracefully terminate Dusk when tests are running." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Dusk\\DuskServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Dusk\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Dusk provides simple end-to-end testing and browser automation.", + "keywords": [ + "laravel", + "testing", + "webdriver" + ], + "support": { + "issues": "https://github.com/laravel/dusk/issues", + "source": "https://github.com/laravel/dusk/tree/v8.6.0" + }, + "time": "2026-04-15T14:50:40+00:00" + }, { "name": "laravel/pail", - "version": "v1.2.6", + "version": "v1.2.7", "source": { "type": "git", "url": "https://github.com/laravel/pail.git", - "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf" + "reference": "2f7d27dada8effc48b8c424445a69cca7007daaa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pail/zipball/aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", - "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", + "url": "https://api.github.com/repos/laravel/pail/zipball/2f7d27dada8effc48b8c424445a69cca7007daaa", + "reference": "2f7d27dada8effc48b8c424445a69cca7007daaa", "shasum": "" }, "require": { @@ -7634,20 +7722,20 @@ "issues": "https://github.com/laravel/pail/issues", "source": "https://github.com/laravel/pail" }, - "time": "2026-02-09T13:44:54+00:00" + "time": "2026-05-20T22:24:57+00:00" }, { "name": "laravel/pint", - "version": "v1.29.0", + "version": "v1.29.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "bdec963f53172c5e36330f3a400604c69bf02d39" + "reference": "0770e9b7fafd50d4586881d456d6eb41c9247a80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/bdec963f53172c5e36330f3a400604c69bf02d39", - "reference": "bdec963f53172c5e36330f3a400604c69bf02d39", + "url": "https://api.github.com/repos/laravel/pint/zipball/0770e9b7fafd50d4586881d456d6eb41c9247a80", + "reference": "0770e9b7fafd50d4586881d456d6eb41c9247a80", "shasum": "" }, "require": { @@ -7658,14 +7746,14 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.94.2", - "illuminate/view": "^12.54.1", - "larastan/larastan": "^3.9.3", - "laravel-zero/framework": "^12.0.5", + "friendsofphp/php-cs-fixer": "^3.95.1", + "illuminate/view": "^12.56.0", + "larastan/larastan": "^3.9.6", + "laravel-zero/framework": "^12.1.0", "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^2.4.0", "pestphp/pest": "^3.8.6", - "shipfastlabs/agent-detector": "^1.1.0" + "shipfastlabs/agent-detector": "^1.1.3" }, "bin": [ "builds/pint" @@ -7702,20 +7790,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2026-03-12T15:51:39+00:00" + "time": "2026-04-20T15:26:14+00:00" }, { "name": "laravel/sail", - "version": "v1.56.0", + "version": "v1.62.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "f43426bb42a1cb7a51a3861d9138063e54766d28" + "reference": "3aaeefc979f8ba6586fbc5b6e0b1b3638058f98e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/f43426bb42a1cb7a51a3861d9138063e54766d28", - "reference": "f43426bb42a1cb7a51a3861d9138063e54766d28", + "url": "https://api.github.com/repos/laravel/sail/zipball/3aaeefc979f8ba6586fbc5b6e0b1b3638058f98e", + "reference": "3aaeefc979f8ba6586fbc5b6e0b1b3638058f98e", "shasum": "" }, "require": { @@ -7765,7 +7853,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2026-04-01T15:17:32+00:00" + "time": "2026-05-27T04:02:01+00:00" }, { "name": "mockery/mockery", @@ -7912,23 +8000,23 @@ }, { "name": "nunomaduro/collision", - "version": "v8.9.2", + "version": "v8.9.4", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "6eb16883e74fd725ac64dbe81544c961ab448ba5" + "reference": "716af8f95a470e9094cfca09ed897b023be191a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/6eb16883e74fd725ac64dbe81544c961ab448ba5", - "reference": "6eb16883e74fd725ac64dbe81544c961ab448ba5", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/716af8f95a470e9094cfca09ed897b023be191a5", + "reference": "716af8f95a470e9094cfca09ed897b023be191a5", "shasum": "" }, "require": { "filp/whoops": "^2.18.4", "nunomaduro/termwind": "^2.4.0", "php": "^8.2.0", - "symfony/console": "^7.4.8 || ^8.0.4" + "symfony/console": "^7.4.8 || ^8.0.8" }, "conflict": { "laravel/framework": "<11.48.0 || >=14.0.0", @@ -7936,12 +8024,12 @@ }, "require-dev": { "brianium/paratest": "^7.8.5", - "larastan/larastan": "^3.9.3", - "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.2.0", - "laravel/pint": "^1.29.0", - "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.0.0", + "larastan/larastan": "^3.9.6", + "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.5.0", + "laravel/pint": "^1.29.1", + "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.2.1", "pestphp/pest": "^3.8.5 || ^4.4.3 || ^5.0.0", - "sebastian/environment": "^7.2.1 || ^8.0.4 || ^9.0.0" + "sebastian/environment": "^7.2.1 || ^8.0.4 || ^9.3.0" }, "type": "library", "extra": { @@ -8004,7 +8092,7 @@ "type": "patreon" } ], - "time": "2026-03-31T21:51:27+00:00" + "time": "2026-04-21T14:04:20+00:00" }, { "name": "phar-io/manifest", @@ -8124,6 +8212,72 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "php-webdriver/webdriver", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/php-webdriver/php-webdriver.git", + "reference": "ac0662863aa120b4f645869f584013e4c4dba46a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/ac0662863aa120b4f645869f584013e4c4dba46a", + "reference": "ac0662863aa120b4f645869f584013e4c4dba46a", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-zip": "*", + "php": "^7.3 || ^8.0", + "symfony/polyfill-mbstring": "^1.12", + "symfony/process": "^5.0 || ^6.0 || ^7.0 || ^8.0" + }, + "replace": { + "facebook/webdriver": "*" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.20.0", + "ondram/ci-detector": "^4.0", + "php-coveralls/php-coveralls": "^2.4", + "php-mock/php-mock-phpunit": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "^9.3", + "squizlabs/php_codesniffer": "^3.5", + "symfony/var-dumper": "^5.0 || ^6.0 || ^7.0 || ^8.0" + }, + "suggest": { + "ext-simplexml": "For Firefox profile creation" + }, + "type": "library", + "autoload": { + "files": [ + "lib/Exception/TimeoutException.php" + ], + "psr-4": { + "Facebook\\WebDriver\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.", + "homepage": "https://github.com/php-webdriver/php-webdriver", + "keywords": [ + "Chromedriver", + "geckodriver", + "php", + "selenium", + "webdriver" + ], + "support": { + "issues": "https://github.com/php-webdriver/php-webdriver/issues", + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.16.0" + }, + "time": "2025-12-28T23:57:40+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "11.0.12", @@ -9621,27 +9775,28 @@ }, { "name": "symfony/yaml", - "version": "v8.0.8", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1" + "reference": "efb42bd2c6f4f3ccfd4683583449938b5fc146b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/54174ab48c0c0f9e21512b304be17f8150ccf8f1", - "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1", + "url": "https://api.github.com/repos/symfony/yaml/zipball/efb42bd2c6f4f3ccfd4683583449938b5fc146b0", + "reference": "efb42bd2c6f4f3ccfd4683583449938b5fc146b0", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/console": "<7.4" }, "require-dev": { - "symfony/console": "^7.4|^8.0" + "symfony/console": "^7.4|^8.0", + "yaml/yaml-test-suite": "*" }, "bin": [ "Resources/bin/yaml-lint" @@ -9672,7 +9827,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v8.0.8" + "source": "https://github.com/symfony/yaml/tree/v8.1.0" }, "funding": [ { @@ -9692,7 +9847,7 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "theseer/tokenizer", @@ -9754,5 +9909,5 @@ "php": "^8.2" }, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/config/laravel-usp-theme.php b/config/laravel-usp-theme.php index fa68f26..c9e5479 100644 --- a/config/laravel-usp-theme.php +++ b/config/laravel-usp-theme.php @@ -1,5 +1,31 @@ 'Imagens', + 'url' => '/dockerimages', + 'can' => 'user' + ], + [ + 'text' => 'Cadastrar nova imagem', + 'url' => '/dockerimages/create', + 'can' => 'user' + ] +]; + +$appsMenu = [ + [ + 'text' => 'Meus Apps', + 'url' => config('app.url') . '/webapps', + 'can' => 'user' + ], + [ + 'text' => 'Cadastrar App', + 'url' => config('app.url') . '/webapps/create', + 'can' => 'user' + ] +]; + $menu = [ [ 'text' => ' Home', @@ -10,15 +36,15 @@ 'key' => 'menu_dinamico', ], [ - 'text' => 'Meus Apps', - 'url' => config('app.url') . '/webapps', + 'text' => 'Apps', 'can' => 'user', + 'submenu' => $appsMenu ], [ - 'text' => 'Cadastrar App', - 'url' => config('app.url') . '/webapps/create', // com caminho absoluto + 'text' => 'Docker', 'can' => 'user', - ], + 'submenu' => $dockerMenu + ] ]; diff --git a/database/migrations/2026_04_02_152155_create_webapps_table.php b/database/migrations/2026_06_19_130007_create_apps_table.php similarity index 58% rename from database/migrations/2026_04_02_152155_create_webapps_table.php rename to database/migrations/2026_06_19_130007_create_apps_table.php index 62c1226..077573d 100644 --- a/database/migrations/2026_04_02_152155_create_webapps_table.php +++ b/database/migrations/2026_06_19_130007_create_apps_table.php @@ -11,20 +11,16 @@ */ public function up(): void { - Schema::create('webapps', function (Blueprint $table) { + Schema::create('apps', function (Blueprint $table) { $table->id(); + $table->string('name'); $table->string('dominio'); - $table->string('url_github')->nullable(); $table->string('justificativa'); $table->string('tipo'); $table->string('status')->default('Solicitado'); $table->foreignId('user_id')->constrained(); - $table->string('database_username')->nullable(); - $table->string('database_name')->nullable(); - $table->string('database_password')->nullable(); - $table->string('bucket_username')->nullable(); - $table->string('bucket_password')->nullable(); - $table->string('bucket_name')->nullable(); + $table->foreignId('image_id')->nullable(); + $table->string('stack')->nullable()->unique(); $table->string('version')->nullable(); $table->timestamps(); }); @@ -35,6 +31,6 @@ public function up(): void */ public function down(): void { - Schema::dropIfExists('webapps'); + Schema::dropIfExists('apps'); } }; diff --git a/database/migrations/2026_06_19_130014_create_images_table.php b/database/migrations/2026_06_19_130014_create_images_table.php new file mode 100644 index 0000000..b62e06c --- /dev/null +++ b/database/migrations/2026_06_19_130014_create_images_table.php @@ -0,0 +1,30 @@ +id(); + $table->string('name')->unique(); + $table->string('path'); + $table->string('tag'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('images'); + } +}; diff --git a/database/migrations/2026_06_19_130033_create_image_variables_table.php b/database/migrations/2026_06_19_130033_create_image_variables_table.php new file mode 100644 index 0000000..64b4471 --- /dev/null +++ b/database/migrations/2026_06_19_130033_create_image_variables_table.php @@ -0,0 +1,29 @@ +id(); + $table->foreignId('image_id')->constrained(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('image_variables'); + } +}; diff --git a/database/migrations/2026_06_19_130047_create_app_variables_table.php b/database/migrations/2026_06_19_130047_create_app_variables_table.php new file mode 100644 index 0000000..ea0b216 --- /dev/null +++ b/database/migrations/2026_06_19_130047_create_app_variables_table.php @@ -0,0 +1,30 @@ +id(); + $table->foreignId('app_id')->constrained(); + $table->foreignId('image_variable_id')->constrained(); + $table->string('value')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('app_variables'); + } +}; diff --git a/database/migrations/2026_06_25_133240_create_app_databases_table.php b/database/migrations/2026_06_25_133240_create_app_databases_table.php new file mode 100644 index 0000000..06630ce --- /dev/null +++ b/database/migrations/2026_06_25_133240_create_app_databases_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('app_id')->constrained(); + $table->string('name'); + $table->string('username'); + $table->string('password'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('app_databases'); + } +}; diff --git a/database/migrations/2026_06_25_133250_create_buckets_table.php b/database/migrations/2026_06_25_133250_create_buckets_table.php new file mode 100644 index 0000000..41724c7 --- /dev/null +++ b/database/migrations/2026_06_25_133250_create_buckets_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('app_id')->constrained(); + $table->string('name'); + $table->string('key'); + $table->string('secret'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('buckets'); + } +}; diff --git a/docker-compose.yml b/docker-compose.yml index 2267126..498b3c8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,10 +25,21 @@ services: MYSQL_ROOT_PASSWORD: webapps networks: - webapps-network + volumes: + - ./docker/db/init.sql:/docker-entrypoint-initdb.d/init.sql + + selenium: + image: selenium/standalone-chrome + container_name: webapps_selenium + ports: + - "7900:7900" # VNC (pra ver o browser rodando) + networks: + - webapps-network + shm_size: 2gb senhaunica-faker: image: uspdev/senhaunica-faker - container_name: cursolaravel_senhaunica-faker + container_name: webapps_senhaunica-faker ports: - "3141:3141" environment: @@ -38,15 +49,6 @@ services: aliases: - auth.local - selenium: - image: selenium/standalone-chrome - container_name: webapps_selenium - ports: - - "7900:7900" # VNC (pra ver o browser rodando) - networks: - - webapps-network - shm_size: 2gb - gwmariadb: image: ghcr.io/fflch/gwmariadb:latest container_name: webapps_gwmariadb @@ -57,27 +59,27 @@ services: environment: TOKEN: 123 DB_HOST: mariadb - DB_NAME: webapps - DB_USER: webapps - DB_PASS: webapps + DB_NAME: admin + DB_USER: admin + DB_PASS: admin DB_PORT: 3306 rustfs: - image: rustfs/rustfs:latest - container_name: webapps_rustfs - ports: - - "9100:9000" # API S3 (para enviar arquivos com PHP) - - "9101:9001" # Console Web - environment: - - RUSTFS_VOLUMES=/data - - RUSTFS_ADDRESS=0.0.0.0:9000 - - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001 - - RUSTFS_CONSOLE_ENABLE=true - # Defina aqui as chaves de acesso para a API e o Console - - RUSTFS_ACCESS_KEY=rustfsadmin - - RUSTFS_SECRET_KEY=rustfsadmin123 - networks: - - webapps-network + image: rustfs/rustfs:latest + container_name: webapps_rustfs + ports: + - "9100:9000" # API S3 (para enviar arquivos com PHP) + - "9101:9001" # Console Web + environment: + - RUSTFS_VOLUMES=/data + - RUSTFS_ADDRESS=0.0.0.0:9000 + - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001 + - RUSTFS_CONSOLE_ENABLE=true + # Defina aqui as chaves de acesso para a API e o Console + - RUSTFS_ACCESS_KEY=rustfsadmin + - RUSTFS_SECRET_KEY=rustfsadmin123 + networks: + - webapps-network networks: webapps-network: \ No newline at end of file diff --git a/docker/db/init.sql b/docker/db/init.sql new file mode 100644 index 0000000..eed4f13 --- /dev/null +++ b/docker/db/init.sql @@ -0,0 +1,3 @@ +CREATE USER 'admin'@'%' IDENTIFIED BY 'admin'; +GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; +FLUSH PRIVILEGES; \ No newline at end of file diff --git a/resources/views/dockerimages/create.blade.php b/resources/views/dockerimages/create.blade.php new file mode 100644 index 0000000..78b3137 --- /dev/null +++ b/resources/views/dockerimages/create.blade.php @@ -0,0 +1,27 @@ +@extends('laravel-usp-theme::master') +@section('content') +
+
+

Adicionar nova imagem:

+
+
+
+ @method('post') + @csrf +
+ Nome da imagem: + +
+
+ Imagem docker: + +
+
+ Versão imagem: + +
+ +
+
+
+@endsection diff --git a/resources/views/dockerimages/edit.blade.php b/resources/views/dockerimages/edit.blade.php new file mode 100644 index 0000000..c58618c --- /dev/null +++ b/resources/views/dockerimages/edit.blade.php @@ -0,0 +1,25 @@ +@extends('laravel-usp-theme::master') +@section('content') +
+
+

Atualize a imagem: {{ $docker_image->name }}

+
+
+
+ @method('patch') + @csrf +
+ Imagem docker: + +
+
+ Versão imagem: + +
+ +
+
+
+@endsection diff --git a/resources/views/dockerimages/index.blade.php b/resources/views/dockerimages/index.blade.php new file mode 100644 index 0000000..5b5cd59 --- /dev/null +++ b/resources/views/dockerimages/index.blade.php @@ -0,0 +1,16 @@ +@extends('laravel-usp-theme::master') +@section('content') +
+
+

Imagens docker:

+
+
+ +
+
+ +@endsection \ No newline at end of file diff --git a/resources/views/dockerimages/show.blade.php b/resources/views/dockerimages/show.blade.php new file mode 100644 index 0000000..f2c9f7c --- /dev/null +++ b/resources/views/dockerimages/show.blade.php @@ -0,0 +1,67 @@ +@extends('laravel-usp-theme::master') +@section('content') +
+
+

{{ $docker_image->name }}

+
+
+
+
+ @method('delete') + @csrf +

Nome da imagem: {{ $docker_image->name }}

+

Imagem docker: {{ $docker_image->path }}

+

Versão da imagem: {{ $docker_image->tag }}

+ + editar + +
+
+
+
+

Variáveis de ambiente da imagem:

+
+
+ + + + + + + + @if ($docker_image->imageVariables) + @foreach ($docker_image->imageVariables as $variable) + + + + @endforeach + @endif + +
Nome
+
+ @csrf + @method('delete') +

{{ $variable->name}}

+ +
+
+
+
+ @csrf + @method('post') +

Adicionar variável de ambiente

+
+ +
+
+ +
+
+
+
+
+
+
+@endsection diff --git a/resources/views/gwmariadb/edit.blade.php b/resources/views/gwmariadb/edit.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/webapps/dockerimage.blade.php b/resources/views/webapps/dockerimage.blade.php new file mode 100644 index 0000000..ece6ae6 --- /dev/null +++ b/resources/views/webapps/dockerimage.blade.php @@ -0,0 +1,35 @@ +@extends('laravel-usp-theme::master') +@section('content') +
+
+

{{ $webapp->dominio }}

+

Configurar docker:

+
+
+
+ @method('put') + @csrf +
+ +
+ +
+
+
+@endsection + +@section('javascripts_bottom') + +@endsection('javascripts_bottom') diff --git a/resources/views/webapps/editvariables.blade.php b/resources/views/webapps/editvariables.blade.php new file mode 100644 index 0000000..0322a6e --- /dev/null +++ b/resources/views/webapps/editvariables.blade.php @@ -0,0 +1,69 @@ +@extends('laravel-usp-theme::master') +@section('content') +
+
+

{{ $webapp->dominio }}

+

Configure as variáveis de ambiente da aplicação:

+
+
+
+ @if ($env_variables) + + + + + + + + + @foreach ($env_variables as $env_variable) + + + + + @endforeach + +
NomeValor
+ {{ $env_variable->imageVariable->name }} + +
+ @csrf + @method('put') +
+ +
+ +
+
+ @endif +
+
+
+@endsection + +@section('javascripts_bottom') + +@endsection('javascripts_bottom') diff --git a/resources/views/webapps/partials/form.blade.php b/resources/views/webapps/partials/form.blade.php index f21a958..0da8195 100644 --- a/resources/views/webapps/partials/form.blade.php +++ b/resources/views/webapps/partials/form.blade.php @@ -1,7 +1,11 @@
- +
+ + fflch.usp.br +
+
@@ -12,23 +16,17 @@ - -
- tipo) == 'drupal') checked @endif>Drupal + tipo) == 'drupal') checked @endif>Drupal
tipo) == 'outro_app') checked @endif>Outro app + @if (old('tipo', $webapp->tipo) == 'outro_app') checked @endif>Outro app
@@ -38,33 +36,9 @@ - -@section('javascripts_bottom') - -@endsection \ No newline at end of file + diff --git a/resources/views/webapps/show.blade.php b/resources/views/webapps/show.blade.php index 3c56859..82fcf1f 100644 --- a/resources/views/webapps/show.blade.php +++ b/resources/views/webapps/show.blade.php @@ -1,8 +1,7 @@ @extends('laravel-usp-theme::master') -@section("content") +@section('content') +

{{ $webapp->dominio }}

-

{{ $webapp->dominio }}

- Justificativa:

{{ $webapp->justificativa }}

Tipo de solicitação: @@ -10,24 +9,59 @@ @if ($webapp->url_github) Repositório Github:

{{ $webapp->url_github }} Tag: - {{ $webapp->version ?? 'não informado'}}

+ {{ $webapp->version ?? 'não informado' }}

@endif Status:

{{ $webapp->status }}

Solicitante:

{{ $webapp->user->name }}

-

Bancos de dados (Mônica) -
- Implementar: 1) Criar um banco de dados para o dominio, 2) Criar um usuário, 3) Criar uma senha para esse usuário e guardar localmente, 4) Conceder as permissões necessárias para o usuário acessar o banco de dados criado 5) Testar a conexão do app com o banco de dados criado. 6) opção de deletar o banco de dados + @switch($dockerStatus) + @case('not_configured') +

Cadastre a imagem docker antes de configurar banco de dados, bucket e publicar a aplicação.

+ Adicionar imagem docker + @break -

Configurar Bucket (Ricardo) - Implementar: 1) Criar um bucket para o dominio (ok), 2) Criar um usuário, 3) Criar uma senha para esse usuário e guardar localmente, 4) Conceder as permissões necessárias para o usuário acessar o bucket criado 5) Testar a conexão do app com o bucket criado. 6) opção de deletar o bucket - + @case('configured') +
+ Cirar bancos de dados + Ver banco de dados + Testar conexão +
+ Implementar: 1) Criar um banco de dados para o dominio, 2) Criar um usuário, 3) Criar uma senha para esse usuário e + guardar localmente, 4) Conceder as permissões necessárias para o usuário acessar o banco de dados criado 5) Testar a + conexão do app com o banco de dados criado. 6) opção de deletar o banco de dados +
+
+ Criar Bucket + Ver dados bucket + Excluir bucket +
+ Implementar: 1) Criar um bucket para o dominio (ok), 2) Criar um usuário, 3) Criar uma senha para esse usuário e + guardar localmente, 4) Conceder as permissões necessárias para o usuário acessar o bucket criado 5) Testar a conexão + do app com o bucket criado. 6) opção de deletar o bucket +
+
+ Alterar imagem docker + Configurar variáveis de + ambiente + @if ($webapp->status == 'Solicitado') + Publicar aplicação + @else + Atualizar aplicação + @endif +
+
+ Implementado: +
1- Model Variaveis +
2- Model Imagem +
3- Relacionamento entre imagem, variaveis e webapp +
4- Adição e atualização da imagem e das variaveis para o webapp +
5- Requisições para publicação do app no container e atualização do mesmo +
+
- -

Configurar Docker (Augusto) - Implementar: 1) Model para variavéis de ambiente, 2) Escolher a tag do deploy 3) Configurar o serviço para usar as variáveis de ambiente necessárias - -@endsection \ No newline at end of file + @default + @endswitch + @endsection diff --git a/routes/web.php b/routes/web.php index 86f8ad9..543b8e0 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,24 +1,70 @@ group(function() { + Route::get('/', [WebappController::class, 'index']); + Route::get('/create', [WebappController::class, 'create']); + Route::post('/store', [WebappController::class, 'store']); + Route::get('/{webapp}', [WebappController::class, 'show']); + Route::get('/{webapp}/dockerimage', EditWebappImageController::class); + Route::get('/{webapp}/variables', ShowWebappVariablesController::class); + Route::get('/{webapp}/database/store', [GwmariadbController::class, 'store']); + Route::get('/{webapp}/bucket/store', [BucketController::class, 'store']); + Route::put('/{webapp}/dockerimage', [WebappController::class, 'updateImage']); + Route::put('/{webapp}/variables/{variable}', UpdateWebappVariablesController::class); +}); +Route::prefix('dockerimages')->group(function() { + Route::get('/', [DockerImageController::class, 'index']); + Route::get('/create', [DockerImageController::class, 'create']); + Route::get('/{dockerimage}', [DockerImageController::class, 'show']); + Route::get('/{dockerimage}/edit', [DockerImageController::class, 'edit']); + Route::post('/', [DockerImageController::class, 'store']); + Route::post('/{dockerimage}/variables/store', [DockerImageController::class, 'storeImageVariable']); + Route::put('/{dockerimage}', [DockerImageController::class, 'update']); + Route::delete('/{dockerimage}', [DockerImageController::class, 'destroy']); +}); -# reunião -Route::get('/portainer', [ReuniaoController::class, 'portainer']); -Route::get('/gwmariadb', [ReuniaoController::class, 'gwmariadb']); -Route::get('/rustfs/{app}', [ReuniaoController::class, 'rustfs']); +Route::prefix('imagevariables')->group(function () { + Route::put('/{imagevariable}', [ImageVariableController::class, 'update']); + Route::delete('/{imagevariable}', [ImageVariableController::class, 'destroy']); +}); +Route::prefix('gwmariadb')->group(function () { + Route::get('/', [GwmariadbController::class, 'index']); + Route::get('/testconnection', TestGwmariadbConnectionController::class); + Route::get('/{appdatabase}', [GwmariadbController::class, 'show']); + Route::put('/{appdatabase}', [GwmariadbController::class, 'update']); + Route::delete('/{appdatabase}', [GwmariadbController::class, 'destroy']); +}); +Route::prefix('bucket')->group(function() { + Route::get('/test', TestConnectionBucketController::class); + Route::get('/{bucket}', [BucketController::class, 'show']); + Route::delete('/{bucket}', [BucketController::class, 'destroy']); +}); +Route::prefix('portainer')->group(function() { + Route::get('/', [PortainerController::class, 'index']); + Route::get('/{webapp}/store', [PortainerController::class, 'store']); + Route::get('/{webapp}/update', [PortainerController::class, 'update']); +}); \ No newline at end of file diff --git a/tests/Browser/ExampleTest.php b/tests/Browser/ExampleTest.php new file mode 100644 index 0000000..2d451fc --- /dev/null +++ b/tests/Browser/ExampleTest.php @@ -0,0 +1,21 @@ +browse(function (Browser $browser) { + $browser->visit('/') + ->assertSee('Laravel'); + }); + } +} diff --git a/tests/Browser/IndexTest.php b/tests/Browser/IndexTest.php new file mode 100644 index 0000000..c509e9a --- /dev/null +++ b/tests/Browser/IndexTest.php @@ -0,0 +1,21 @@ +browse(function (Browser $browser) { + $browser->visit('/') + ->assertSee('Webapps'); + }); + } +} diff --git a/tests/Browser/Pages/HomePage.php b/tests/Browser/Pages/HomePage.php new file mode 100644 index 0000000..45d9283 --- /dev/null +++ b/tests/Browser/Pages/HomePage.php @@ -0,0 +1,36 @@ + + */ + public function elements(): array + { + return [ + '@element' => '#selector', + ]; + } +} diff --git a/tests/Browser/Pages/Page.php b/tests/Browser/Pages/Page.php new file mode 100644 index 0000000..eb9a2de --- /dev/null +++ b/tests/Browser/Pages/Page.php @@ -0,0 +1,20 @@ + + */ + public static function siteElements(): array + { + return [ + '@element' => '#selector', + ]; + } +} diff --git a/tests/Browser/console/.gitignore b/tests/Browser/console/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/tests/Browser/console/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/tests/Browser/screenshots/.gitignore b/tests/Browser/screenshots/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/tests/Browser/screenshots/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/tests/Browser/source/.gitignore b/tests/Browser/source/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/tests/Browser/source/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/tests/DuskTestCase.php b/tests/DuskTestCase.php new file mode 100644 index 0000000..020699d --- /dev/null +++ b/tests/DuskTestCase.php @@ -0,0 +1,48 @@ +addArguments(collect([ + $this->shouldStartMaximized() ? '--start-maximized' : '--window-size=1920,1080', + '--disable-search-engine-choice-screen', + '--disable-smooth-scrolling', + ])->unless($this->hasHeadlessDisabled(), function (Collection $items) { + return $items->merge([ + '--disable-gpu', + '--headless=new', + ]); + })->all()); + + return RemoteWebDriver::create( + $_ENV['DUSK_DRIVER_URL'] ?? env('DUSK_DRIVER_URL') ?? 'http://localhost:9515', + DesiredCapabilities::chrome()->setCapability( + ChromeOptions::CAPABILITY, $options + ) + ); + } +}