Username is now @unique in main, so we can now catch Prisma conflicts (#610)
parent
766cdd7123
commit
1269c43c99
|
@ -1,6 +1,6 @@
|
|||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import prisma from "@lib/prisma";
|
||||
import { getSession } from "@lib/auth";
|
||||
import prisma, { whereAndSelect } from "@lib/prisma";
|
||||
|
||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
const session = await getSession({ req: req });
|
||||
|
@ -10,56 +10,25 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
|||
return;
|
||||
}
|
||||
|
||||
// Get user
|
||||
const user = await whereAndSelect(
|
||||
prisma.user.findUnique,
|
||||
{
|
||||
id: session.user.id,
|
||||
},
|
||||
["id", "password"]
|
||||
);
|
||||
const description = req.body.description;
|
||||
delete req.body.description;
|
||||
|
||||
if (!user) {
|
||||
res.status(404).json({ message: "User not found" });
|
||||
return;
|
||||
}
|
||||
|
||||
const username = req.body.username;
|
||||
// username is changed: username is optional but it is necessary to be unique, enforce here
|
||||
if (username !== session.user.username) {
|
||||
const userConflict = await prisma.user.findFirst({
|
||||
try {
|
||||
await prisma.user.update({
|
||||
where: {
|
||||
username,
|
||||
id: session.user.id,
|
||||
},
|
||||
data: {
|
||||
...req.body,
|
||||
bio: description,
|
||||
},
|
||||
});
|
||||
if (userConflict) {
|
||||
} catch (e) {
|
||||
if (e.code === "P2002") {
|
||||
return res.status(409).json({ message: "Username already taken" });
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
|
||||
const name = req.body.name;
|
||||
const description = req.body.description;
|
||||
const avatar = req.body.avatar;
|
||||
const timeZone = req.body.timeZone;
|
||||
const weekStart = req.body.weekStart;
|
||||
const hideBranding = req.body.hideBranding;
|
||||
const theme = req.body.theme;
|
||||
|
||||
await prisma.user.update({
|
||||
where: {
|
||||
id: user.id,
|
||||
},
|
||||
data: {
|
||||
username,
|
||||
name,
|
||||
avatar,
|
||||
bio: description,
|
||||
timeZone,
|
||||
weekStart,
|
||||
hideBranding,
|
||||
theme,
|
||||
},
|
||||
});
|
||||
|
||||
return res.status(200).json({ message: "Profile updated successfully" });
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue