disable multiple team creation for self-hosters
This commit is contained in:
@@ -18,4 +18,3 @@ NEXTAUTH_SECRET=""
|
|||||||
API_RATE_LIMIT=2
|
API_RATE_LIMIT=2
|
||||||
|
|
||||||
NEXT_PUBLIC_IS_CLOUD=false
|
NEXT_PUBLIC_IS_CLOUD=false
|
||||||
NEXT_PUBLIC_SELF_HOSTED_ALLOW_NEW_USERS=false
|
|
@@ -17,6 +17,7 @@ import { Input } from "@unsend/ui/src/input";
|
|||||||
import { Spinner } from "@unsend/ui/src/spinner";
|
import { Spinner } from "@unsend/ui/src/spinner";
|
||||||
import { api } from "~/trpc/react";
|
import { api } from "~/trpc/react";
|
||||||
import { useRouter } from "next/navigation";
|
import { useRouter } from "next/navigation";
|
||||||
|
import { toast } from "@unsend/ui/src/toaster";
|
||||||
|
|
||||||
const FormSchema = z.object({
|
const FormSchema = z.object({
|
||||||
name: z.string().min(2, {
|
name: z.string().min(2, {
|
||||||
@@ -43,6 +44,9 @@ export default function CreateTeam() {
|
|||||||
utils.team.invalidate();
|
utils.team.invalidate();
|
||||||
router.replace("/dashboard");
|
router.replace("/dashboard");
|
||||||
},
|
},
|
||||||
|
onError: (e) => {
|
||||||
|
toast.error(e.message);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,19 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
export default function TeamCreationDisabled() {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="flex items-center justify-center min-h-screen ">
|
|
||||||
<div className=" w-[300px] flex flex-col gap-8">
|
|
||||||
<div>
|
|
||||||
<h1 className="text-2xl font-semibold text-center">Cannot sign up</h1>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<p className="text-center">
|
|
||||||
Team creation is disabled. Please contact your administrator.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
@@ -66,10 +66,6 @@ export const env = createEnv({
|
|||||||
.string()
|
.string()
|
||||||
.default("false")
|
.default("false")
|
||||||
.transform((str) => str === "true"),
|
.transform((str) => str === "true"),
|
||||||
NEXT_PUBLIC_SELF_HOSTED_ALLOW_NEW_USERS: z
|
|
||||||
.string()
|
|
||||||
.default("false")
|
|
||||||
.transform((str) => str === "true"),
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -91,8 +87,6 @@ export const env = createEnv({
|
|||||||
AWS_DEFAULT_REGION: process.env.AWS_DEFAULT_REGION,
|
AWS_DEFAULT_REGION: process.env.AWS_DEFAULT_REGION,
|
||||||
API_RATE_LIMIT: process.env.API_RATE_LIMIT,
|
API_RATE_LIMIT: process.env.API_RATE_LIMIT,
|
||||||
NEXT_PUBLIC_IS_CLOUD: process.env.NEXT_PUBLIC_IS_CLOUD,
|
NEXT_PUBLIC_IS_CLOUD: process.env.NEXT_PUBLIC_IS_CLOUD,
|
||||||
NEXT_PUBLIC_SELF_HOSTED_ALLOW_NEW_USERS:
|
|
||||||
process.env.NEXT_PUBLIC_SELF_HOSTED_ALLOW_NEW_USERS,
|
|
||||||
ADMIN_EMAIL: process.env.ADMIN_EMAIL,
|
ADMIN_EMAIL: process.env.ADMIN_EMAIL,
|
||||||
DISCORD_WEBHOOK_URL: process.env.DISCORD_WEBHOOK_URL,
|
DISCORD_WEBHOOK_URL: process.env.DISCORD_WEBHOOK_URL,
|
||||||
REDIS_URL: process.env.REDIS_URL,
|
REDIS_URL: process.env.REDIS_URL,
|
||||||
|
@@ -4,7 +4,6 @@ import { useSession } from "next-auth/react";
|
|||||||
import { FullScreenLoading } from "~/components/FullScreenLoading";
|
import { FullScreenLoading } from "~/components/FullScreenLoading";
|
||||||
import { AddSesSettings } from "~/components/settings/AddSesSettings";
|
import { AddSesSettings } from "~/components/settings/AddSesSettings";
|
||||||
import CreateTeam from "~/components/team/CreateTeam";
|
import CreateTeam from "~/components/team/CreateTeam";
|
||||||
import TeamCreationDisabled from "~/components/team/TeamCreationDisabled";
|
|
||||||
import { env } from "~/env";
|
import { env } from "~/env";
|
||||||
import { api } from "~/trpc/react";
|
import { api } from "~/trpc/react";
|
||||||
|
|
||||||
@@ -27,14 +26,6 @@ export const DashboardProvider = ({
|
|||||||
return <FullScreenLoading />;
|
return <FullScreenLoading />;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
|
||||||
!env.NEXT_PUBLIC_IS_CLOUD &&
|
|
||||||
!env.NEXT_PUBLIC_SELF_HOSTED_ALLOW_NEW_USERS &&
|
|
||||||
(!teams || teams.length === 0)
|
|
||||||
) {
|
|
||||||
return <TeamCreationDisabled />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
settings?.length === 0 &&
|
settings?.length === 0 &&
|
||||||
(!env.NEXT_PUBLIC_IS_CLOUD || session?.user.isAdmin)
|
(!env.NEXT_PUBLIC_IS_CLOUD || session?.user.isAdmin)
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
|
import { TRPCError } from "@trpc/server";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
import { env } from "~/env";
|
||||||
|
|
||||||
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
|
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
|
||||||
|
|
||||||
@@ -21,6 +23,16 @@ export const teamRouter = createTRPCRouter({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!env.NEXT_PUBLIC_IS_CLOUD) {
|
||||||
|
const _team = await ctx.db.team.findFirst();
|
||||||
|
if (_team) {
|
||||||
|
throw new TRPCError({
|
||||||
|
message: "Can't have multiple teams in self hosted version",
|
||||||
|
code: "UNAUTHORIZED",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ctx.db.team.create({
|
return ctx.db.team.create({
|
||||||
data: {
|
data: {
|
||||||
name: input.name,
|
name: input.name,
|
||||||
|
@@ -37,7 +37,8 @@
|
|||||||
"S3_COMPATIBLE_ACCESS_KEY",
|
"S3_COMPATIBLE_ACCESS_KEY",
|
||||||
"S3_COMPATIBLE_SECRET_KEY",
|
"S3_COMPATIBLE_SECRET_KEY",
|
||||||
"S3_COMPATIBLE_API_URL",
|
"S3_COMPATIBLE_API_URL",
|
||||||
"S3_COMPATIBLE_PUBLIC_URL"
|
"S3_COMPATIBLE_PUBLIC_URL",
|
||||||
|
"ENABLE_PRISMA_CLIENT"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"lint": {
|
"lint": {
|
||||||
|
Reference in New Issue
Block a user