Skip to content

feat: introduce core polydock architecture and API clients#185

Open
dan2k3k4 wants to merge 16 commits into
devfrom
pr/1-core-infrastructure
Open

feat: introduce core polydock architecture and API clients#185
dan2k3k4 wants to merge 16 commits into
devfrom
pr/1-core-infrastructure

Conversation

@dan2k3k4

@dan2k3k4 dan2k3k4 commented Jun 24, 2026

Copy link
Copy Markdown
Member

Greptile Summary

This PR internalises the Polydock architecture by moving app classes, core interfaces, and API clients from external packages (FreedomtechHosting/*, Amazeeio/*) into the application's own namespace, and ships a data migration to repoint existing polydock_store_apps records to the new class names.

  • All previously-flagged GraphQL injection points (deleteProjectByName, deployProjectEnvironmentByName, and build-variable interpolation) are fixed by switching to non-interpolated <<<'GQL' heredocs with typed variable maps, and the falsy-value validation bug in PolydockEngineBase is corrected to use === null || === ''.
  • The PolydockAppClassDiscovery::getClassMap() now scans app/Polydock/Apps/ directly instead of relying on Composer's classmap; Trait files are safely excluded because class_exists() returns false for them, and results are cached in-memory.
  • Two API clients coexist: a new Laravel-Http-based AmazeeAi\Client (used by service providers) and the Guzzle-based PrivateGpt\Client\AmazeeAiClient (used by the PrivateGPT app); deleteTeam in the Guzzle client has an unguarded $data['message'] access that throws a TypeError when the API returns an empty or non-JSON body.

Confidence Score: 4/5

Safe to merge with one small fix: deleteTeam in AmazeeAiClient can throw an unhandled TypeError when the API returns an empty or non-JSON body; everything else looks correct.

The core architecture changes are well-structured and fix several previously-flagged bugs. The one remaining defect is in AmazeeAiClient::deleteTeam, which accesses $data['message'] unconditionally — a DELETE endpoint that responds with 204 No Content would trigger an unhandled TypeError on every call. This path is reachable during normal provisioning teardown.

app/Polydock/Apps/PrivateGpt/Client/AmazeeAiClient.php — the deleteTeam method needs a null-safe access on the message key

Important Files Changed

Filename Overview
app/Polydock/Apps/PrivateGpt/Client/AmazeeAiClient.php deleteTeam accesses $data['message'] without null-safety; if the API returns a non-JSON or empty body, this throws an unhandled TypeError in PHP 8+
app/Polydock/Clients/AmazeeAi/Client.php New Laravel HTTP client wrapper for AmazeeAi backend; uses echo for debug output instead of a structured logger
database/migrations/2026_06_23_205000_migrate_polydock_app_classes.php Class-name migration from external packages to internal namespace; up/down wrapped in transactions with column-existence guards, looks correct
app/Polydock/Core/PolydockEngineBase.php Fixed falsy-value validation bug — now checks for null or empty string instead of truthiness, resolving the previously-flagged issue
app/Services/PolydockAppClassDiscovery.php Replaced Composer ClassLoader classmap with a direct filesystem scan of app/Polydock/Apps/; trait files are safely skipped by class_exists(), and results are cached in-memory
app/PolydockEngine/Engine.php Core engine now references internal namespace classes; adds pushProjectMetadata helper and Lagoon runtime defaults backfill, looks correct

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant Job as ProcessPolydockAppInstanceJob
    participant Engine as PolydockEngine
    participant App as PolydockApp (Generic/AmazeeClaw/PrivateGPT)
    participant LagoonClient as Lagoon\Client
    participant AmazeeAiClient as AmazeeAi\Client (new)
    participant GuzzleClient as PrivateGpt\AmazeeAiClient (Guzzle)

    Job->>Engine: processPolydockAppInstance(appInstance)
    Engine->>Engine: validateAppInstanceHasAllRequiredVariables()
    Engine->>App: preCreateAppInstance / createAppInstance / ...
    App->>LagoonClient: Lagoon GraphQL operations (non-interpolated heredocs)
    App->>AmazeeAiClient: HTTP via Laravel Http facade
    App->>GuzzleClient: HTTP via Guzzle (PrivateGPT only)
    Engine->>Engine: pushProjectMetadata(appInstance)
    Engine->>LagoonClient: updateProjectMetadata()
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant Job as ProcessPolydockAppInstanceJob
    participant Engine as PolydockEngine
    participant App as PolydockApp (Generic/AmazeeClaw/PrivateGPT)
    participant LagoonClient as Lagoon\Client
    participant AmazeeAiClient as AmazeeAi\Client (new)
    participant GuzzleClient as PrivateGpt\AmazeeAiClient (Guzzle)

    Job->>Engine: processPolydockAppInstance(appInstance)
    Engine->>Engine: validateAppInstanceHasAllRequiredVariables()
    Engine->>App: preCreateAppInstance / createAppInstance / ...
    App->>LagoonClient: Lagoon GraphQL operations (non-interpolated heredocs)
    App->>AmazeeAiClient: HTTP via Laravel Http facade
    App->>GuzzleClient: HTTP via Guzzle (PrivateGPT only)
    Engine->>Engine: pushProjectMetadata(appInstance)
    Engine->>LagoonClient: updateProjectMetadata()
Loading

Reviews (5): Last reviewed commit: "refactor(privategpt): resolve exception ..." | Re-trigger Greptile

Greptile also left 1 inline comment on this PR.

Comment thread app/Polydock/Clients/Lagoon/ClientTraits/ProjectTrait.php
Comment thread app/Polydock/Core/PolydockEngineBase.php
Comment thread app/Polydock/Clients/Lagoon/ClientTraits/AuthTrait.php Outdated
Comment thread app/Polydock/Clients/Lagoon/Client.php Outdated
@dan2k3k4 dan2k3k4 force-pushed the pr/1-core-infrastructure branch from bb15074 to 7410161 Compare June 24, 2026 10:14

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR inlines the core Polydock architecture (engine/app base, interfaces, enums, loggers, clients) into the repository under the App\Polydock\* namespace, updates the application/test code to use the new local namespaces, and adds a DB migration to rewrite stored app class FQCNs.

Changes:

  • Migrate imports across the codebase from FreedomtechHosting/* Polydock/Lagoon packages to in-repo App\Polydock\* classes.
  • Add in-repo Lagoon client + SSH wrapper and introduce many app lifecycle traits (create/deploy/claim/remove/upgrade).
  • Add a migration to rewrite persisted app class names to the new local namespaces.

Reviewed changes

Copilot reviewed 167 out of 176 changed files in this pull request and generated 14 comments.

Show a summary per file
File Description
tests/Unit/Services/PolydockAppClassDiscoveryTest.php Update discovery test imports/expected namespace label.
tests/Unit/PolydockEngine/PolydockEngineTest.php Update engine unit test imports; adjust required-variable tests.
tests/Unit/Models/PolydockAppInstanceTest.php Update enum/app imports to local Polydock namespace.
tests/Feature/Security/OneTimeLoginRouteSecurityTest.php Update enum import and stored app_type FQCN string.
tests/Feature/Jobs/StaleLifecycleJobTest.php Update enum/app imports to local Polydock namespace.
tests/Feature/GeneralApplicationTest.php Update imports to local Polydock apps/enums.
tests/Feature/Controllers/FormControllerTest.php Convert tests to PHPUnit #[Test] attributes.
tests/Feature/Controllers/Api/RegisterControllerTest.php Convert tests to PHPUnit #[Test] attributes.
tests/Feature/Console/Commands/TriggerLagoonDeployOnAppInstancesTest.php Update Lagoon client + enum imports.
tests/Feature/Console/Commands/SyncLagoonMetadataTest.php Update Lagoon client + enum imports.
tests/Feature/Console/Commands/RunLagoonCommandOnAppInstancesTest.php Update Lagoon client + enum imports.
tests/Feature/Console/Commands/RemoveEmptyProjectsCommandTest.php Update Lagoon client + enum imports.
tests/Feature/Console/Commands/RemoveAppInstancesTest.php Update enum import.
tests/Feature/Console/Commands/MarkStuckInstancesFailedCommandTest.php Update enum import.
tests/Feature/Console/Commands/BanEmailsCommandTest.php Update enum import.
tests/Feature/Audit/ModelActivityLogTest.php Update enum import.
tests/Feature/Audit/ApiAuditTest.php Update enum import.
tests/Feature/Api/InstanceHealthApiTest.php Update enum/app imports.
tests/Feature/Api/AuthenticatedApiTest.php Update enum import and seeded polydock_app_class FQCN string.
tests/Doubles/BaseTestPolydockServiceProvider.php Update service provider interface/logger imports.
database/seeders/LocalstackSeeder.php Update seeded Polydock app import.
database/seeders/DatabaseSeeder.php Update seeded Polydock app imports.
database/seeders/AmazeeTrialSeeder.php Update seeded Polydock AI app import.
database/migrations/2026_06_23_205000_migrate_polydock_app_classes.php New migration to remap persisted app class names.
database/migrations/2026_06_13_000001_add_purge_statuses_to_polydock_app_instances_table.php Update enum import to local namespace.
database/migrations/2026_05_27_000001_add_purge_fields_to_polydock_app_instances_table.php Update enum import to local namespace.
database/migrations/2025_03_15_000007_add_new_statuses_to_polydock_app_instances_table.php Update enum import to local namespace.
database/migrations/2025_03_14_000002_create_polydock_app_instances_table.php Update enum import to local namespace.
database/factories/PolydockStoreAppFactory.php Update factory Polydock AI app import.
composer.json Add spatie/ssh dependency.
app/Services/PolydockAppClassDiscovery.php Switch discovery source to filesystem scan under app/Polydock/Apps.
app/Services/LagoonProjectPurgeService.php Update Lagoon client/logger imports.
app/Services/LagoonClientService.php Update Lagoon client + SSH imports.
app/PolydockServiceProviders/PolydockServiceProviderFTLagoon.php Update Lagoon provider imports to local clients/core interfaces.
app/PolydockServiceProviders/PolydockServiceProviderAmazeeAiBackend.php Update AmazeeAI backend provider imports to local client/core interfaces.
app/PolydockEngine/Traits/PolydockEngineFunctionCallerTrait.php Update enums/exceptions imports to local core.
app/PolydockEngine/PolydockLogger.php Update logger interface import to local core.
app/PolydockEngine/Engine.php Migrate engine to local core types and required-variable validation semantics.
app/Polydock/Core/Traits/PolydockAppLoggerTrait.php New shared logger trait for engine/apps.
app/Polydock/Core/Traits/PolydockAppFundamentalsTrait.php New fundamentals getters/setters trait.
app/Polydock/Core/Traits/PolydockAppConfigurationTrait.php New configuration state trait.
app/Polydock/Core/PolydockServiceProviderInterface.php New local Polydock service provider interface.
app/Polydock/Core/PolydockEngineInterface.php New local engine interface.
app/Polydock/Core/PolydockEngineBase.php New local engine base class.
app/Polydock/Core/PolydockAppVariableDefinitionInterface.php New local variable definition interface.
app/Polydock/Core/PolydockAppVariableDefinitionBase.php New local variable definition base implementation.
app/Polydock/Core/PolydockAppValidationException.php New local app validation exception type.
app/Polydock/Core/PolydockAppLoggerInterface.php New local logger interface.
app/Polydock/Core/PolydockAppInstanceStatusFlowException.php New local status flow exception type.
app/Polydock/Core/Loggers/PolydockAppEchoLogger.php New echo logger implementation.
app/Polydock/Core/Loggers/PolydockAppCacheLogger.php New cache logger implementation.
app/Polydock/Core/Exceptions/PolydockEngineValidationException.php New engine validation exception type.
app/Polydock/Core/Exceptions/PolydockEngineProcessPolydockAppInstanceException.php New engine processing exception type.
app/Polydock/Core/Contracts/HasStoreAppFormFields.php New contract for store-app Filament fields.
app/Polydock/Core/Contracts/HasAppInstanceFormFields.php New contract for instance Filament fields.
app/Polydock/Core/Attributes/PolydockAppTitle.php New attribute for app labels.
app/Polydock/Core/Attributes/PolydockAppStoreFields.php New attribute for store-app schema methods and prefix.
app/Polydock/Core/Attributes/PolydockAppInstanceFields.php New attribute for app-instance schema methods and prefix.
app/Polydock/Clients/Lagoon/Ssh.php New Lagoon SSH wrapper around spatie/ssh.
app/Polydock/Clients/Lagoon/LagoonVariableScopeInvalidException.php New Lagoon client exception type.
app/Polydock/Clients/Lagoon/LagoonClientTokenRequiredToInitializeException.php New Lagoon client exception type.
app/Polydock/Clients/Lagoon/LagoonClientPrivateKeyNotFoundException.php New Lagoon client exception type.
app/Polydock/Clients/Lagoon/LagoonClientInitializeRequiredToInteractException.php New Lagoon client exception type.
app/Polydock/Clients/Lagoon/GraphQLResponse.php New GraphQL response wrapper.
app/Polydock/Clients/Lagoon/GraphQLClient.php New GraphQL HTTP client wrapper.
app/Polydock/Clients/Lagoon/Enums/LagoonVariableScope.php New Lagoon variable-scope enum.
app/Polydock/Clients/Lagoon/ClientTraits/OrganizationTrait.php New Lagoon org operations trait.
app/Polydock/Clients/Lagoon/ClientTraits/GroupTrait.php New Lagoon group operations trait.
app/Polydock/Clients/Lagoon/ClientTraits/AuthTrait.php New Lagoon auth operations trait.
app/Polydock/Clients/Lagoon/Client.php New composed Lagoon client using traits.
app/Polydock/Clients/AmazeeAi/Exception/HttpException.php New HTTP exception type for AmazeeAI client.
app/Polydock/Apps/PrivateGpt/Traits/UsesAmazeeAiDevmode.php New devmode override wrapper for AmazeeAI operations.
app/Polydock/Apps/PrivateGpt/Traits/Create/PreCreateAppInstanceTrait.php New PrivateGpt pre-create stage implementation.
app/Polydock/Apps/PrivateGpt/Traits/Create/CreateAppInstanceTrait.php New PrivateGpt create stage implementation.
app/Polydock/Apps/PrivateGpt/Interfaces/LoggerInterface.php New PrivateGpt logger abstraction.
app/Polydock/Apps/PrivateGpt/Interfaces/LagoonOperationsInterface.php New PrivateGpt Lagoon ops abstraction.
app/Polydock/Apps/PrivateGpt/Interfaces/LagoonClientProviderInterface.php New PrivateGpt provider interface for Lagoon client.
app/Polydock/Apps/PrivateGpt/Interfaces/AmazeeAiOperationsInterface.php New PrivateGpt AmazeeAI ops abstraction.
app/Polydock/Apps/PrivateGpt/Generated/Routemap/Routemapper.php New generated routing helper.
app/Polydock/Apps/PrivateGpt/Generated/Dto/VdbKeysResponse.php New generated DTO.
app/Polydock/Apps/PrivateGpt/Generated/Dto/TeamResponse.php New generated DTO.
app/Polydock/Apps/PrivateGpt/Generated/Dto/RegionResponse.php New generated DTO.
app/Polydock/Apps/PrivateGpt/Generated/Dto/LlmKeysResponse.php New generated DTO.
app/Polydock/Apps/PrivateGpt/Generated/Dto/HealthResponse.php New generated DTO.
app/Polydock/Apps/PrivateGpt/Generated/Dto/APIToken.php New generated DTO.
app/Polydock/Apps/PrivateGpt/Generated/Dto/AdministratorResponse.php New generated DTO.
app/Polydock/Apps/PrivateGpt/Exceptions/AmazeeAiValidationException.php New mapping/validation exception.
app/Polydock/Apps/PrivateGpt/Exceptions/AmazeeAiClientException.php New base exception type.
app/Polydock/Apps/Generic/Traits/Upgrade/UpgradeAppInstanceTrait.php New generic upgrade stage logic.
app/Polydock/Apps/Generic/Traits/Upgrade/PreUpgradeAppInstanceTrait.php New generic pre-upgrade stage logic.
app/Polydock/Apps/Generic/Traits/Upgrade/PostUpgradeAppInstanceTrait.php New generic post-upgrade stage logic.
app/Polydock/Apps/Generic/Traits/Upgrade/PollUpgradeProgressAppInstanceTrait.php New generic upgrade polling stub.
app/Polydock/Apps/Generic/Traits/Remove/RemoveAppInstanceTrait.php New generic remove stage logic.
app/Polydock/Apps/Generic/Traits/Remove/PreRemoveAppInstanceTrait.php New generic pre-remove stage logic.
app/Polydock/Apps/Generic/Traits/Remove/PostRemoveAppInstanceTrait.php New generic post-remove stage logic.
app/Polydock/Apps/Generic/Traits/Health/PollHealthProgressAppInstanceTrait.php New generic health polling stub.
app/Polydock/Apps/Generic/Traits/Deploy/PreDeployAppInstanceTrait.php New generic pre-deploy stage logic.
app/Polydock/Apps/Generic/Traits/Deploy/PostDeployAppInstanceTrait.php New generic post-deploy stage logic.
app/Polydock/Apps/Generic/Traits/Deploy/PollDeployProgressAppInstanceTrait.php New generic deploy polling implementation.
app/Polydock/Apps/Generic/Traits/Deploy/DeployAppInstanceTrait.php New generic deploy stage logic.
app/Polydock/Apps/Generic/Traits/Create/PreCreateAppInstanceTrait.php New generic pre-create stage logic.
app/Polydock/Apps/Generic/Traits/Create/CreateAppInstanceTrait.php New generic create stage logic.
app/Polydock/Apps/Generic/Traits/Claim/ClaimAppInstanceTrait.php New generic claim stage logic and route fallback.
app/Polydock/Apps/Generic/PolydockAiApp.php New generic AI app base.
app/Polydock/Apps/DependencyTrack/Traits/Create/PreCreateAppInstanceTrait.php New DependencyTrack pre-create stage logic.
app/Polydock/Apps/DependencyTrack/Traits/Create/PostCreateAppInstanceTrait.php New DependencyTrack post-create stage logic.
app/Polydock/Apps/DependencyTrack/PolydockDependencyTrackApp.php New DependencyTrack app implementation.
app/Polydock/Apps/AmazeeClaw/Traits/Create/PreCreateAppInstanceTrait.php New AmazeeClaw pre-create stage logic.
app/Polydock/Apps/AmazeeClaw/Traits/Create/PostCreateAppInstanceTrait.php New AmazeeClaw post-create stage logic.
app/Polydock/Apps/AmazeeClaw/Traits/Claim/ClaimAppInstanceTrait.php New AmazeeClaw claim stage logic.
app/Polydock/Apps/AmazeeClaw/PolydockAmazeeClawAiApp.php New AmazeeClaw app implementation.
app/Models/UserGroup.php Update enum import.
app/Models/PolydockStoreApp.php Update enum import.
app/Models/PolydockAppInstance.php Update core Polydock imports to local namespace.
app/Listeners/ProcessPolydockAppInstanceStatusChange.php Update enum import.
app/Jobs/ProcessUserRemoteRegistration.php Update attribute import.
app/Jobs/ProcessPolydockAppInstanceJobs/Trial/ProcessTrialCompleteStageRemovalJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Remove/RemoveJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Remove/PreRemoveJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Remove/PostRemoveJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Purge/ProcessProjectPurgeJob.php Update enums/exceptions imports.
app/Jobs/ProcessPolydockAppInstanceJobs/ProgressToNextStageJob.php Update enums/exceptions imports.
app/Jobs/ProcessPolydockAppInstanceJobs/New/ProcessNewJob.php Update enums/exceptions imports.
app/Jobs/ProcessPolydockAppInstanceJobs/Deploy/PreDeployJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Deploy/PostDeployJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Deploy/PollDeploymentJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Deploy/DeployJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Create/PreCreateJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Create/PostCreateJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Create/CreateJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/Claim/ClaimJob.php Update enum import.
app/Jobs/ProcessPolydockAppInstanceJobs/BaseJob.php Update enums/exceptions imports.
app/Jobs/EnsureUnallocatedAppInstancesJob.php Update enum import.
app/Http/Controllers/Api/PolydockInstanceHealthController.php Update enum import.
app/Http/Controllers/Api/AuthenticatedApiController.php Update enum import.
app/Filament/Admin/Resources/UserGroupResource/RelationManagers/AppInstancesRelationManager.php Update enum import.
app/Filament/Admin/Resources/PolydockStoreAppResource/RelationManagers/PreWarmInstancesRelationManager.php Update enum import.
app/Filament/Admin/Resources/PolydockStoreAppResource/Pages/EditPolydockStoreApp.php Update store-fields attribute import.
app/Filament/Admin/Resources/PolydockStoreAppResource/Pages/CreatePolydockStoreApp.php Update store-fields attribute import.
app/Filament/Admin/Resources/PolydockStoreAppResource.php Update enum import.
app/Filament/Admin/Resources/PolydockAppInstanceResource/Pages/ViewPolydockAppInstance.php Update enum import.
app/Filament/Admin/Resources/PolydockAppInstanceResource/Pages/ListPolydockAppInstances.php Update enum import.
app/Filament/Admin/Resources/PolydockAppInstanceResource/Pages/CreatePolydockAppInstance.php Update instance-fields attribute import.
app/Filament/Admin/Resources/PolydockAppInstanceResource.php Update instance-fields attribute + enum imports.
app/Events/PolydockAppInstanceStatusChanged.php Update enum import.
app/Console/Commands/TriggerLagoonDeployOnAppInstances.php Update Lagoon client import.
app/Console/Commands/TriggerLagoonDeployOnAppInstance.php Update Lagoon client import.
app/Console/Commands/SyncLagoonMetadata.php Update enum import.
app/Console/Commands/RunLagoonCommandOnAppInstances.php Update Lagoon client import.
app/Console/Commands/RemoveUnclaimedAppInstancesCommand.php Update enum import.
app/Console/Commands/RemoveEmptyProjectsCommand.php Update enums/logger imports.
app/Console/Commands/RemoveAppInstances.php Update enum import.
app/Console/Commands/PollDeploymentStatusCommand.php Update enum import.
app/Console/Commands/MarkStuckInstancesFailedCommand.php Update enum import.
app/Console/Commands/ListUnclaimedAppInstancesCommand.php Update enum import.
app/Console/Commands/DispatchTrialCompleteStageRemovalJobsCommand.php Update enum import.
app/Console/Commands/DispatchProjectPurgeJobsCommand.php Update enum import.
app/Console/Commands/BanEmailsCommand.php Update enum import.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread tests/Unit/PolydockEngine/PolydockEngineTest.php Outdated
Comment thread app/Polydock/Apps/Generic/Traits/Create/CreateAppInstanceTrait.php Outdated
Comment thread app/Polydock/Apps/Generic/Traits/Create/CreateAppInstanceTrait.php Outdated
Comment thread app/Polydock/Apps/Generic/Traits/Deploy/DeployAppInstanceTrait.php Outdated
Comment thread app/Polydock/Apps/Generic/Traits/Deploy/DeployAppInstanceTrait.php Outdated
Comment on lines +20 to +24
public function validateAppInstanceHasAllRequiredVariables(PolydockAppInstanceInterface $appInstance): bool
{
foreach ($appInstance->getApp()->getVariableDefinitions() as $variableDefinition) {
if ($appInstance->getKeyValue($variableDefinition->getName()) === null) {
throw new PolydockEngineValidationException(
Comment thread app/Polydock/Core/PolydockAppVariableDefinitionBase.php
Comment thread app/Polydock/Clients/Lagoon/Ssh.php
@dan2k3k4 dan2k3k4 force-pushed the pr/1-core-infrastructure branch from 3d558cc to 8286cfc Compare June 24, 2026 21:32
Comment thread app/Polydock/Apps/PrivateGpt/Client/AmazeeAiClient.php
@dan2k3k4 dan2k3k4 force-pushed the pr/1-core-infrastructure branch from 8286cfc to d8bd130 Compare June 24, 2026 21:44
Comment on lines +102 to +104
$data = json_decode($response->getBody()->getContents(), true);

return $data['message'];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 deleteTeam accesses $data['message'] without guarding against a null or missing key. When the API returns an empty body (e.g. a 204 No Content) or invalid JSON, json_decode() returns null, making $data['message'] evaluate to null. In PHP 8.0+ this causes an unhandled TypeError ("must be of type string, null returned") that escapes the catch block entirely, since only GuzzleException|RequestException is caught there.

Suggested change
$data = json_decode($response->getBody()->getContents(), true);
return $data['message'];
$data = json_decode($response->getBody()->getContents(), true);
return $data['message'] ?? '';

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants