coyotte508's picture
coyotte508 HF staff
🩹 Make preferred_username optional
002a2a0
raw
history blame
2.24 kB
import { authCondition, refreshSessionCookie } from "$lib/server/auth";
import { collections } from "$lib/server/database";
import { ObjectId } from "mongodb";
import { DEFAULT_SETTINGS } from "$lib/types/Settings";
import { z } from "zod";
import type { UserinfoResponse } from "openid-client";
import type { Cookies } from "@sveltejs/kit";
export async function updateUser(params: {
userData: UserinfoResponse;
locals: App.Locals;
cookies: Cookies;
}) {
const { userData, locals, cookies } = params;
const {
preferred_username: username,
name,
email,
picture: avatarUrl,
sub: hfUserId,
} = z
.object({
preferred_username: z.string().optional(),
name: z.string(),
picture: z.string(),
sub: z.string(),
email: z.string().email().optional(),
})
.refine((data) => data.preferred_username || data.email, {
message: "Either preferred_username or email must be provided by the provider.",
})
.parse(userData);
const existingUser = await collections.users.findOne({ hfUserId });
let userId = existingUser?._id;
if (existingUser) {
// update existing user if any
await collections.users.updateOne(
{ _id: existingUser._id },
{ $set: { username, name, avatarUrl } }
);
// refresh session cookie
refreshSessionCookie(cookies, existingUser.sessionId);
} else {
// user doesn't exist yet, create a new one
const { insertedId } = await collections.users.insertOne({
_id: new ObjectId(),
createdAt: new Date(),
updatedAt: new Date(),
username,
name,
email,
avatarUrl,
hfUserId,
sessionId: locals.sessionId,
});
userId = insertedId;
// update pre-existing settings
const { matchedCount } = await collections.settings.updateOne(authCondition(locals), {
$set: { userId, updatedAt: new Date() },
$unset: { sessionId: "" },
});
if (!matchedCount) {
// create new default settings
await collections.settings.insertOne({
userId,
ethicsModalAcceptedAt: new Date(),
updatedAt: new Date(),
createdAt: new Date(),
...DEFAULT_SETTINGS,
});
}
}
// migrate pre-existing conversations
await collections.conversations.updateMany(authCondition(locals), {
$set: { userId },
$unset: { sessionId: "" },
});
}