Username is now @unique in main, so we can now catch Prisma conflicts (#610)

pull/611/head
Alex van Andel 2021-09-08 18:21:23 +01:00 committed by GitHub
parent 766cdd7123
commit 1269c43c99
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 13 additions and 44 deletions

View File

@ -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"]
);
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 avatar = req.body.avatar;
const timeZone = req.body.timeZone;
const weekStart = req.body.weekStart;
const hideBranding = req.body.hideBranding;
const theme = req.body.theme;
delete req.body.description;
try {
await prisma.user.update({
where: {
id: user.id,
id: session.user.id,
},
data: {
username,
name,
avatar,
...req.body,
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" });
}