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 type { NextApiRequest, NextApiResponse } from "next";
|
||||||
|
import prisma from "@lib/prisma";
|
||||||
import { getSession } from "@lib/auth";
|
import { getSession } from "@lib/auth";
|
||||||
import prisma, { whereAndSelect } from "@lib/prisma";
|
|
||||||
|
|
||||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||||
const session = await getSession({ req: req });
|
const session = await getSession({ req: req });
|
||||||
|
@ -10,56 +10,25 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get user
|
|
||||||
const user = await whereAndSelect(
|
|
||||||
prisma.user.findUnique,
|
|
||||||
{
|
|
||||||
id: session.user.id,
|
|
||||||
},
|
|
||||||
["id", "password"]
|
|
||||||
);
|
|
||||||
|
|
||||||
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({
|
|
||||||
where: {
|
|
||||||
username,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (userConflict) {
|
|
||||||
return res.status(409).json({ message: "Username already taken" });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const name = req.body.name;
|
|
||||||
const description = req.body.description;
|
const description = req.body.description;
|
||||||
const avatar = req.body.avatar;
|
delete req.body.description;
|
||||||
const timeZone = req.body.timeZone;
|
|
||||||
const weekStart = req.body.weekStart;
|
|
||||||
const hideBranding = req.body.hideBranding;
|
|
||||||
const theme = req.body.theme;
|
|
||||||
|
|
||||||
|
try {
|
||||||
await prisma.user.update({
|
await prisma.user.update({
|
||||||
where: {
|
where: {
|
||||||
id: user.id,
|
id: session.user.id,
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
username,
|
...req.body,
|
||||||
name,
|
|
||||||
avatar,
|
|
||||||
bio: description,
|
bio: description,
|
||||||
timeZone,
|
|
||||||
weekStart,
|
|
||||||
hideBranding,
|
|
||||||
theme,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
} catch (e) {
|
||||||
|
if (e.code === "P2002") {
|
||||||
|
return res.status(409).json({ message: "Username already taken" });
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
return res.status(200).json({ message: "Profile updated successfully" });
|
return res.status(200).json({ message: "Profile updated successfully" });
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue