diff --git a/app/(protected)/admin/users/user-list.tsx b/app/(protected)/admin/users/user-list.tsx index d51a26e..269103c 100644 --- a/app/(protected)/admin/users/user-list.tsx +++ b/app/(protected)/admin/users/user-list.tsx @@ -34,7 +34,7 @@ import { TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; -import { UserForm } from "@/components/forms/user-form"; +import { FormType, UserForm } from "@/components/forms/user-form"; import { EmptyPlaceholder } from "@/components/shared/empty-placeholder"; import { Icons } from "@/components/shared/icons"; import { PaginationWrapper } from "@/components/shared/pagination"; @@ -74,6 +74,7 @@ function TableColumnSekleton({ className }: { className?: string }) { export default function UsersList({ user }: UrlListProps) { const { isMobile } = useMediaQuery(); + const [formType, setFormType] = useState("add"); const [isShowForm, setShowForm] = useState(false); const [currentEditUser, setcurrentEditUser] = useState(null); const [currentPage, setCurrentPage] = useState(1); @@ -121,6 +122,19 @@ export default function UsersList({ user }: UrlListProps) { )} + @@ -262,6 +276,7 @@ export default function UsersList({ user }: UrlListProps) { onClick={() => { setcurrentEditUser(user); setShowForm(false); + setFormType("edit"); setShowForm(!isShowForm); }} > @@ -304,7 +319,7 @@ export default function UsersList({ user }: UrlListProps) { user={{ id: user.id, name: user.name || "" }} isShowForm={isShowForm} setShowForm={setShowForm} - type="edit" + type={formType} initData={currentEditUser} onRefresh={handleRefresh} /> diff --git a/app/api/auth/credentials/route.ts b/app/api/auth/credentials/route.ts index 44dde95..0e0f2cf 100644 --- a/app/api/auth/credentials/route.ts +++ b/app/api/auth/credentials/route.ts @@ -1,6 +1,7 @@ import { NextRequest } from "next/server"; import { prisma } from "@/lib/db"; +import { getMultipleConfigs } from "@/lib/dto/system-config"; import { hashPassword, verifyPassword } from "@/lib/utils"; export async function POST(req: NextRequest) { @@ -17,6 +18,10 @@ export async function POST(req: NextRequest) { }); if (!user) { + const configs = await getMultipleConfigs(["enable_user_registration"]); + if (!configs.enable_user_registration) { + return Response.json("User registration is disabled", { status: 403 }); + } const newUser = await prisma.user.create({ data: { name: "", diff --git a/app/api/user/admin/add/route.ts b/app/api/user/admin/add/route.ts new file mode 100644 index 0000000..d87e6b5 --- /dev/null +++ b/app/api/user/admin/add/route.ts @@ -0,0 +1,47 @@ +import { prisma } from "@/lib/db"; +import { checkUserStatus } from "@/lib/dto/user"; +import { getCurrentUser } from "@/lib/session"; +import { hashPassword } from "@/lib/utils"; + +export async function POST(req: Request) { + try { + const user = checkUserStatus(await getCurrentUser()); + if (user instanceof Response) return user; + if (user.role !== "ADMIN") { + return Response.json("Unauthorized", { + status: 401, + }); + } + + const { email, password, name, team } = await req.json(); + if (!email || !password) { + return Response.json("email and password is required", { status: 400 }); + } + + const has_user = await prisma.user.findUnique({ + where: { + email, + }, + }); + + if (has_user) { + return Response.json("User already exists", { status: 400 }); + } + + const newUser = await prisma.user.create({ + data: { + name, + email, + password: hashPassword(password), + active: 1, + role: "USER", + team, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }, + }); + return Response.json(newUser.id, { status: 200 }); + } catch (error) { + return Response.json({ statusText: "Server error" }, { status: 500 }); + } +} diff --git a/app/api/user/admin/route.ts b/app/api/user/admin/route.ts index 766bdcc..d5409c8 100644 --- a/app/api/user/admin/route.ts +++ b/app/api/user/admin/route.ts @@ -1,4 +1,3 @@ -import { env } from "@/env.mjs"; import { checkUserStatus, getAllUsers } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; diff --git a/components/email/EmailSidebar.tsx b/components/email/EmailSidebar.tsx index bc0e7cf..95804d7 100644 --- a/components/email/EmailSidebar.tsx +++ b/components/email/EmailSidebar.tsx @@ -547,8 +547,8 @@ export default function EmailSidebar({ {isAdminModel - ? `Created by ${email.user || email.email.slice(0, 5)} at` - : ""}{" "} + ? `${email.user || email.email.slice(0, 5)} · ` + : ""} diff --git a/components/forms/user-auth-form.tsx b/components/forms/user-auth-form.tsx index 69fcf59..8f2c072 100644 --- a/components/forms/user-auth-form.tsx +++ b/components/forms/user-auth-form.tsx @@ -221,12 +221,7 @@ export function UserAuthForm({ className, type, ...props }: UserAuthFormProps) {