mirror of
https://github.com/vitodeploy/vito.git
synced 2025-07-01 14:06:15 +00:00
add custom path to site env (#629)
This commit is contained in:
@ -17,12 +17,15 @@ public function update(Site $site, array $input): void
|
|||||||
{
|
{
|
||||||
Validator::make($input, [
|
Validator::make($input, [
|
||||||
'env' => ['required', 'string'],
|
'env' => ['required', 'string'],
|
||||||
|
'path' => ['required', 'string'],
|
||||||
])->validate();
|
])->validate();
|
||||||
|
|
||||||
$site->server->os()->write(
|
$site->server->os()->write(
|
||||||
$site->path.'/.env',
|
$input['path'],
|
||||||
trim((string) $input['env']),
|
trim((string) $input['env']),
|
||||||
$site->user,
|
$site->user,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$site->jsonUpdate('type_data', 'env_path', $input['path']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,12 +55,17 @@ public function share(Request $request): array
|
|||||||
|
|
||||||
$data = [];
|
$data = [];
|
||||||
if ($request->route('server')) {
|
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
|
||||||
$sites = [];
|
$sites = [];
|
||||||
/** @var Server $server */
|
|
||||||
$server = $request->route('server');
|
|
||||||
if ($user && $user->can('viewAny', [Site::class, $server])) {
|
if ($user && $user->can('viewAny', [Site::class, $server])) {
|
||||||
$sites = SiteResource::collection($server->sites);
|
$sites = SiteResource::collection($server->sites);
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ export function AppHeader() {
|
|||||||
<ProjectSwitch />
|
<ProjectSwitch />
|
||||||
<SlashIcon className="size-3" />
|
<SlashIcon className="size-3" />
|
||||||
<ServerSwitch />
|
<ServerSwitch />
|
||||||
{page.props.server && (
|
{page.props.server && page.props.server.services['webserver'] && (
|
||||||
<>
|
<>
|
||||||
<SlashIcon className="size-3" />
|
<SlashIcon className="size-3" />
|
||||||
<SiteSwitch />
|
<SiteSwitch />
|
||||||
|
@ -11,14 +11,17 @@ import { LoaderCircleIcon } from 'lucide-react';
|
|||||||
import { registerDotEnvLanguage } from '@/lib/editor';
|
import { registerDotEnvLanguage } from '@/lib/editor';
|
||||||
import { Site } from '@/types/site';
|
import { Site } from '@/types/site';
|
||||||
import { useAppearance } from '@/hooks/use-appearance';
|
import { useAppearance } from '@/hooks/use-appearance';
|
||||||
|
import { Input } from '@/components/ui/input';
|
||||||
|
|
||||||
export default function Env({ site, children }: { site: Site; children: ReactNode }) {
|
export default function Env({ site, children }: { site: Site; children: ReactNode }) {
|
||||||
const { getActualAppearance } = useAppearance();
|
const { getActualAppearance } = useAppearance();
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
const form = useForm<{
|
const form = useForm<{
|
||||||
env: string;
|
env: string;
|
||||||
|
path: string;
|
||||||
}>({
|
}>({
|
||||||
env: '',
|
env: '',
|
||||||
|
path: site.type_data.env_path || `${site.path}/.env`,
|
||||||
});
|
});
|
||||||
|
|
||||||
const submit = (e: FormEvent) => {
|
const submit = (e: FormEvent) => {
|
||||||
@ -55,7 +58,15 @@ export default function Env({ site, children }: { site: Site; children: ReactNod
|
|||||||
<SheetTrigger asChild>{children}</SheetTrigger>
|
<SheetTrigger asChild>{children}</SheetTrigger>
|
||||||
<SheetContent className="sm:max-w-5xl">
|
<SheetContent className="sm:max-w-5xl">
|
||||||
<SheetHeader>
|
<SheetHeader>
|
||||||
<SheetTitle>Edit .env</SheetTitle>
|
<SheetTitle>
|
||||||
|
<Input
|
||||||
|
name="path"
|
||||||
|
value={form.data.path}
|
||||||
|
onChange={(e) => form.setData('path', e.target.value)}
|
||||||
|
autoFocus={false}
|
||||||
|
className="max-w-[80%]"
|
||||||
|
/>
|
||||||
|
</SheetTitle>
|
||||||
<SheetDescription className="sr-only">Edit .env file</SheetDescription>
|
<SheetDescription className="sr-only">Edit .env file</SheetDescription>
|
||||||
</SheetHeader>
|
</SheetHeader>
|
||||||
<Form id="update-env-form" className="h-full" onSubmit={submit}>
|
<Form id="update-env-form" className="h-full" onSubmit={submit}>
|
||||||
|
1
resources/js/types/site.d.ts
vendored
1
resources/js/types/site.d.ts
vendored
@ -9,6 +9,7 @@ export interface Site {
|
|||||||
type: string;
|
type: string;
|
||||||
type_data: {
|
type_data: {
|
||||||
method?: 'round-robin' | 'least-connections' | 'ip-hash';
|
method?: 'round-robin' | 'least-connections' | 'ip-hash';
|
||||||
|
env_path?: string;
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
};
|
};
|
||||||
domain: string;
|
domain: string;
|
||||||
|
@ -381,6 +381,7 @@ public function test_update_env(): void
|
|||||||
'site' => $site,
|
'site' => $site,
|
||||||
]), [
|
]), [
|
||||||
'env' => $envContent,
|
'env' => $envContent,
|
||||||
|
'path' => '/home/vito/some-path/.env',
|
||||||
])
|
])
|
||||||
->assertSuccessful()
|
->assertSuccessful()
|
||||||
->assertJsonFragment([
|
->assertJsonFragment([
|
||||||
|
@ -147,8 +147,13 @@ public function test_update_env_file(): void
|
|||||||
'site' => $this->site,
|
'site' => $this->site,
|
||||||
]), [
|
]), [
|
||||||
'env' => 'APP_ENV="production"',
|
'env' => 'APP_ENV="production"',
|
||||||
|
'path' => '/home/vito/some-path/.env',
|
||||||
])
|
])
|
||||||
->assertSessionDoesntHaveErrors();
|
->assertSessionDoesntHaveErrors();
|
||||||
|
|
||||||
|
$this->site->refresh();
|
||||||
|
|
||||||
|
$this->assertEquals('/home/vito/some-path/.env', data_get($this->site->type_data, 'env_path'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user