Merge branch 'canary' into 245-volumes-are-canceled-on-deployment

This commit is contained in:
Mauricio Siu 2024-07-21 18:59:54 -06:00
commit 9b71ce9388
11 changed files with 134 additions and 39 deletions

View File

@ -29,8 +29,8 @@ export const RefreshToken = ({ applicationId }: Props) => {
<AlertDialogHeader> <AlertDialogHeader>
<AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle> <AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>
<AlertDialogDescription> <AlertDialogDescription>
This action cannot be undone. This will permanently delete the This action cannot be undone. This will change the refresh token and
domain other tokens will be invalidated.
</AlertDialogDescription> </AlertDialogDescription>
</AlertDialogHeader> </AlertDialogHeader>
<AlertDialogFooter> <AlertDialogFooter>

View File

@ -10,7 +10,7 @@ import {
} from "@/components/ui/dropdown-menu"; } from "@/components/ui/dropdown-menu";
import { Toggle } from "@/components/ui/toggle"; import { Toggle } from "@/components/ui/toggle";
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { ExternalLink, Globe, Terminal } from "lucide-react"; import { CheckCircle2, ExternalLink, Globe, Terminal } from "lucide-react";
import Link from "next/link"; import Link from "next/link";
import { toast } from "sonner"; import { toast } from "sonner";
import { DockerTerminalModal } from "../../settings/web-server/docker-terminal-modal"; import { DockerTerminalModal } from "../../settings/web-server/docker-terminal-modal";
@ -50,7 +50,6 @@ export const ComposeActions = ({ composeId }: Props) => {
return ( return (
<div className="flex flex-row gap-4 w-full flex-wrap "> <div className="flex flex-row gap-4 w-full flex-wrap ">
<DeployCompose composeId={composeId} /> <DeployCompose composeId={composeId} />
<Toggle <Toggle
aria-label="Toggle italic" aria-label="Toggle italic"
pressed={data?.autoDeploy || false} pressed={data?.autoDeploy || false}
@ -67,8 +66,9 @@ export const ComposeActions = ({ composeId }: Props) => {
toast.error("Error to update Auto Deploy"); toast.error("Error to update Auto Deploy");
}); });
}} }}
className="flex flex-row gap-2 items-center"
> >
Autodeploy Autodeploy {data?.autoDeploy && <CheckCircle2 className="size-4" />}
</Toggle> </Toggle>
<RedbuildCompose composeId={composeId} /> <RedbuildCompose composeId={composeId} />
{data?.composeType === "docker-compose" && ( {data?.composeType === "docker-compose" && (

View File

@ -14,9 +14,11 @@ import {
FormItem, FormItem,
FormMessage, FormMessage,
} from "@/components/ui/form"; } from "@/components/ui/form";
import { Toggle } from "@/components/ui/toggle";
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import React, { useEffect } from "react"; import { EyeIcon, EyeOffIcon } from "lucide-react";
import React, { useEffect, useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { toast } from "sonner"; import { toast } from "sonner";
import { z } from "zod"; import { z } from "zod";
@ -32,6 +34,7 @@ interface Props {
} }
export const ShowMariadbEnvironment = ({ mariadbId }: Props) => { export const ShowMariadbEnvironment = ({ mariadbId }: Props) => {
const [isEnvVisible, setIsEnvVisible] = useState(true);
const { mutateAsync, isLoading } = api.mariadb.saveEnvironment.useMutation(); const { mutateAsync, isLoading } = api.mariadb.saveEnvironment.useMutation();
const { data, refetch } = api.mariadb.one.useQuery( const { data, refetch } = api.mariadb.one.useQuery(
@ -74,11 +77,26 @@ export const ShowMariadbEnvironment = ({ mariadbId }: Props) => {
return ( return (
<div className="flex w-full flex-col gap-5 "> <div className="flex w-full flex-col gap-5 ">
<Card className="bg-background"> <Card className="bg-background">
<CardHeader> {" "}
<CardTitle className="text-xl">Environment Settings</CardTitle> <CardHeader className="flex flex-row w-full items-center justify-between">
<CardDescription> <div>
You can add environment variables to your database. <CardTitle className="text-xl">Environment Settings</CardTitle>
</CardDescription> <CardDescription>
You can add environment variables to your resource.
</CardDescription>
</div>
<Toggle
aria-label="Toggle bold"
pressed={isEnvVisible}
onPressedChange={setIsEnvVisible}
>
{isEnvVisible ? (
<EyeOffIcon className="h-4 w-4 text-muted-foreground" />
) : (
<EyeIcon className="h-4 w-4 text-muted-foreground" />
)}
</Toggle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<Form {...form}> <Form {...form}>
@ -95,6 +113,7 @@ export const ShowMariadbEnvironment = ({ mariadbId }: Props) => {
<FormControl> <FormControl>
<CodeEditor <CodeEditor
language="properties" language="properties"
disabled={isEnvVisible}
placeholder={`NODE_ENV=production placeholder={`NODE_ENV=production
PORT=3000 PORT=3000
`} `}

View File

@ -14,9 +14,11 @@ import {
FormItem, FormItem,
FormMessage, FormMessage,
} from "@/components/ui/form"; } from "@/components/ui/form";
import { Toggle } from "@/components/ui/toggle";
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import React, { useEffect } from "react"; import { EyeIcon, EyeOffIcon } from "lucide-react";
import React, { useEffect, useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { toast } from "sonner"; import { toast } from "sonner";
import { z } from "zod"; import { z } from "zod";
@ -32,6 +34,7 @@ interface Props {
} }
export const ShowMongoEnvironment = ({ mongoId }: Props) => { export const ShowMongoEnvironment = ({ mongoId }: Props) => {
const [isEnvVisible, setIsEnvVisible] = useState(true);
const { mutateAsync, isLoading } = api.mongo.saveEnvironment.useMutation(); const { mutateAsync, isLoading } = api.mongo.saveEnvironment.useMutation();
const { data, refetch } = api.mongo.one.useQuery( const { data, refetch } = api.mongo.one.useQuery(
@ -74,11 +77,25 @@ export const ShowMongoEnvironment = ({ mongoId }: Props) => {
return ( return (
<div className="flex w-full flex-col gap-5 "> <div className="flex w-full flex-col gap-5 ">
<Card className="bg-background"> <Card className="bg-background">
<CardHeader> <CardHeader className="flex flex-row w-full items-center justify-between">
<CardTitle className="text-xl">Environment Settings</CardTitle> <div>
<CardDescription> <CardTitle className="text-xl">Environment Settings</CardTitle>
You can add environment variables to your database. <CardDescription>
</CardDescription> You can add environment variables to your resource.
</CardDescription>
</div>
<Toggle
aria-label="Toggle bold"
pressed={isEnvVisible}
onPressedChange={setIsEnvVisible}
>
{isEnvVisible ? (
<EyeOffIcon className="h-4 w-4 text-muted-foreground" />
) : (
<EyeIcon className="h-4 w-4 text-muted-foreground" />
)}
</Toggle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<Form {...form}> <Form {...form}>
@ -95,6 +112,7 @@ export const ShowMongoEnvironment = ({ mongoId }: Props) => {
<FormControl> <FormControl>
<CodeEditor <CodeEditor
language="properties" language="properties"
disabled={isEnvVisible}
placeholder={`NODE_ENV=production placeholder={`NODE_ENV=production
PORT=3000 PORT=3000
`} `}

View File

@ -14,9 +14,11 @@ import {
FormItem, FormItem,
FormMessage, FormMessage,
} from "@/components/ui/form"; } from "@/components/ui/form";
import { Toggle } from "@/components/ui/toggle";
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import React, { useEffect } from "react"; import { EyeIcon, EyeOffIcon } from "lucide-react";
import React, { useEffect, useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { toast } from "sonner"; import { toast } from "sonner";
import { z } from "zod"; import { z } from "zod";
@ -32,6 +34,7 @@ interface Props {
} }
export const ShowMysqlEnvironment = ({ mysqlId }: Props) => { export const ShowMysqlEnvironment = ({ mysqlId }: Props) => {
const [isEnvVisible, setIsEnvVisible] = useState(true);
const { mutateAsync, isLoading } = api.mysql.saveEnvironment.useMutation(); const { mutateAsync, isLoading } = api.mysql.saveEnvironment.useMutation();
const { data, refetch } = api.mysql.one.useQuery( const { data, refetch } = api.mysql.one.useQuery(
@ -74,11 +77,25 @@ export const ShowMysqlEnvironment = ({ mysqlId }: Props) => {
return ( return (
<div className="flex w-full flex-col gap-5 "> <div className="flex w-full flex-col gap-5 ">
<Card className="bg-background"> <Card className="bg-background">
<CardHeader> <CardHeader className="flex flex-row w-full items-center justify-between">
<CardTitle className="text-xl">Environment Settings</CardTitle> <div>
<CardDescription> <CardTitle className="text-xl">Environment Settings</CardTitle>
You can add environment variables to your database. <CardDescription>
</CardDescription> You can add environment variables to your resource.
</CardDescription>
</div>
<Toggle
aria-label="Toggle bold"
pressed={isEnvVisible}
onPressedChange={setIsEnvVisible}
>
{isEnvVisible ? (
<EyeOffIcon className="h-4 w-4 text-muted-foreground" />
) : (
<EyeIcon className="h-4 w-4 text-muted-foreground" />
)}
</Toggle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<Form {...form}> <Form {...form}>
@ -95,6 +112,7 @@ export const ShowMysqlEnvironment = ({ mysqlId }: Props) => {
<FormControl> <FormControl>
<CodeEditor <CodeEditor
language="properties" language="properties"
disabled={isEnvVisible}
placeholder={`NODE_ENV=production placeholder={`NODE_ENV=production
PORT=3000 PORT=3000
`} `}

View File

@ -14,9 +14,11 @@ import {
FormItem, FormItem,
FormMessage, FormMessage,
} from "@/components/ui/form"; } from "@/components/ui/form";
import { Toggle } from "@/components/ui/toggle";
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import React, { useEffect } from "react"; import { EyeIcon, EyeOffIcon } from "lucide-react";
import React, { useEffect, useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { toast } from "sonner"; import { toast } from "sonner";
import { z } from "zod"; import { z } from "zod";
@ -32,6 +34,7 @@ interface Props {
} }
export const ShowPostgresEnvironment = ({ postgresId }: Props) => { export const ShowPostgresEnvironment = ({ postgresId }: Props) => {
const [isEnvVisible, setIsEnvVisible] = useState(true);
const { mutateAsync, isLoading } = api.postgres.saveEnvironment.useMutation(); const { mutateAsync, isLoading } = api.postgres.saveEnvironment.useMutation();
const { data, refetch } = api.postgres.one.useQuery( const { data, refetch } = api.postgres.one.useQuery(
@ -74,11 +77,25 @@ export const ShowPostgresEnvironment = ({ postgresId }: Props) => {
return ( return (
<div className="flex w-full flex-col gap-5 "> <div className="flex w-full flex-col gap-5 ">
<Card className="bg-background"> <Card className="bg-background">
<CardHeader> <CardHeader className="flex flex-row w-full items-center justify-between">
<CardTitle className="text-xl">Environment Settings</CardTitle> <div>
<CardDescription> <CardTitle className="text-xl">Environment Settings</CardTitle>
You can add environment variables to your database. <CardDescription>
</CardDescription> You can add environment variables to your resource.
</CardDescription>
</div>
<Toggle
aria-label="Toggle bold"
pressed={isEnvVisible}
onPressedChange={setIsEnvVisible}
>
{isEnvVisible ? (
<EyeOffIcon className="h-4 w-4 text-muted-foreground" />
) : (
<EyeIcon className="h-4 w-4 text-muted-foreground" />
)}
</Toggle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<Form {...form}> <Form {...form}>
@ -95,6 +112,7 @@ export const ShowPostgresEnvironment = ({ postgresId }: Props) => {
<FormControl> <FormControl>
<CodeEditor <CodeEditor
language="properties" language="properties"
disabled={isEnvVisible}
placeholder={`NODE_ENV=production placeholder={`NODE_ENV=production
PORT=3000 PORT=3000
`} `}

View File

@ -14,9 +14,11 @@ import {
FormItem, FormItem,
FormMessage, FormMessage,
} from "@/components/ui/form"; } from "@/components/ui/form";
import { Toggle } from "@/components/ui/toggle";
import { api } from "@/utils/api"; import { api } from "@/utils/api";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import React, { useEffect } from "react"; import { EyeIcon, EyeOffIcon } from "lucide-react";
import React, { useEffect, useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { toast } from "sonner"; import { toast } from "sonner";
import { z } from "zod"; import { z } from "zod";
@ -32,6 +34,7 @@ interface Props {
} }
export const ShowRedisEnvironment = ({ redisId }: Props) => { export const ShowRedisEnvironment = ({ redisId }: Props) => {
const [isEnvVisible, setIsEnvVisible] = useState(true);
const { mutateAsync, isLoading } = api.redis.saveEnvironment.useMutation(); const { mutateAsync, isLoading } = api.redis.saveEnvironment.useMutation();
const { data, refetch } = api.redis.one.useQuery( const { data, refetch } = api.redis.one.useQuery(
@ -74,11 +77,25 @@ export const ShowRedisEnvironment = ({ redisId }: Props) => {
return ( return (
<div className="flex w-full flex-col gap-5 "> <div className="flex w-full flex-col gap-5 ">
<Card className="bg-background"> <Card className="bg-background">
<CardHeader> <CardHeader className="flex flex-row w-full items-center justify-between">
<CardTitle className="text-xl">Environment Settings</CardTitle> <div>
<CardDescription> <CardTitle className="text-xl">Environment Settings</CardTitle>
You can add environment variables to your database. <CardDescription>
</CardDescription> You can add environment variables to your resource.
</CardDescription>
</div>
<Toggle
aria-label="Toggle bold"
pressed={isEnvVisible}
onPressedChange={setIsEnvVisible}
>
{isEnvVisible ? (
<EyeOffIcon className="h-4 w-4 text-muted-foreground" />
) : (
<EyeIcon className="h-4 w-4 text-muted-foreground" />
)}
</Toggle>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<Form {...form}> <Form {...form}>
@ -95,6 +112,7 @@ export const ShowRedisEnvironment = ({ redisId }: Props) => {
<FormControl> <FormControl>
<CodeEditor <CodeEditor
language="properties" language="properties"
disabled={isEnvVisible}
placeholder={`NODE_ENV=production placeholder={`NODE_ENV=production
PORT=3000 PORT=3000
`} `}

View File

@ -27,7 +27,9 @@ export default async function handler(
return; return;
} }
if (!application?.autoDeploy) { if (!application?.autoDeploy) {
res.status(400).json({ message: "Application Not Deployable" }); res.status(400).json({
message: "Automatic deployments are disabled for this application",
});
return; return;
} }

View File

@ -32,7 +32,9 @@ export default async function handler(
return; return;
} }
if (!composeResult?.autoDeploy) { if (!composeResult?.autoDeploy) {
res.status(400).json({ message: "Compose Not Deployable" }); res.status(400).json({
message: "Automatic deployments are disabled for this compose",
});
return; return;
} }

View File

@ -122,7 +122,7 @@ export const applications = pgTable("application", {
owner: text("owner"), owner: text("owner"),
branch: text("branch"), branch: text("branch"),
buildPath: text("buildPath").default("/"), buildPath: text("buildPath").default("/"),
autoDeploy: boolean("autoDeploy"), autoDeploy: boolean("autoDeploy").$defaultFn(() => true),
// Docker // Docker
username: text("username"), username: text("username"),
password: text("password"), password: text("password"),

View File

@ -37,7 +37,7 @@ export const compose = pgTable("compose", {
repository: text("repository"), repository: text("repository"),
owner: text("owner"), owner: text("owner"),
branch: text("branch"), branch: text("branch"),
autoDeploy: boolean("autoDeploy"), autoDeploy: boolean("autoDeploy").$defaultFn(() => true),
// Git // Git
customGitUrl: text("customGitUrl"), customGitUrl: text("customGitUrl"),
customGitBranch: text("customGitBranch"), customGitBranch: text("customGitBranch"),