| | 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: "" }, |
| | }); |
| | } |
| |
|