From aefea182eefc5fe6b4a69860db5a7be471cf6679 Mon Sep 17 00:00:00 2001 From: schererleander Date: Wed, 2 Jul 2025 22:18:21 +0200 Subject: feat: add user management API --- src/app/api/user/profile/route.ts | 78 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/app/api/user/profile/route.ts (limited to 'src/app/api/user/profile') diff --git a/src/app/api/user/profile/route.ts b/src/app/api/user/profile/route.ts new file mode 100644 index 0000000..0cac7a3 --- /dev/null +++ b/src/app/api/user/profile/route.ts @@ -0,0 +1,78 @@ +import { NextRequest, NextResponse } from "next/server" +import { getServerSession } from "next-auth/next" +import dbConnect from "@/lib/mongodb" +import User from "@/model/User" +import { authOptions } from "@/lib/auth" +import { updateProfileSchema } from "@/lib/validation" + +export async function PATCH(request: NextRequest) { + try { + const session = await getServerSession(authOptions) + + if (!session?.user?.id) { + return NextResponse.json( + { error: "Unauthorized" }, + { status: 401 } + ) + } + + const body = await request.json() + + const result = updateProfileSchema.safeParse(body) + + if (!result.success) { + return NextResponse.json( + { error: "Validation failed", details: result.error.errors }, + { status: 400 } + ) + } + + const { name, email } = result.data + + await dbConnect() + + // Check if email is already taken by another user + const existingUser = await User.findOne({ + email, + _id: { $ne: session.user.id } + }) + + if (existingUser) { + return NextResponse.json( + { error: "Email is already in use" }, + { status: 409 } + ) + } + + // Update user + const updatedUser = await User.findByIdAndUpdate( + session.user.id, + { name, email }, + { new: true } + ) + + if (!updatedUser) { + return NextResponse.json( + { error: "User not found" }, + { status: 404 } + ) + } + + return NextResponse.json({ + message: "Profile updated successfully", + user: { + id: updatedUser._id, + name: updatedUser.name, + email: updatedUser.email, + } + }) + + } catch (error) { + console.error("Profile update error:", error) + + return NextResponse.json( + { error: "Internal server error" }, + { status: 500 } + ) + } +} \ No newline at end of file -- cgit v1.3.1