From f4414a931e5154398c7d6db385c4e1b3c717e40d Mon Sep 17 00:00:00 2001 From: Saeed Vaziry <61919774+saeedvaziry@users.noreply.github.com> Date: Wed, 25 Jun 2025 21:50:07 +0200 Subject: [PATCH] add custom path to site env (#629) --- app/Actions/Site/UpdateEnv.php | 5 ++++- app/Http/Middleware/HandleInertiaRequests.php | 11 ++++++++--- resources/js/components/app-header.tsx | 2 +- resources/js/pages/application/components/env.tsx | 13 ++++++++++++- resources/js/types/site.d.ts | 1 + tests/Feature/API/SitesTest.php | 1 + tests/Feature/ApplicationTest.php | 5 +++++ 7 files changed, 32 insertions(+), 6 deletions(-) diff --git a/app/Actions/Site/UpdateEnv.php b/app/Actions/Site/UpdateEnv.php index 1219d6a9..b3aa1a01 100644 --- a/app/Actions/Site/UpdateEnv.php +++ b/app/Actions/Site/UpdateEnv.php @@ -17,12 +17,15 @@ public function update(Site $site, array $input): void { Validator::make($input, [ 'env' => ['required', 'string'], + 'path' => ['required', 'string'], ])->validate(); $site->server->os()->write( - $site->path.'/.env', + $input['path'], trim((string) $input['env']), $site->user, ); + + $site->jsonUpdate('type_data', 'env_path', $input['path']); } } diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 4ede1db0..c8407338 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -55,12 +55,17 @@ public function share(Request $request): array $data = []; if ($request->route('server')) { - $data['server'] = ServerResource::make($request->route('server')); + /** @var Server $server */ + $server = $request->route('server'); + if ($user && $user->can('view', $server) && $user->current_project_id !== $server->project_id) { + $user->current_project_id = $server->project_id; + $user->save(); + } + + $data['server'] = ServerResource::make($server); // sites $sites = []; - /** @var Server $server */ - $server = $request->route('server'); if ($user && $user->can('viewAny', [Site::class, $server])) { $sites = SiteResource::collection($server->sites); } diff --git a/resources/js/components/app-header.tsx b/resources/js/components/app-header.tsx index e57a70a8..027c773d 100644 --- a/resources/js/components/app-header.tsx +++ b/resources/js/components/app-header.tsx @@ -19,7 +19,7 @@ export function AppHeader() { - {page.props.server && ( + {page.props.server && page.props.server.services['webserver'] && ( <> diff --git a/resources/js/pages/application/components/env.tsx b/resources/js/pages/application/components/env.tsx index 28a60793..0be68689 100644 --- a/resources/js/pages/application/components/env.tsx +++ b/resources/js/pages/application/components/env.tsx @@ -11,14 +11,17 @@ import { LoaderCircleIcon } from 'lucide-react'; import { registerDotEnvLanguage } from '@/lib/editor'; import { Site } from '@/types/site'; import { useAppearance } from '@/hooks/use-appearance'; +import { Input } from '@/components/ui/input'; export default function Env({ site, children }: { site: Site; children: ReactNode }) { const { getActualAppearance } = useAppearance(); const [open, setOpen] = useState(false); const form = useForm<{ env: string; + path: string; }>({ env: '', + path: site.type_data.env_path || `${site.path}/.env`, }); const submit = (e: FormEvent) => { @@ -55,7 +58,15 @@ export default function Env({ site, children }: { site: Site; children: ReactNod {children} - Edit .env + + form.setData('path', e.target.value)} + autoFocus={false} + className="max-w-[80%]" + /> + Edit .env file
diff --git a/resources/js/types/site.d.ts b/resources/js/types/site.d.ts index f77422cf..d4b76fda 100644 --- a/resources/js/types/site.d.ts +++ b/resources/js/types/site.d.ts @@ -9,6 +9,7 @@ export interface Site { type: string; type_data: { method?: 'round-robin' | 'least-connections' | 'ip-hash'; + env_path?: string; [key: string]: unknown; }; domain: string; diff --git a/tests/Feature/API/SitesTest.php b/tests/Feature/API/SitesTest.php index 781cb9eb..985eeb20 100644 --- a/tests/Feature/API/SitesTest.php +++ b/tests/Feature/API/SitesTest.php @@ -381,6 +381,7 @@ public function test_update_env(): void 'site' => $site, ]), [ 'env' => $envContent, + 'path' => '/home/vito/some-path/.env', ]) ->assertSuccessful() ->assertJsonFragment([ diff --git a/tests/Feature/ApplicationTest.php b/tests/Feature/ApplicationTest.php index 1fa9bc0e..90360c40 100644 --- a/tests/Feature/ApplicationTest.php +++ b/tests/Feature/ApplicationTest.php @@ -147,8 +147,13 @@ public function test_update_env_file(): void 'site' => $this->site, ]), [ 'env' => 'APP_ENV="production"', + 'path' => '/home/vito/some-path/.env', ]) ->assertSessionDoesntHaveErrors(); + + $this->site->refresh(); + + $this->assertEquals('/home/vito/some-path/.env', data_get($this->site->type_data, 'env_path')); } /**