From 612350ac19e050a873ac4c4c8e2a80353ba94539 Mon Sep 17 00:00:00 2001 From: whintersnow0 Date: Mon, 13 Oct 2025 16:42:31 +0200 Subject: [PATCH] fix: race condition in getUserData database update --- src/main/services/user/get-user-data.ts | 95 +++++++++++++------------ 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/src/main/services/user/get-user-data.ts b/src/main/services/user/get-user-data.ts index d26c995d..6bf3fffc 100644 --- a/src/main/services/user/get-user-data.ts +++ b/src/main/services/user/get-user-data.ts @@ -8,58 +8,65 @@ import { levelKeys } from "@main/level/sublevels"; export const getUserData = async () => { return HydraApi.get(`/profile/me`) .then(async (me) => { - db.get(levelKeys.user, { valueEncoding: "json" }).then( - (user) => { - return db.put( - levelKeys.user, - { - ...user, - id: me.id, - displayName: me.displayName, - profileImageUrl: me.profileImageUrl, - backgroundImageUrl: me.backgroundImageUrl, - subscription: me.subscription, - }, - { valueEncoding: "json" } - ); - } - ); - + try { + const user = await db.get(levelKeys.user, { + valueEncoding: "json", + }); + await db.put( + levelKeys.user, + { + ...user, + id: me.id, + displayName: me.displayName, + profileImageUrl: me.profileImageUrl, + backgroundImageUrl: me.backgroundImageUrl, + subscription: me.subscription, + }, + { valueEncoding: "json" } + ); + } catch (error) { + logger.error("Failed to update user in DB", error); + } return me; }) .catch(async (err) => { if (err instanceof UserNotLoggedInError) { return null; } - logger.error("Failed to get logged user"); - const loggedUser = await db.get(levelKeys.user, { - valueEncoding: "json", - }); + logger.error("Failed to get logged user", err); - if (loggedUser) { - return { - ...loggedUser, - username: "", - bio: "", - email: null, - profileVisibility: "PUBLIC" as ProfileVisibility, - quirks: { - backupsPerGameLimit: 0, - }, - subscription: loggedUser.subscription - ? { - id: loggedUser.subscription.id, - status: loggedUser.subscription.status, - plan: { - id: loggedUser.subscription.plan.id, - name: loggedUser.subscription.plan.name, - }, - expiresAt: loggedUser.subscription.expiresAt, - } - : null, - featurebaseJwt: "", - } as UserDetails; + try { + const loggedUser = await db.get(levelKeys.user, { + valueEncoding: "json", + }); + + if (loggedUser) { + return { + ...loggedUser, + username: "", + bio: "", + email: null, + profileVisibility: "PUBLIC" as ProfileVisibility, + quirks: { + backupsPerGameLimit: 0, + }, + subscription: loggedUser.subscription + ? { + id: loggedUser.subscription.id, + status: loggedUser.subscription.status, + plan: { + id: loggedUser.subscription.plan.id, + name: loggedUser.subscription.plan.name, + }, + expiresAt: loggedUser.subscription.expiresAt, + } + : null, + featurebaseJwt: "", + } as UserDetails; + } + } catch (dbError) { + logger.error("Failed to read user from DB", dbError); } return null;