|
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) { |
|
|
|
await collections.users.updateOne( |
|
{ _id: existingUser._id }, |
|
{ $set: { username, name, avatarUrl } } |
|
); |
|
|
|
refreshSessionCookie(cookies, existingUser.sessionId); |
|
} else { |
|
|
|
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; |
|
|
|
|
|
const { matchedCount } = await collections.settings.updateOne(authCondition(locals), { |
|
$set: { userId, updatedAt: new Date() }, |
|
$unset: { sessionId: "" }, |
|
}); |
|
|
|
if (!matchedCount) { |
|
|
|
await collections.settings.insertOne({ |
|
userId, |
|
ethicsModalAcceptedAt: new Date(), |
|
updatedAt: new Date(), |
|
createdAt: new Date(), |
|
...DEFAULT_SETTINGS, |
|
}); |
|
} |
|
} |
|
|
|
|
|
await collections.conversations.updateMany(authCondition(locals), { |
|
$set: { userId }, |
|
$unset: { sessionId: "" }, |
|
}); |
|
} |
|
|