diff --git a/app/Http/Controllers/Api/Domains.php b/app/Http/Controllers/Api/Domains.php index c27ddf620..86ff0cccc 100644 --- a/app/Http/Controllers/Api/Domains.php +++ b/app/Http/Controllers/Api/Domains.php @@ -3,9 +3,11 @@ namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; +use App\Models\Application; use App\Models\InstanceSettings; use App\Models\Project as ModelsProject; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Validator; class Domains extends Controller { @@ -15,6 +17,15 @@ class Domains extends Controller if (is_null($teamId)) { return invalid_token(); } + $uuid = $request->query->get('uuid'); + if ($uuid) { + $domains = Application::getDomainsByUuid($uuid); + + return response()->json([ + 'uuid' => $uuid, + 'domains' => $domains, + ]); + } $projects = ModelsProject::where('team_id', $teamId)->get(); $domains = collect(); $applications = $projects->pluck('applications')->flatten(); @@ -101,4 +112,93 @@ class Domains extends Controller return response()->json($domains); } + + public function updateDomains(Request $request) + { + $teamId = get_team_id_from_token(); + if (is_null($teamId)) { + return invalid_token(); + } + $validator = Validator::make($request->all(), [ + 'uuid' => 'required|string|exists:applications,uuid', + 'domains' => 'required|array', + 'domains.*' => 'required|string|distinct', + ]); + + if ($validator->fails()) { + return response()->json([ + 'success' => false, + 'message' => 'Validation failed', + 'errors' => $validator->errors(), + ], 422); + } + + $application = Application::where('uuid', $request->uuid)->first(); + + if (! $application) { + return response()->json([ + 'success' => false, + 'message' => 'Application not found', + ], 404); + } + + $existingDomains = explode(',', $application->fqdn); + $newDomains = $request->domains; + $filteredNewDomains = array_filter($newDomains, function ($domain) use ($existingDomains) { + return ! in_array($domain, $existingDomains); + }); + $mergedDomains = array_unique(array_merge($existingDomains, $filteredNewDomains)); + $application->fqdn = implode(',', $mergedDomains); + $application->custom_labels = base64_encode(implode("\n ", generateLabelsApplication($application))); + $application->save(); + + return response()->json([ + 'success' => true, + 'message' => 'Domains updated successfully', + 'application' => $application, + ]); + } + + public function deleteDomains(Request $request) + { + $teamId = get_team_id_from_token(); + if (is_null($teamId)) { + return invalid_token(); + } + $validator = Validator::make($request->all(), [ + 'uuid' => 'required|string|exists:applications,uuid', + 'domains' => 'required|array', + 'domains.*' => 'required|string|distinct', + ]); + + if ($validator->fails()) { + return response()->json([ + 'success' => false, + 'message' => 'Validation failed', + 'errors' => $validator->errors(), + ], 422); + } + + $application = Application::where('uuid', $request->uuid)->first(); + + if (! $application) { + return response()->json([ + 'success' => false, + 'message' => 'Application not found', + ], 404); + } + + $existingDomains = explode(',', $application->fqdn); + $domainsToDelete = $request->domains; + $updatedDomains = array_diff($existingDomains, $domainsToDelete); + $application->fqdn = implode(',', $updatedDomains); + $application->custom_labels = base64_encode(implode("\n ", generateLabelsApplication($application))); + $application->save(); + + return response()->json([ + 'success' => true, + 'message' => 'Domains updated successfully', + 'application' => $application, + ]); + } } diff --git a/app/Models/Application.php b/app/Models/Application.php index 8113f5ec9..fdb8796ef 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -1168,6 +1168,15 @@ class Application extends BaseModel return $preview; } + public static function getDomainsByUuid(string $uuid): array + { + $application = self::where('uuid', $uuid)->first(); + + if ($application) { + return $application->fqdns; + } + + return []; public function getMetrics(int $mins = 5) { $server = $this->destination->server; diff --git a/routes/api.php b/routes/api.php index e5abaf86d..a2f8109cb 100644 --- a/routes/api.php +++ b/routes/api.php @@ -39,7 +39,8 @@ Route::group([ Route::get('/resources', [Resources::class, 'resources']); Route::get('/domains', [Domains::class, 'domains']); - + Route::put('/domains', [Domains::class, 'updateDomains']); + Route::delete('/domains', [Domains::class, 'deleteDomains']); Route::get('/teams', [Team::class, 'teams']); Route::get('/team/current', [Team::class, 'current_team']); Route::get('/team/current/members', [Team::class, 'current_team_members']);